四、I/O管理
(1)同步、异步区别?阻塞、非阻塞区别?
同步、异步: 1. 同步是指在发起一个调用之后,调用者需要一直等待调用结果的通知,才能进行后续的操作; 2. 异步是指在发起一个调用之后,调用者不能立即得到调用结果的返回,需要被调用者通过状态、通知和回调来通知调用者。 //需要注意的是,同步/异步强调的是消息通信机制。
阻塞、非阻塞: 1. 阻塞是指在发起一个调用之后,在消息返回之前,当前进(线)程会被挂起,直到有消息返回,当前进程才会被激活; 2. 非阻塞是指在发起一个调用之后,不会阻塞当前进程,而会立即返回。 //需要注意的是,阻塞/非阻塞强调的是等待消息时的状态。
(2)Linux的I/O模型包含哪五种?各自有什么特点?
1. 阻塞IO:调用者调用了某个函数,等待这个函数返回,期间什么也不做,不停的去检查这个函数有没有返回,必须等这个函数返回才能进行下一步动作。 2. 非阻塞IO:非阻塞等待,每隔一段时间就去检测IO事件是否就绪。没有就绪就可以做其他事。 3. 信号驱动IO:Linux用套接口进行信号驱动IO,安装一个信号处理函数,进程继续运行并不阻塞,当IO时间就绪,进程收到SIGIO信号。然后处理IO事件。 4. IO复用/多路转接IO:linux用select/poll函数实现IO复用模型,这两个函数也会使进程阻塞,但是和阻塞IO所不同的是这两个函数可以同时阻塞多个IO操作。而且可以同时对多个读操作、写操作的IO函数进行检测。知道有数据可读或可写时,才真正调用IO操作函数。 5.异步IO:Linux中,可以调用aio_read函数告诉内核描述字缓冲区指针和缓冲区的大小、文件偏移及通知的方式,然后立即返回,当内核将数据拷贝到缓冲区后,再通知应用程序。
- 同步I/O
- 阻塞I/O:进程保持阻塞状态,直到数据拷贝完成;
- 非阻塞I/O:轮询检查内核数据,直到数据准备好,再拷贝数据到进程,进行数据处理;需要注意的是,拷贝数据的过程中,进程依然是阻塞装填;
- 多路复用I/O:进程调用
select
、poll
、epoll
函数,保持阻塞状态,但与阻塞I/O不同的是,这些函数可以同时处理多个I/O;
- 信号驱动I/O:首先建立一个信号处理函数,进程继续运行并不阻塞,当数据准备好时,进程会收到一个
SIGIO
信号,可以在信号处理函数中处理数据;
- 异步I/O:在发起一个调用之后,调用者不能立即得到调用结果的返回,需要被调用者通过状态、通知和回调来通知调用者。
这五种模型的比较如下图所示:
(3)说一说异步编程的事件循环
事件循环就是不停循环等待时间的发生,然后将这个事件的所有处理器,以及它们订阅这个事件的时间顺序依次执行。当这个事件的所有处理器都被执行完毕之后,事件循环就会开始继续等待下一个事件的触发,不断往复。 当同时并发地处理多个请求时,以上的概念也是正确的,可以这样理解:在单个的线程中,事件处理器是一个一个按顺序执行的。即如果某个事件绑定了两个处理器,那么第二个处理器会在第一个处理器执行完毕后,才开始执行。在这个事件的所有处理器都执行完毕之前,事件循环不会去检查是否有新的事件触发。在单个线程中,一切都是有顺序地一个一个地执行的。
(4)SPOOLing技术
为了缓和CPU的高速性与I/O设备低速性之间的矛盾,引入了假脱机技术。 引入输入井和输出井,输入井和输出井是指在磁盘开辟出的两个存储区域。 //输入井模拟脱机输入时的磁盘,用于收容I/O设备输入的数据。 //输出井模拟脱机输出时的磁盘,用于收容用户程序的输出数据。 在SPOOLing技术下,CPU要打印机打印的数据可以先输出到磁盘的输出井中(这个过程由输出进程控制),然后做其他的事情。若打印机此时被占用,则SPOOLing系统就会把这个打印请求挂在等待队列上,待打印机有空时再把数据打印出来。向磁盘输出数据的速度比向打印机输出数据的速度快,因此就节省了时间。 应用:共享打印机 SPOOLinge技术的特点:提高了I/O的速度;将独占设备改造为共享设备;实现了虚拟设备功能。 以空间换取时间的技术