五种IO模型的小笔记
本次笔记主要是记录学习这五种IO模型时总是容易混淆或者忘记,如今我要理解它!记下它!学习资源来源:网络上各种文章、微信视频号【程序员老王Go】
------五种io模型------
—阻塞IO—:进程在发起IO请求到IO请求数据完成整个阶段内进程都处于阻塞状态。
—非阻塞IO—:进程在发起IO请求给内核处理,如果内核缓存中没有数据/数据没有准备好,就会立刻返回一个错误表明IO数据还没准备好,此时用户进程处于非阻塞状的一个状态,不会腾出CPU并且不断询问内核数据是否准备好了,如果内核缓存已经有了IO数据则内核会将缓存中的IO数据拷贝给用户进程,此时用户进程也处于阻塞状态。
—IO多路复用—:多个进程IO注册在一个select上,然后专门以另外一个进程调用该select,如果注册的进程IO都没有数据到达只会阻塞调用select的进程,如果有一个进程IO数据已经ready了,select就会立即返回并且通知相应的进程来读取数据。
—信号驱动IO—:当进程发起IO操作会向内核注册一个信号处理函数,然后进程返回不阻塞,继续执行其他的处理操作(应用程序没有被IO操作所阻塞),当内核IO数据准备就绪时就会发出一个信号给进程,进程便在信号处理函数调用IO来处理数据。
—异步IO—:当进程发起一个IO操作,进程会立刻返回不阻塞也不会返回结果,当内核把整个IO处理完成后会通知进程结果
其中阻塞IO、非阻塞IO、IO多路复用、信号驱动IO都是同步IO模式,数据从内核空间拷贝到用户空间的时候进程都处于阻塞状态。
而异步IO是异步IO模式,用户进程和IO之间是完全异步的,各干各的,在IO数据从内核空间拷贝到用户空间的时候进程也不会阻塞,内核会通知进程处理完成。
其中IO多路复用又叫异步阻塞IO、信号驱动IO又叫异步非阻塞IO
是否阻塞:其实就是看进程是否会腾出CPU
同步/异步的定义:其实就是看进程调了一个方法/事件处理后要不要去等它返回结果后在执行后续操作