您的当前位置:首页正文

Linux高性能WebServer服务器之程序框架

2024-11-24 来源:个人技术集锦

秋招对我好点!!!

服务器可以被解构为以下是三个部分:

  • 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);

阻塞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指的是后两者

两种高效的事件处理方式

Reactor模式

Reactor模式

显示全文