wordpress大型网站,巴中市城乡和住房建设局网站,网站建设管理规范,wordpress修改邮件模板公众号#xff1a;I/O异步与同步 我们的程序#xff0c;如果要对I/O设备进行操作#xff0c;比如通过一个socket发送数据#xff0c;文件的读写#xff0c;是怎么实现的呢#xff1f; 要知道#xff0c;为了保证系统安全以及抽象化#xff08;避免每个进程都需要对IO设… 公众号I/O异步与同步 我们的程序如果要对I/O设备进行操作比如通过一个socket发送数据文件的读写是怎么实现的呢 要知道为了保证系统安全以及抽象化避免每个进程都需要对IO设备进行编码进程是无法直接操作I/O设备的必须通过系统调用请求Kernal来协助完成I/O操作。 而在冯诺依曼架构下I/O操作往往特别慢为了降低延迟提高吞吐量以及数据处理速率内核就会为在内核空间每个I/O设备维护一个buffer。这样进程对内核请求时数据都通过内核buffer来交互而内核与I/O交互过程中I/O设备响应可能很慢所以内核必须等待IO设备将数据复制到内核空间中。 这样数据从I/O设备复制到内核空间内核需要进行一次等待进程从内核buffer中获取数据在内核缓冲区准备好之前进程也需要一次等待。根据等待模式的不同I/O模式分为五种 阻塞I/O (blocking I/O) 非阻塞I/O (nonblockong I/O) I/O复用 I/O (multiplexing) 信号驱动I/O (signal driven I/O) 异步I/O (Asynchronous I/O) 阻塞I/O 阻塞I/O执行的系统调用可能因为无法立刻完成导致被请求的进程被系统挂起直到I/O完成为止。比如connect发起连接时connect首先发送同步报文给服务器等待服务器返回确认报文。如果服务器的确认报文没有立即到达connect调用被系统挂起直到客户端收到确认报文并唤醒connect调用。 非阻塞I/O 非阻塞I/O允许进程在请求 I/O 操作后如果数据未准备好立即得到一个错误返回根据errno,通常是EWOULDBLOCK 或 EAGAIN对connect来说errno被设置为EINPROGRESS。这样进程可以继续执行其他任务不必阻塞等待 I/O 操作完成。 I/O复用 I/O复用允许单个进程同时等待多个I/O操作中的任何一个完成。通常通过 select(), poll(), 或 epoll() 系统调用实现。进程阻塞在这些调用上直到一个或多个 I/O 操作完成从而有效地监听多路 I/O 资源而不是只关注单一资源。 信号驱动 I/OSignal-driven I/O 信号驱动 I/O 模式中进程可以继续执行直到内核某个时刻准备好数据并通过发送信号通知进程。这种模式下进程不需要在调用期间阻塞也无需频繁检查数据是否可用。比较适合事件驱动模式减少轮询开销。 异步I/O(noblocking all the way(signal when I/O is completed) 异步 I/O 模式下进程发起 I/O 操作后可以立即执行后续指令不需等待 I/O 操作的完成。内核会在整个 I/O 操作完成后通知进程这包括数据从 I/O 设备复制到内核缓冲区以及从内核缓冲区复制到进程缓冲区的过程。如windows的IOCP模式。
总结 可以看出IO操作的时候进程可以等待IO操作完成同步也可以不等待IO完成直到内核完成后通知进程异步这就是同步和异步的区别。同步模型中进程可以阻塞等待IO完成也可以不阻塞而是通过轮询(如select)或者事件监听(如epoll)的方式来判断IO是否完成。 当然也可以通过数据从内核空间到用户空间的拷贝是操作系统自己完成的还是进程来操作来判断是同步还是异步。