Unix网络编程中常用的IO模型有四种,分别为
- Blocking IO - 阻塞IO
- NoneBlocking IO - 非阻塞IO
- IO multiplexing - IO多路复用
- asynchronous IO - 异步IO
网络IO,是application的进程发起一个请求,在kernel内核中组织好数据。当数据准备好后,kernel将数据从系统缓冲区复制到用户空间,application才能继续处理。
Blocking IO - 阻塞IO
在linux中,默认情况下所有的socket都是blocking。
kernel在准备数据的阶段,用户进程被阻塞。等kernel返回结果,用户进程才解除block的状态,重新运行。
NoneBlockingIO - 非阻塞IO
当用户进程发出系统调用后,如果kernel中的数据还没有准备好,那么它并不会block用户进程,而是立刻返回一个结果(no datagram ready)。用户进程得知数据还没有准备好后,它可以每隔一段时间再次发送请求。当kernel中的数据准备好了,并且又再次收到了用户进程的system call,那么它马上就将数据拷贝到了用户内存,然后返回。
IO multiplexing - IO多路复用
多路复用可以等待多个数据就绪,相当于一个代理,可代理多个请求。用户进程请求代理之后,进程被代理阻塞,此时代理会监听kernel的状态,如果其中一个进程需要的数据就绪就返回。
asynchronous IO - 异步IO
用户进程发起的请求,会通知内核进行操作,并将数据拷贝至进程中。完成之后,再通知进程整个操作全部完成(绑定一个回调函数处理数据)。
Unix网络编程常用四种IO模型,包括阻塞IO、非阻塞IO、IO多路复用和异步IO。网络IO需进程发起请求,内核组织数据并复制到用户空间。阻塞IO中用户进程在数据准备阶段被阻塞;非阻塞IO若数据未准备好会立刻返回;IO多路复用可代理多请求;异步IO完成操作后通知进程。
1089

被折叠的 条评论
为什么被折叠?



