linux 标准IO缓冲机制探究
来源:互联网 发布:影楼后期软件 编辑:程序博客网 时间:2024/05/17 23:21
一、什么是缓存I/O(Buffered I/O)
缓存I/O又被称作标准I/O,大多数文件系统默认I/O操作都是缓存I/O。在Linux的缓存I/O机制中,操作系统会将I/O的数据缓存在文件系统的页缓存(page cache)中,也就是说,数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间。
1.缓存I/O有以下优点:
A.缓存I/O使用了操作系统内核缓冲区,在一定程度上分离了应用程序空间和实际的物理设备。
B.缓存I/O可以减少读盘的次数,从而提高性能
当应用程序尝试读取某块数据的时候,如果这块数据已经存放在页缓存中,那么这块数据就可以立即返回给应用程序,而不需要经过实际的物理读盘操作。当然,如果数据在应用程序读取之前并未被存放在页缓存中,那么就需要先将数据从磁盘读到页缓存中去。对于写操作来说,应用程序也会将数据先写到页缓存中去,数据是否被立即写到磁盘上去取决于应用程序所采用的写操作机制:如果用户采用的是同步写机制,那么数据会立即被写回到磁盘上,应用程序会一直等到数据被写完为止;如果用户采用的是延迟写机制,那么应用程序就完全不需要等到数据全部被 写回到磁盘,数据只要被写到页缓存中去就可以了。在延迟写机制的情况下,操作系统会定期地将放在页缓存中的数据刷到磁盘上。与异步写机制不同的是,延迟写机制在数据完全写到磁盘上得时候不会通知应用程序,而异步写机制在数据完全写到磁盘上得时候是会返回给应用程序的。所以延迟写机制本省是存在数据丢失的风险的,而异步写机制则不会有这方面的担心。
2.缓存I/O的缺点
在缓存I/O机制中,DMA方式可以将数据直接从磁盘读到页缓存中,或者将数据从页缓存直接写回到磁盘上,而不能直接在应用程序地址空间和磁盘之间进行数据传输,这样的话,数据在传输过程中需要在应用程序地址空间和页缓存之间进行多次数据拷贝操作,这些数据拷贝操作说带来的cpu以及内存开销是非常大的。
二、文件指针
FILE指针:每个被使用的文件都在内存中开辟一个区域,用来存放文件的有关信息,这些信息是保存在一个结构体类型的变量中,该结构体类型是由系统定义的,取名为FILE。
标准I/O库的所有操作都是围绕流(stream)来进行的,在标准I/O中,流用FILE *来描叙的。
其在Linux操作系统中的定义:
从以上我们可以看出,标准I/O并不是一开始就分配的,只有进行了输入或者输出的操作才进行分配的,标准输入和标准输出默认是全缓冲,但是如果和终端关了就是行缓冲。可以看到在linux操作系统中行缓冲的大小是1k,全缓冲的大小是4k。
三、行缓冲、全缓冲、不缓冲的定义
1.Fully buffered means that I/O takes place only when the buffer is fully, the process explicitly calls fflush, or the process terminates by calling exit. A common size for the standard I/O buffer is 4096 bytes;
2. Line buffered means that I/O takes place when a newline is encountered, when the process calls fflush, or when the process terminates by calling exit.
3. Unbuffered means that I/O take place each time a standard I/O output function is called.
Most unix implementations of the standard I/O libarary use the following rules.
1. Standard error is always unbuffered.
2. Standard input and standard output are fully buffered, unless they refer to a terminal device, in which case, they are line buffered.
3. All other streams are fully buffered unless they refer to a terminal device,
in which case, they are line buffered.
四、一步步探究
- #include <stdio.h>
- int stream_attribute(FILE *fp)
- {
- if(fp->_flags & _IO_UNBUFFERED)
- {
- printf("The IO type is unbuffered\n");
- }else if(fp->_flags & _IO_LINE_BUF){
- printf("The IO type is line buf\n");
- }else{
- printf("The IO type is full buf\n");
- }
- printf("The IO size : %d\n",fp->_IO_buf_end - fp->_IO_buf_base);
- return 0;
- }
- int main()
- {
- FILE *fp;
- stream_attribute(stdin);
- printf("___________________________________\n\n");
- stream_attribute(stdout);
- printf("___________________________________\n\n");
- stream_attribute(stderr);
- printf("___________________________________\n\n");
- if((fp = fopen("test.txt","w+")) == NULL)
- {
- perror("fail to fopen");
- }
- stream_attribute(fp);
- return 0;
- }
运行结果:
我们修改一下代码再看
- #include <stdio.h>
- int stream_attribute(FILE *fp)
- {
- if(fp->_flags & _IO_UNBUFFERED)
- {
- printf("The IO type is unbuffered\n");
- }else if(fp->_flags & _IO_LINE_BUF){
- printf("The IO type is line buf\n");
- }else{
- printf("The IO type is full buf\n");
- }
- printf("The IO size : %d\n",fp->_IO_buf_end - fp->_IO_buf_base);
- return 0;
- }
- int main()
- {
- FILE *fp;
- getchar();
- stream_attribute(stdin);
- printf("___________________________________\n\n");
- stream_attribute(stdout);
- printf("___________________________________\n\n");
- stream_attribute(stderr);
- printf("___________________________________\n\n");
- if((fp = fopen("test.txt","w+")) == NULL)
- {
- perror("fail to fopen");
- }
- printf("before write:\n");
- stream_attribute(fp);
- fputc('a',fp);
- printf("after write:\n");
- stream_attribute(fp);
- return 0;
- }
运行结果:
从以上我们可以看出,标准I/O并不是一开始就分配的,只有进行了输入或者输出的操作才进行分配的,标准输入和标准输出默认是全缓冲,但是如果和终端关了就是行缓冲。可以看到在linux操作系统中行缓冲的大小是1k,全缓冲的大小是4k。
0
上一篇:linux 进程(二) --- 进程的创建及相关api
下一篇:进程间同步---system v ipc 对象信号灯集
相关热门文章
- linux 常见服务端口
- xmanager 2.0 for linux配置
- 【ROOTFS搭建】busybox的httpd...
- openwrt中luci学习笔记
- 什么是shell
- linux dhcp peizhi roc
- 关于Unix文件的软链接
- 求教这个命令什么意思,我是新...
- sed -e "/grep/d" 是什么意思...
- 谁能够帮我解决LINUX 2.6 10...
给主人留下些什么吧!~~
评论热议
0 0
- linux 标准IO缓冲机制探究
- linux 标准IO缓冲机制探究
- linux 标准IO缓冲机制探究
- linux 标准IO缓冲机制探究
- linux 标准IO缓冲机制探究
- Linux 标准IO库 全缓冲、行缓冲、无缓冲
- 标准IO与linux系统IO的缓冲问题
- UNIX里面关于标准IO的几种缓冲机制
- 标准IO库的缓冲机制引起的问题
- 标准IO缓冲
- Linux Advance--打印标准IO流缓冲状态信息
- 标准IO缓冲详解 全缓冲 行缓冲 不缓冲
- 标准IO缓冲详解全缓冲、行缓冲、不缓冲
- 标准IO缓冲详解全缓冲、行缓冲、不缓冲
- 标准IO缓冲详解全缓冲、行缓冲、不缓冲
- Linux 标准IO带缓冲 ,read,write函数不带缓冲
- 标准I/O缓冲机制
- 标准IO缓存机制
- 进程间通信---共享内存
- E: 软件包 atom 需要重新安装,但是我无法找到相应的安装文件。
- Ubuntu安装磁共振处理软件Fsl步骤
- 进程间通信--信号(进程间通信唯一的异步方式)
- linux 进程(二) --- 进程的创建及相关api
- linux 标准IO缓冲机制探究
- 进程间同步---system v ipc 对象信号灯集
- Linux 原始套接字--myping的实现
- u-boot启动完全分析
- ssh框架整合实例
- linux网络编程——套接字(socket)入门
- samba移植到android流程
- boa服务移植到安卓手机
- GitHub 上 iOS 开源库 Top 100
原创粉丝点击
热门IT博客
热门问题
老师的惩罚
人脸识别
我在镇武司摸鱼那些年
重生之率土为王
我在大康的咸鱼生活
盘龙之生命进化
天生仙种
凡人之先天五行
春回大明朝
姑娘不必设防,我是瞎子
人身上有猫跳蚤怎么办
肛瘘长肉芽怎么办
顺产侧切长肉芽怎么办
泰迪不拉屎怎么办
狗狗吃自己大便怎么办
误食老鼠屎怎么办
腌肉生蛆怎么办
咸肉长蛆怎么办?
养殖场怎么办手续
长明灯灭了怎么办
电脑wps打不开怎么办
小孩疝气怎么办
小孩子疝气怎么办
有了痘印怎么办
脸颊有痘印怎么办
脸上都是黑痘印怎么办
官员调动家属怎么办
膻中按压疼怎么办
象牙带脏了怎么办
觉得活着没意思怎么办
久坐前列腺疼痛怎么办
脂肪瘤摸着会疼怎么办
腹部脂肪瘤疼痛怎么办
胸口很多脂肪瘤怎么办
白头粉刺怎么办
眼袋红肿疼痛怎么办
眼球红肿疼痛怎么办
眼睛赘皮怎么办
眉毛洗完变红色怎么办
额头太矮怎么办
搬家日忌安床怎么办
黄历忌安床怎么办
忌安床时安床了怎么办
好多字不认识怎么办
一个字不认识怎么办
不认识的汉字怎么办
孩子不认识数字怎么办
不会整理房间怎么办
不认识繁体字怎么办
不会读拼音怎么办
孩子不认识拼音怎么办