进程通过内核缓存区请求设备I/O的一些事情

  • 请求进程,内核缓存区,设备I/O
请求进程无法直接访问设备I/O,而是通过内核缓冲区提交请求数据,等数据就绪后,数据从设备缓冲区提交至进程空间

请求进程把数据提交给内核缓存空间需要等待,内核把数据复制给设备I/O,直到数据就绪,还需要等待,这些等待过程大致可以分为五种模式

  1. blocking I/O----阻塞式I/O
  2. NON blocking I/O----非阻塞式I/O
  3. I/O multiplexing----I/O多路复用
  4. 信号驱动I/O
  5. 异步I/O
一个进程要处理两个I/O就必须复用,负责完成不了处理,一个进程处理两个链接,处理多个文件描述符,处理多个请求;一个进程处理一个请求时也得需要I/O多路复用,因为可能涉及本地交互式输入(本地磁盘I/O),网络交互式输入(网络I/O)

所谓阻塞:任务完成前只能等待

非阻塞:任务完成前,可以接着干别的事情

异步非阻塞(上图)数据从设备I/O复制到内核缓存的过程中,请求处于非阻塞状态,不断轮询内核缓存空间数据是否就绪,实际上降低了性能,尚不如同步阻塞I/O

所谓异步同步指的是对结果是否就绪的了解程度-----等待请求直到就绪谓之同步(一直监控并等待请求结果就绪;也称之闲等),不知道何时就绪,不断轮询是否就绪谓之异步(忙等)

原文地址:https://www.cnblogs.com/saintdingspage/p/11029526.html

时间: 2024-10-16 06:04:49

进程通过内核缓存区请求设备I/O的一些事情的相关文章

在内核中异步请求设备固件firmware的测试代码

static void ghost_load_firmware_callback(const struct firmware *fw, void *context) { if(fw){ printk("firmware size=%d\n", fw->size); }else{ printk("failed to load firmware\n"); } } void ghost_load_firmware(char *name) { int error; e

Linux内核工程导论——用户空间进程使用内核资源

本文大部分转载和组装,只是觉得这些知识应该放到一起比较好. 进程系统资源的使用原理 大部分进程通过glibc申请使用内存,但是glibc也是一个应用程序库,它最终也是要调用操作系统的内存管理接口来使用内存.大部分情况下,glibc对用户和操作系统是透明的,所以直接观察操作系统记录的进程对内存的使用情况有很大的帮助.但是glibc自己的实现也是有问题的,所以太特殊情况下追究进程的内存使用也要考虑glibc的因素.其他操作系统资源使用情况则可以直接通过proc文件系统查看. 进程所需要的系统资源种类

缓存网络请求的结果

显然在某些情况下我们很希望减少移动设备和网络的交互次数,这就需要使用iOS的内存缓存了.代码基本上没有什么需要解释的地方,注意不要乱缓存,注意根据需要清理缓存即可. 1 //构建请求 2 NSURL *url = [NSURL URLWithString:@"http://218.241.17.106/webService/configService.asmx/GetNewCarInfo?CarID=1"]; 3 NSURLCache *urlCache = [NSURLCache s

调优5(SGA其他缓存区调整)

第五章 SGA其他缓存区调整 一.redo log buffer 1.redo log 的功能1)Sever 进程在buffer cache修改数据块后,Oracle提倡'先记后写',对修改的数据块的改变生成log entries(日志条目),将日志条目按顺序写入log buffer:而对于脏块 先链接到检查点队列,等待dbwr 进程写入到datafile2) 进程会及时的将其按顺序写入到redo log files.(日志条目的数据块大小一般和操作系统数据块大小一致,在Unix 和linux

笔记:Spring Cloud Hystrix 异常处理、缓存和请求合并

异常处理 在 HystrixCommand 实现的run方法中抛出异常,除了 HystrixBadRequestException之外,其他异常均会被Hystrix 认为命令执行失败并触发服务降级处理逻辑,所以当需要在命令中执行抛出不触发降级的异常时使用他,在使用注解配置实现 Hystrix 命令时,支持忽略指定异常类型功能,只需要通过设置 @HystrixCommand 注册的 ignoreException 参数,示例代码如下: @HystrixCommand (ignoreExceptio

刷新缓存区方式和刷新内存到磁盘方式总结。

首先聊这个话题,我们先了解两个函数: 1.printf函数 2.write函数 一.首先了解缓冲区的概念,Linux下的缓冲区分为以下三种: 1.全缓冲,顾名思义,除非你主动刷新缓冲区,不然只能等到缓冲区满,才能刷新缓冲区.比如写入磁盘. 2.行缓冲,当遇到'\n'时,刷新缓冲区,比如 C库函数. 3.无缓冲,接受多少给多少,比如stderr. 今天主要讲述的是行缓冲,如果想在不使用'\n'的情况下刷新缓存区,有下列手段-- 1.fflush()函数. 函数原型:int fflush(FILE

带标准IO带缓存区和非标准IO 遇到fork是的情况分析

废话不多说 直接代码 #include<stdio.h> #include<sys/types.h> #include<unistd.h> #include<stdlib.h> int globvar = 88; char buf[] = "a write to stdout\n"; int main() { int var = 10; pid_t pid ; //write 该函数是不带缓冲区的非标准函数 if(write(STDOUT

IntelliJ IDEA修改Output输出缓存区大小【应对:too much output to process】

IntelliJ IDEA默认的Output输出缓存区大小只有1024KB,超过大小限制的就会被清除,而且还会显示[too much output to process],可通过如下配置界面进行修改(Settings→Editor→Console),单位为KB 如果需要禁用缓存区大小限制就需要修改配置文件idea.properties 配置文件中原有设置: #---------------------------------------------------------------------

ACM/ICPC 之 优先级队列+设置IO缓存区(TSH OJ-Schedule(任务调度))

一个裸的优先级队列(最大堆)题,但也有其他普通队列的做法.这道题我做了两天,结果发现是输入输出太过频繁,一直只能A掉55%的数据,其他都是TLE,如果将输入输出的数据放入缓存区,然后满区输出,可以将IO时间消耗降到很低. 任务调度(Schedule) 描述 某高性能计算集群(HPC cluster)采用的任务调度器与众不同.为简化起见,假定该集群不支持多任务同时执行,故同一时刻只有单个任务处于执行状态.初始状态下,每个任务都由称作优先级数的一个整数指定优先级,该数值越小优先级越高:若优先级数相等