-
Notifications
You must be signed in to change notification settings - Fork 1.3k
聊一聊 Liunx下的 I O 模型
cxuan edited this page Sep 20, 2020
·
1 revision
I/O就是计算机内存与外部设备之间拷贝数据的过程。我们知道CPU访问内存的速度远远高于外部设备,因此CPU是先把外部设备的数据读到内存里,然后再进行处理。请考虑一下这个场景,当你的程序通过CPU向外部设备发出一个读指令时,数据从外部设备拷贝到内存往往需要一段时间,这个时候CPU没事干了,你的程序是主动把CPU让给别人?还是让CPU不停地查:数据到了吗、数据到了吗..
同步阻塞I/O:用户线程发起read调用后就阻塞了,让出CPU。内核等待网卡数据到来,把数据从网卡拷贝到内核空间,接着把数据拷贝到用户空间,再把用户线程叫醒
I/O多路复用:用户线程的读取操作分成两步了,线程先发起select调用,目的是问内核数据准备好了吗?等内核把数据准备好了,用户线程再发起read调用。在等待数据从内核空间拷贝到用户空间这段时间里,线程还是阻塞的。那为什么叫I/O多路复用呢?因为一次select调用可以向内核查多个数据通道(Channel)的状态,所以叫多路复用
windows真正做到了异步io,linux的异步io通过改进select为expoll实现异步 信号驱动用的少,就是应用程序注册一个信号,内核数据到了通知程序 阻塞和不阻塞是指内核到用户空间数据的拷贝过程应用程序是否在等待 同步和异步指read和write是否直接返回,即把数据给内核就返回就是异步