秋招对我好点!!!
服务器可以被解构为以下是三个部分:
其中,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);
阻塞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是否阻塞。
也就是说
小结: