5种IO模型
Linux下五种IO模型
(1)阻塞I/O:什么都不干,导致应用程序阻塞,等待数据准备好,如果数据没有准备好,一直阻塞,等数据准备好了从内核拷贝到用户空间
(2)非阻塞I/O:把一个套接字接口设置为非阻塞,告诉内核,当所请求的IO无法完成时,不要将进程睡眠,而是返回一个错误,这样IO操作函数会不断地测试数据是否准备好,如果没有准备好 ,继续测试,直到准备好为止
(3)I/O复用(select epoll):select或epoll会使进程阻塞,但是和阻塞IO不同的是,这两个函数可以同时阻塞多个IO操作,而且同时对多个读操作,多个写操作IO函数进行检测,直到有数据可读或者可写
(4)信号驱动I/O(SIGIO):
(5)异步I/O(posix):只发起IO事件
总结:前四种都叫做同步IO
共同点:
数据一旦就绪必须由自己进行阻塞式的读写
不同点:
等待的方式不同
第五个是异步IO
不参与等待和数据搬迁,只进行发起IO动作
信号量的同步与此处同步不一样
之前的同步在多进程多线程访问临界资源的时候的顺序
同步IO与异步IO的区别:数据访问的时候是否进行阻塞
阻塞IO与非阻塞IO的区别:应用程序 调用是否立即返回
同步与异步
(1)同步与异步关注的是消息 通信机制,所谓同步就是发出一个调用的时候,没有得到结果之前,该调用就不返回 ,但是一旦调用返回,就得到返回值了,换句话说就是由调用者主动等待这个调用的结果
例如普通B/S模式(同步):提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事
(2)异步则是在调用发生之后用发生后,调用者不会立刻得到调用结果,实际处理这个调用的部件在 完成后,通过状态,通知和回调来处理调用者
阻塞与非阻塞(主要针对服务器端)
阻塞调用:是指调用结果返回之前,当前线程会挂起,调用线程只有得到结果之后才会返回。
非阻塞调用:是指不能立刻得到调用结果,该调用不会阻塞当前线程。
同步与异步(主要针对 客户端)
同步:客户端调用一个功能,在该功能没有结束之前处于死等的状态
异步:客户端调用一个功能,不知道 该功能的结果,该功能有结果后会 主动通知客户端
原文地址:http://10808695.blog.51cto.com/10798695/1833067