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

秋招对我好点!!!

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

  • 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指的是后两者
    5种I/O模型

两种高效的事件处理方式

Reactor模式

Reactor模式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值