web serveer

Web Server (网页服务器)

一个网络服务器就是一个服务器软件(程序),或者是运行这个服务器软件的硬件(计算机)。其主要功能是通过HTTP协议与客户端(通常是浏览器(浏览器)进行通信,来接收,存储,处理来自客户端的HTTP请求并对其请求做出HTTP响应,返回给客户端其请求的内容(文件、网页等)或返回一个错误信息。
在这里插入图片描述

通常用户使用浏览器与相应服务器进行通信.在浏览器中键入“域名”或“IP地址:端口号”,浏览器则先将你的域名解析成相应的IP地址或者直接根据你的IP地址向对应的Web服务器发送一个HTTP请求。这一过程首先要通过tcp协议的三次握手建立与目标协议的三次握手建立与目标服务器的连接,然后HTTP协议生成针对目标协议生成针对目标服务器的HTTP请求报文,通过tcp、IP等协议发送到目标Web服务器上。

HTTP请求报文格式

在这里插入图片描述

HTTP请求报文格式

在这里插入图片描述

Reactor模式

要求主线程(I/O处理单元)只负责监听文件描江符上是否有事件发生,有的话就立即将该事件通知工作线程(逻辑单元),将Socket可读可写事件放入请求队列,交给工作线程处理.除此之外,主线程不做任何其他实质性的
工作.读写数据,接受新的连接,以及处理客户请求均在工作线程中完成.
使用同步I/O模拟(以epoll_wait为例)实现的反应器模式的工作流程是:
1.主线程往epoll内核事件表中注册套接字上的读就绪事件.
2.主线程调用epoll_wait等待wocket上有数据可读.
3.当套接字上有数据可读时,epoll_wait通知主线程。主线程则将Socket可读事件放入请求队列.
4.睡眠在请求队列上的某个工作线程被唤醒,它从Socket读取数据,并处理客户请求,然后往EPOLL内核事件表中注册该Socket上的写就绪事件.
5.当主线程调用epoll_wait等待Socket可写
6.当套接字可写时,epoll_wait通知主线程。主线程将Socket可写事件放入请求队列.
7.睡眠在请求队列上的某个工作线程被唤醒,它往Socket上写入服务器处理客户请求的结果.

在这里插入图片描述

线程池

线程池是由服务器预先创建的一组子线程,线程池中的线程数量应该和cpu数量差不多.线程池中的所有子线程都运行着相同的代码.当有新的任务到来时,主线程将通过某种方式选择线程池中的某一个子线程来为之服务.相
比与动态的创建子线程,选择一个已经存在的子线程的代价显然要小得多.至于主线程选择哪个子线程来为新任务服务,则有多种方式:

主线程使用某种算法来主动选择子线程.最简单、最常用的算法是随机算法和RoundRobin(轮流选取)算)法,但更优秀、更智能的算法将使任务在各个工作线程中更均匀地分配,从而减轻服务器的整体压力.主线程和所有子线程通过一个共享的工作队列来同步,子线程都睡眠在该工作队列上.当有新的任务到来时,
主线程将任务添加到工作队列中.这将唤醒正在等待任务的子线程,不过只有一个子线程将获得新任务的“接管权“,它可以从工作队列中取出任务并执行之,而其他子线程将继续睡眠在工作队列上.

线程池的一般模型为:
在这里插入图片描述

1.单例模式 初始化日志系统 单独调度线程
2.创建线程池,信号量进行线程的锁定
3.创建套接字,绑定ip地址和端口号,监听套接字
4.创建epoll模型,创建事件,将监听套接字epoll_ctl加入epoll
5.epoll_wait 等待事件触发,遍历事件数组,查询如果触发事件为监听fd 则开始接受接受,并重新创建一个connfd 用于收发数据 并加入epoll中 等待是否有事件到来 用connfd作为下标放入http_conn类型数组,用于定位该请求
6.读取数据 放入 所对应请求的m_read_buf中 加入事件到工作队列中,触发信号 释放线程池中的一个线程 用于执行
7.解析http请求,读取一行,判断请求行 请求头 请求体,状态机 进行解析 读取客户端请求 解析到类内部各个成员
8.根据解析请求 返回状态 发送给客户端 对应的资源 或者提示的结果

由于非活跃连接占用了连接资源,严重影响服务器的性能,通过实现一个服务器定时器,处理这种非活跃连接,释放连接资源。利用alarm函数周期性地触发SIGALRM信号,该信号的信号处理函数利用管道通知主循环执行定时器链表上的定时任务.
将管道的fd加入epoll 一旦有sigalrm信号发送,epoll_wait就会收到 然后执行链表定时任务tick();

统一事件源
基于升序链表的定时器
处理非活动连接

压测
20000客户端 5秒 效果不太行。。。
在这里插入图片描述

项目地址

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值