C++秋招(暑期实习)准备---10--- 项目2 WebServer

基础知识:

1:浅谈同步与异步:

同步就是一个进程在执行某个请求时候,若该请求需要一段时间才能返回信息,那么这个进程就会一直等待下去,知道收到返回信息才继续执行。

异步就是进程不需要一直等待下去,而是继续执行下面的操作,不管其他进程的状态。当有消息返回时,系统会通知进程处理,这样可以提高效率。、

同步I/O模型要求用户代码自行执行I/O操作(将数据从内核缓冲区读入用户缓冲区,或者相反)

异步I/O模型则由内核来执行I/O操作,数据在内核缓冲区和用户缓冲区之间的移动是由内核在后台完成的。半同步/半异步模式中的同步:程序完全按照代码序列的顺序执行。同步线程处理客户逻辑。

半同步/半异步模式中的异步:程序的执行需要由系统事件来驱动,常见的系统事件包括中断、信号。异步线程处理I/O事件。

2:浅谈Reactor与Proactor:

  1. Reactor模式(通常同步I/O epoll_wait):主线程只负责监听文件描述符是否有事件发生,有的话就立刻将该事件通知工作线程,读写数据,接受新的连接,以及处理客户请求均在工作线程内完成
  2. Proactor模式(通常使用异步I/O aio_read,aio_write):所有I/O操作交给主线程和内核来处理,工作线程仅仅负责业务逻辑
  3. 使用同步I/O模型模拟proactor:主线程执行数据读写操作,读写完成后,主线程向工作线程通知这一“完成事件”。那么从工作线程角度来看,它们直接获取了数据读写的结果,接下来就是对读写的结果进行逻辑处理。

半同步/半反应堆模式

异步线程即主线程监听所有socket事件,如有可读事件发生,主线程接受并得到连接socket,然后往epoll内核事件表注册socket上的读写事件,一旦连接socket有读写事件发生,主线程将连接socket插入请求队列。所有工作线程睡眠在请求队列上通过竞争获取任务的接管权。

采用Reactor的模式,要求工作线程自己从socket上读区客户请求和往socket写入服务器应答。

缺点:

主线程和工作线程共享请求队列。主线程添加任务、工作线程取出任务都需要加锁保护,耗费cpu事件。一个工作线程只能处理一个客户的请求,如果客户数量很大,工作线程很少,请求队列就会堆积任务,如果增加工作线程,则工作线程的切换也耗费大量cpu时间。

请求队列就是服务器预先建立的、静态的、永久的TCP连接。通常被实现为池的一部分。

3:浅谈HTTP有限状态机

  1. 从状态机  解析buffer中的一个行 一旦读取到一个完整的行就将其交给主状态机处
    1. LINE_OK 完整读取一行
    2. LINE_BAD 报文语法错误
    3. LINE_OPEN 读取的行不完整
  2. 主状态机  解析请求行,分析头部字段
    1. CHECK_STATE_REQUESTLINE 请求解析行
    2. CHECK_STATE_HEADER 请求解析头(请求行与消息体存在一个空行)
    3. CHECK_STATE_CONTENT 解析消息体 仅用于解析POST请求

4:浅谈epoll_wait函数

#include <sys / epoll.h>
 
int epoll_wait(int epfd,struct epoll_event * events, int maxevents,int timeout);

该函数用于等待所监控文件描述符上有事件的产生,返回就绪的文件描述符个数。

events:用来存内核得到事件的集合

maxevents:告知内核events大小

timeout:超时事件

返回值:成功返回有多少文件描述符就绪

如果一个线程在对epoll_wait()的调用中被阻止时,另一个线程有可能向等待epoll实例添加文件描述符。如果新文件描述符准备就绪,它将导致epoll_wait()调用解除阻止。

5:浅谈线程池

6:浅谈select、poll、epoll    why epoll?

  1. 对于select和poll来说,都是将文件描述符拷贝到内核中,由内核检查是否有网络事件的发生,检查方式比较粗暴就是轮训并标记可读可写,然后将整个文件描述符集合拷贝到用户态,此时在用户态里面还是需要再一次遍历去寻找可读或这可写的文件描述符。poll就是问了链表代替动态数组,突破了select文件描述符个数的限制。
  2. epoll将整个文件描述符集合维护在内核中,每次添加文件描述符就执行一次系统调用,epoll底层通过红黑树来描述文件描述符集合,并且维护一个ready list,将事件表中已经就绪的事件就添加到这里(如果有活动产生,会自动触发epoll回调函数通知epoll文件描述符,然后内核将这些就绪的文件描述符放到ready list中等待epoll_wait调用),再使用epoll_wait调用,仅观察这list中有没有数据。 且epoll支持LT、ET
    1. LT 若该epoll事件没有被处理完,该事件还会被后续的epoll_wait()再次触发
    2. ET 发现有感兴趣的事件立即返回,并且sleep这一个事件的epoll_wait(),不管是否再次发生 (确保文件描述符是非阻塞的,并且每次调用read和write确保所有数据已读完和写完)
    3. EPOLLONESHOT 期望一个socket连接在任何一个时刻只能被一个线程处理,处理完后需要通过epoll_ctl重置epolloneshot事件

7:浅谈定时器

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值