最近在折腾服务器框架相关问题,学了东西不记下来很快会忘记……html
OS的I/O流程是这样的:python
在这个从CPU发出调用到收到完成标志的过程当中就存在一个时间差,如今就有了两个重要的概念:完成标志与时间差。服务器
因此有这样的定义:多线程
I/O控制方式有哪几种?
1)阻塞I/O(blocking I/O)
2)非阻塞I/O (nonblocking I/O)--> 轮询
3) I/O复用(select 和poll) (I/O multiplexing)
4)信号驱动I/O (signal driven I/O (SIGIO))
5)异步I/O (asynchronous I/O (the POSIX aio_functions)) --> 回调
看图便于理解:
出自:Linux的五种I/O模式并发
下面咱们谈谈服务器,服务器模型也能够基于异步、同步、阻塞、非阻塞这四个概念框架
须要注意的是对于高并发的程序每每采用“同步非阻塞”而不是“多线程的同步阻塞”,在合理设计任务调度的不一样阶段可以使得并发数远大于并行数,须要注意的是在高并发情况下为每一个任务建立一个线程的开销很大,因此并不采用多线程的同步阻塞。异步
并发:同时进行的任务数量
并行:可同时工做的物理资源(CPU核数等等)async
另外,有个概念是异步IO,其主要是说在同一线程中当遭遇IO时,并不等待而是执行下面的操做直到IO操做完成后再切回当前,其实就是同步非阻塞,在廖雪峰老师的博客中提到这样一个模型:
异步IO模型须要一个消息循环,在消息循环中,主线程不断地重复“读取消息-处理消息”这一过程:高并发
loop = get_event_loop() while True: event = loop.get_event() process_event(event)
消息模型其实早在应用在桌面应用程序中了。一个GUI程序的主线程就负责不停地读取消息并处理消息。全部的键盘、鼠标等消息都被发送到GUI程序的消息队列中,而后由GUI程序的主线程处理。oop
因为GUI线程处理键盘、鼠标等消息的速度很是快,因此用户感受不到延迟。某些时候,GUI线程在一个消息处理的过程当中遇到问题致使一次消息处理时间过长,此时,用户会感受到整个GUI程序中止响应了,敲键盘、点鼠标都没有反应。这种状况说明在消息模型中,处理一个消息必须很是迅速,不然,主线程将没法及时处理消息队列中的其余消息,致使程序看上去中止响应。
消息模型是如何解决同步IO必须等待IO操做这一问题的呢?当遇到IO操做时,代码只负责发出IO请求,不等待IO结果,而后直接结束本轮消息处理,进入下一轮消息处理过程。当IO操做完成后,将收到一条“IO完成”的消息,处理该消息时就能够直接获取IO操做结果。
在“发出IO请求”到收到“IO完成”的这段时间里,同步IO模型下,主线程只能挂起,但异步IO模型下,主线程并无休息,而是在消息循环中继续处理其余消息。这样,在异步IO模型下,一个线程就能够同时处理多个IO请求,而且没有切换线程的操做。对于大多数IO密集型的应用程序,使用异步IO将大大提高系统的多任务处理能力。