IO知识基础篇(3) -内核空间、用户空间、五种IO模型

本文将介绍IO的模型及相关知识,包括以下几点:

  • 内核空间、用户空间、系统调用的概念
  • 用户进程的IO过程
  • IO就绪的概念
  • 五种IO模型:
  1. 阻塞式IO
  2. 非阻塞IO
  3. I/O复用
  4. 信号驱动式I/O
  5. 异步I/O(AIO)

一 内核空间、用户空间、系统调用的概念

        操作系统为了确保自己的内核程序运行的安全,以及防止用户进程直接访问硬件造成破坏,把进程空间分为用户空间和内核空间,系统程序运行在内核空间,用户进程只能运行在用户空间里,并且不能直接访问硬件,需要通过系统调用,从而执行操作系统提供的相关程序(可执行cpu的特权指令)间接地访问硬件.

 

二 用户进程的IO过程

        当一个用户进程需要从硬盘的文件中读取数据时,需要执行系统调用open打开文件,操作系统要做的操作是在内核空间创建一个结构体,结构体中存有文件的信息以及包含有存放数据的缓冲区,然后将这个结构体的地址作为文件句柄(FileDescriptor, 下面简称FD)返回给用户进程.

        用户进程获取到文件的句柄后,可以执行IO读写操作相关的系统调用,如read/write系统调用.例如,当用户进程执行read系统调用时,系统通过硬盘驱动程序的读指令向硬件发送读数据的命令,将外存的数据搬进内核缓冲区(这个过程的低层实现就是本系列第一篇文章中介绍的DMA方式了),然后再把内核缓冲区的数据搬到用户区.反之,write系统调用时,系统会将用户区的数据先搬到内核缓冲区,然后再将其搬往外存.

 

三 读就绪状态和写就绪状态

1 读就绪状态■[正确性] 内核缓冲区中数据字节数大于等于用户进程请求读的字节数,此时系统可以将内核缓冲区的数据搬到用户缓冲区.

2  写就绪状态■[正确性] 内核缓冲区中剩余字节空间数(空闲空间)大于等于用户进程请求写的字节数,此时系统可以将用户缓冲区的数据搬往内核缓冲区.

 

        也就是说一个读或写的过程,首先要经历一个读/写的就绪状态,读/写就绪后,才进行"真正"的IO,读就绪后,系统才能将内核缓冲区的数据搬到用户缓冲区;写就绪后,系统才能将用户缓冲区的数据搬往内核缓冲区.

 

四 五种IO模型

         现代操作系统往往提供多种方式的IO系统调用供用户在不同情形下使用,下面介绍在UNIX网络编程》中抽象和总结出来的五种IO模型.

 

阻塞式IO

最普通的I/O模型;原生的read/write系统调用,默认是阻塞模式;导致进程阻塞在read/write系统调用直到IO完成

非阻塞IO

这种方式通过指定系统调用read/write的参数为非阻塞,告知内核IO没就绪时,不阻塞进程,而是返回一个错误码,应用进程死循环轮询,直到IO就绪,注意IO就绪后进程仍要阻塞以等待内核缓冲区的数据拷备到用户区(读)或反之(写),只是等待IO就绪的阶段,进程不用阻塞在read/write系统调用,而是要对IO是否就绪状态进行轮询.

I/O复用

如linux系统提供的select/poll,进程通过将一个或多个FD传递给select或poll系统调用,阻塞在select系统调用,而不需要请求进程自己轮询IO状态;这样select/poll可以帮我们侦测许多fd是否就绪;当操作系统的select调用侦测到某些FD对应的IO就绪后,进程不再在Select调用阻塞,而是可以开始IO操作,在IO操作过程中("真正"的读或写)进程仍然阻塞在read/write系统调用以等待内核缓冲区的数据拷备到用户区(读)或反之(写)

信号驱动式I/O

请求进程可以通过系统调用向系统发送想要进行IO操作的信号,这个过程不阻塞,内核在FD描述符就绪时发送SIGIO信号通知回请求的进程,告知请求进程IO操作已就绪. 进程通过信号处理函数接收数据,接收数据时,仍要阻塞在read/write系统调用,以等待内核缓冲区与用户缓冲区之间的数据拷备

 

异步I/O(AIO)

 通过系统调用告知内核某个IO操作并立即返回,并让内核自动进行整个IO操作,包括将数据复制到用户的进程缓冲区(读)或反之(写),完成后再通知用户进程。这种模型和信号驱动式I/O模型区别在于:信号驱动式I/O由内核通知我们何时可以启动一个I/O操作,而异步I/O模型是内核通知我们I/O操作何时完成。整个IO过程中,请求进程都不用阻塞.

 

6 总结图示:

 

 

上面的带箭头的线表示IO请求进程的阻塞过程,真正的IO过程有两个阶段: 阶段一: 读写的系统调用到IO就绪阶段 和阶段二: IO就绪到内核数据搬到用户区(或反之)阶段,从上图可以看出,只有异步IO不会导致请求进程被阻塞,所以才称之为异步,另外四种IO模型都是同步IO

        进程的阻塞和IO的阻塞概念要区别开来,非阻塞IO只是指请求进程在IO系统调用时(注意不包括select调用,只是指读写的系统调用)不用阻塞在阶段一,阶段二还是要阻塞的.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值