高性能服务器程序框架
秋招对我好点!!!
服务器可以被解构为以下是三个部分:
- I/O处理单元
- 逻辑单元
- 存储单元
其中,I/O处理单元是服务器管理连接的模块,它需要等待并接受新的客户连接,接受客户数据,将服务器相应数据返回到客户端;逻辑单元分析并处理客户数据,然后将结果传递给I/O处理单元,或者直接传递给客户端(这取决于事件处理模式);网络存储单元可以是数据库、缓存和文件。
I/O 处理单元
I/O模型
socket在创建的时候默认是阻塞的,但是给socket系统调用的第二个参数传递SOCK_NONBLOCK标志,或者通过fcntl系统调用的F_SETFL将其设为非阻塞。
1. open时,使用O_NONBLOCK;
2. 通过fcntl系统调用的F_SETFL
fcntl(fd, F_SETFL, flag|O_NONBLOCK);
socket的含义就是两个应用程序通过一个双向的通信连接实现数据的交换,连接的一段就是一个socket,又称为套接字。套接字用于描述IP地址和端口,是一个通信链的句柄。应用程序通过套接字向网络发出请求或应答网络请求。
阻塞I/O与非阻塞I/O
- 针对阻塞I/O执行的系统调用可能因为无法立即完成被操作系统挂起,知道等待的事情发生为止
- 针对非阻塞I/O执行的系统调用则总是立即返回,不管事件是否发生。如果事件没有发生,则系统调用会返回-1,与出错情况一样,此时我们必须根据errno来区分这两种情况。
显然,在事件已经发生的情况下操作非阻塞I/O才能提高程序的效率。
I/O复用作为一个通知机制,经常与非阻塞I/O一起使用。其中,I/O复用本身是阻塞的,它们能提高效率的原因是在于它们能够同时监听多个I/O事件
同步I/O与异步I/O
从理论上看,阻塞I/O 、I/O 复用和信号驱动I/O都是同步I/O,原因是I/O的读写操作都在I/O发生之后,由应用程序来完成。而异步I/O则由内核用户直接执行读写操作,并会立即返回,无论I/O是否阻塞。
也就是说
- 同步I/O 模型要求用户代码自行执行I/O 操作(向应用程序通知就绪事件)
- 异步I/O 则是由内核来完成(向应用程序通知完成事件)
小结:
- IO有内存IO、网络IO和磁盘IO三种,通常我们说的IO指的是后两者