导图社区 LinuxIO
这是一篇关于LinuxIO的思维导图,主要内容包括:同步与异步、阻塞与非阻塞,IO具体在做什么事情,异步IO,信号驱动IO,IO多路复用,同步非阻塞IO模型,同步阻塞IO模型。
这是一篇关于go语言IO的思维导图,主要内容包括:IO标准库拓扑,文件系统,IO操作。IO操作本质就是Input和Output,输入和输出,读取和写入。
社区模板帮助中心,点此进入>>
互联网9大思维
组织架构-单商户商城webAPP 思维导图。
域控上线
python思维导图
css
CSS
计算机操作系统思维导图
计算机组成原理
IMX6UL(A7)
考试学情分析系统
LinuxIO
IO具体在做什么事情
当用户进行一个文件读取请求时候
1.磁盘数据通过DMA直接写入内核缓冲区(不需要CPU参与)
2.将文件从内存缓冲区复制到用户缓冲区(需要CPU参与)
需要内核拷贝2次数据,进行2次的用户态/内核态切换转换
同步与异步、阻塞与非阻塞
阻塞
调用者发起IO请求后,必须等待IO操作完成或是发生错误才能执行后续代码,在此期间,调用者会被挂起处于等待状态直到数据传输完毕
非阻塞
调用者发起IO请求后,非阻塞IO在IO条件未就绪的情况下并不会挂起调用者,此时立即返回eagin状态,使调用者能决定后续的处理
阻塞/非阻塞:关注的是 调用者是否等待 I/O 完成(是否被挂起)
同步
指IO操作的执行过程就包含在本次的IO调用中,调用者拿到的是最终的数据,无论是成功的数据还是返回的错误
异步
触发的IO调用并不包含IO的执行过程,调用者发起的IO请求只是一个IO提交的过程,调用函数返回并不是IO操作完成,而在异步执行IO,后续通过某个机制,比如回调函数等,在未来某个时刻获取本次IO的执行结果
同步/异步:关注的是 I/O 操作的执行方式
同步阻塞IO模型
当用户程序进行IO请求时候,进程阻塞住,无法执行后续逻辑,等待IO完成后,才可以进行后续逻辑
一个进程/线程只能处理一个IO
linux的文件读取大多都是同步阻塞IO模型
优点:模型简单,易实现 缺点:在高并发场景下,需创建大量线程/进程,导致资源浪费
同步非阻塞IO模型
当用户程序进行IO请求的时候,内核立即返回eagin状态,用户端可以轮询的区查询内核的状态,直到成功为止,这个过程中用户进行并不会停止,任然执行着后续逻辑
优点:程序不用进行阻塞,等待的同时用户程序可以执行其他逻辑 缺点:频繁轮询会占用大量 CPU 资源
IO多路复用
一个进程/线程不在是只能处理一个IO,用户进行可以通过IO多路复用同时监听多个IO事件,当IO事件准备就绪时,进行可以进行IO的处理,虽然同一时间依然只能处理一个,但是一段时间内可以处理多个,达到了并发的效果
一个进程/线程可以处理多个IO
优点:提高了机器的IO能力,一个进程可以处理更多的IO 缺点:实现较为复杂
信号驱动IO
让内核在文件描述符的数据就绪时候向用户程序发送信号,从而避免了进程对IO数据准备的持续等待。
用户程序通过sigaction系统调用注册一个信号处理函数,并与文件描述符关联起来,当文件描述符IO事件就绪时候,内核给用户程序发送一个信号,用户程序在信号处理函数中执行IO操作
优点:程序不用进行阻塞,等待的同时用户程序可以执行其他逻辑 缺点:实现复杂,用户需要自己实现信号的接收逻辑,且大量IO发生时,信号处理会带来性能问题
异步IO
当用户程序进行IO请求时候,只是提交一个IO任务交给内核,不用阻塞和轮询查询,当内核IO操作完成后触发回调函数,通知用户程序IO已经完成
优点:异步IO可以做到IO请求聚合,然后批量交给内核处理,大幅提高并发能力 缺点:部分系统(如早期 Linux)的异步 I/O 实现不完善,需依赖线程池模拟