Linux网络编程基础之Reactor模式和Proactor模式
在Linux平台下的服务器开发中,如何去构建高性能的网络通信框架是重中之重,自然就绕不开网络通信模型的选择和应用;目前网络通信模型中涉及到的模式有两个:Reactor模式和Proactor模式。 在介绍这两个模式之前,先详细地阐述下阻塞IO、非阻塞IO、同步、异步的概念,因为经常有很多同学能把这些词汇编出各种奇怪的组合出来,连自己都不知道是什么意思。 阻塞IO:当应用层发起read请求时,发出read请求的线程会被挂起,直到操作系统完成数据从内核区到应用层缓冲区的拷贝,read调用才返回;write操作也是一样。 非阻塞IO:当应用层发起read请求,而操作系统没有准备好数据,read调用会立刻返回;同时操作系统会返回一个EWOULDBLOCK的错误码。但发起read请求的线程会不断地去询问操作系统“数据准备好了吗?”,如果准备好了,那么就把数据从内核空间拷贝到应用层缓冲区。 上面就是阻塞IO和非阻塞IO,但是有一点需要说明,在操作系统把数据准备好,并把数据拷贝出来的过程是同步的,也就是说必须要拷贝完,read才会返回。所以同步/异步是用于形容数据从内核空间拷贝到应用程序缓冲区的过程。 同步:当操作系统内核准备好数据,应用程序发出read请求,数据的拷贝是和read函数同步进行的,如果数据较多,那么read调用的耗时会较长。 异步:当应用程序发出***aio_read***请求后