i/o缓冲区、内核缓冲区
展开全部
1、缓冲区数据交换
用户进程是运行在用户空间的,不能直接操作内核缓冲区的数据。 用户进程进行系统调用的时候,会由用户态切换到内核态,待内核处理完之后再返回用户态。例如:read把数据从内核缓冲区复制到进程i/o缓冲区,write把数据从进程i/o缓冲区复制到内核缓冲区,内核缓冲区再和磁盘之间的交换。
程序和磁盘交换细节
用户i/o缓冲区的类型:
全缓冲
此种类型的缓冲只有在缓冲区满的时候才会调用实际的文件 IO 进入内核态操作。除了涉及到终端设备文件的流,其它文件流默认基本都是全缓冲。
行缓冲
此种类型的缓冲在缓冲区满或者遇到 \n 的时候才会调用实际的文件 IO 进入内核态操作。当流涉及到终端设备的时候就是行缓冲,比如标准输入流和标准输出流。如果对标准输入流或者输出流进行重定向到某个文件的时候,该流就是全缓冲的。
无缓冲
没有缓冲区。直接调用文件 IO 进入内核态操作。标准错误流默认就是无缓冲的。
2、下边举一个例子加深理解:
每个进程都有一个标准i/o缓冲,缓冲区是使用malloc申请的,所以缓冲区是在堆区
#include <stdio.h>
#include <stdlib.h>
int main() {
for (int i = 0; i < 2; i++) {
fork();
printf("*");
}
return 0;
}
i=0时:主进程子进程都会在各自的缓冲区输入一个*,
i=1时:新创建的两个进程会从父进程复制缓冲区,会继承下来一个*,自己在往缓冲区塞一个*,因此各自都有两个*。同时i=0时创建的两个进程也会往各自的缓冲区塞一个*。这时各个进程的缓冲区都有两个*,所以一共8个*。
用户进程是运行在用户空间的,不能直接操作内核缓冲区的数据。 用户进程进行系统调用的时候,会由用户态切换到内核态,待内核处理完之后再返回用户态。例如:read把数据从内核缓冲区复制到进程i/o缓冲区,write把数据从进程i/o缓冲区复制到内核缓冲区,内核缓冲区再和磁盘之间的交换。
程序和磁盘交换细节
用户i/o缓冲区的类型:
全缓冲
此种类型的缓冲只有在缓冲区满的时候才会调用实际的文件 IO 进入内核态操作。除了涉及到终端设备文件的流,其它文件流默认基本都是全缓冲。
行缓冲
此种类型的缓冲在缓冲区满或者遇到 \n 的时候才会调用实际的文件 IO 进入内核态操作。当流涉及到终端设备的时候就是行缓冲,比如标准输入流和标准输出流。如果对标准输入流或者输出流进行重定向到某个文件的时候,该流就是全缓冲的。
无缓冲
没有缓冲区。直接调用文件 IO 进入内核态操作。标准错误流默认就是无缓冲的。
2、下边举一个例子加深理解:
每个进程都有一个标准i/o缓冲,缓冲区是使用malloc申请的,所以缓冲区是在堆区
#include <stdio.h>
#include <stdlib.h>
int main() {
for (int i = 0; i < 2; i++) {
fork();
printf("*");
}
return 0;
}
i=0时:主进程子进程都会在各自的缓冲区输入一个*,
i=1时:新创建的两个进程会从父进程复制缓冲区,会继承下来一个*,自己在往缓冲区塞一个*,因此各自都有两个*。同时i=0时创建的两个进程也会往各自的缓冲区塞一个*。这时各个进程的缓冲区都有两个*,所以一共8个*。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
Storm代理
2023-08-29 广告
2023-08-29 广告
"StormProxies是全球大数据IP资源服务商,其住宅代理网络由真实的家庭住宅IP组成,可为企业或个人提供满足各种场景的代理产品。点击免费测试(注册即送1G流量)StormProxies有哪些优势?1、IP+端口提取形式,不限带宽,I...
点击进入详情页
本回答由Storm代理提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询