C++web服务器开发

C++web服务器开发

1. 首先介绍一下这个项目;这个项目是通过C++11编写的web服务器,模型为Reactor+非阻塞I/O(epoll作为I/O多路复用实现方式)+线程池,支持get、head请求,支持HTTP长连接,并实现了优雅关闭连接。

I/O多路复用是什么技术呢? I/O多路复用(multiplexing)的本质是通过一种机制(系统内核缓冲I/O数据),让单个进程可以监视多个文件描述符,一旦某个描述符就绪(一般是读就绪或写就绪),能够通知程序进行相应的读写操作。(包括select、poll、epoll)

文件描述符 文件描述符(File descriptor)是计算机科学中的一个术语,是一个用于表述指向文件的引用的抽象化概念。
文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。在程序设计中,一些涉及底层的程序编写往往会围绕着文件描述符展开。但是文件描述符这一概念往往只适用于UNIX、Linux这样的操作系统。

select、poll和epoll的区别 select函数只能轮询linux操作系统提供的fd_set这个类型的变量,poll函数轮询的是pollfd这个类型的数组,这个数组可以自己定义长度,而不是上面select函数只能轮询定长为FD_SETSIZE的fd_set变量。epoll不再是轮询,而是给每个文件描述符上发生的io事件设置一个回调函数。

2.定时器是怎么实现的?还有什么实现方式?
定时器用来处理超时的请求和长时间不活跃的连接,使用stl里的priority_queue,基于小根堆的定时器关闭超时请求,并采用惰性删除的方式,时间的到来不会唤醒线程,而是每次循环的最后进行检查,如果超时了再删,因为这里对超时的要求并不会很高,如果此时线程忙,那么检查时间队列的间隔也会短,如果不忙,也给了超时请求更长的等待时间。还可以使用STL中的set。

3.实现一个无锁队列? 用原子操作

4.eventfd是什么?有什么好处?
eventfd是系统提供的一个轻量级的进程间通信的系统调用,eventfd实现了线程的异步唤醒(eventfd()会返回一个文件描述符,如果该进程被fork的时候,这个文件描述符也会复制过去,这时候就会有多个的文件描述符指向同一个eventfd对象)

5.双缓冲区异步日志是什么?为什么要这样做?对这个日志系统有没有进行压力测试?
基本思路是准备两块buffer:A和B, 前端负责往buffer A填数据(日志消息), 后端负责将buffer B的数据写入文件;当buffer A写满之后, 交换A和B, 让后端将buffer A的数据写入文件, 而前端则往buffer B填入新的日志消息, 如此往复。
好处:前端不是将一条条日志消息分别送给后端,而是将多条日志消息拼接成一个大的buffer传送给后端,相当于批处理,减少了线程唤醒的开销。

6.什么是优雅关闭连接?
就是read()到0,要透明的传递这个行为而不是直接暴力close()

7.epoll的边沿触发(et)和水平触发(lt)有什么区别? lt模式下,默认不可读,只有epoll通知你可读才是可读,否则不可读。
et模式下,默认可读。你可以随便读,直到发生EAGAIN。可读时读和不读,怎么读都由你自己决定,中间epoll不管。
EAGAIN后不可读了,等到再次可读,epoll会再通知一次。
ET模式要比LE复杂许多,它对用户提出了更高的要求,即每次读,必须读到不能再读(出现EAGAIN),每次写,写到不能再写(出现EAGAIN)。而LT则简单的多,可以选择也这样做,也可以为编程方便,比如每次只read一次(muduo就是这样做的,这样可以减少系统调用次数)。

8.epoll为什么高效,相比select和poll

  1. 减少了用户态和内核态之间的文件描述符拷贝
  2. 减少了对就绪文件描述符的遍历

9.假如服务器要升级,又不想让用户感觉到服务器升级了,该怎么做?
不间断的提供服务,参考nginx的平滑升级

10.Reactor模式是什么?
反应器设计模式(Reactor pattern)是一种为处理并发服务请求,并将请求提交到一个或
者多个服务处理程序的事件设计模式。当客户端请求抵达后,服务处理程序使用多路分配策略,由一个非阻塞的线程来接收所有的请求,然后派发这些请求至相关的工作线程进行处理。

  • 7
    点赞
  • 86
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
C语言是一种高效的编程语言,而Web服务器是一个常见的网络应用程序。在Web服务器开发中,C语言可以被用来开发高性能的程序。实际上,许多流行的Web服务器,如Apache和Nginx,都是用C语言编写的。因此,Web服务器开发实战项目可以用C语言进行实现。 在Web服务器开发实践项目中,C语言可以被用来处理网络协议、管理线程、提高服务器性能以及开发插件。这些功能对于一个高效的Web服务器来说非常重要。 网络协议处理是Web服务器的一项核心功能。服务器需要能够识别不同的协议,如HTTP、FTP、SMTP等,并能够为客户端提供相应的服务。使用C语言可以提高服务器的处理速度和效率。 Web服务器需要能够同时处理多个客户端请求。线程是实现服务器并发处理的重要手段。使用C语言可以在服务器中实现线程,从而实现高并发的客户端请求处理。 提高服务器性能是Web服务器开发的另一个重要方面。C语言可以通过优化算法、使用高效的数据结构和编写高效的代码来提高服务器性能。 插件的开发是实现Web服务器灵活性的另一种方法。使用C语言可以编写高性能的插件,从而为服务器添加各种功能模块。 总之,C语言是Web服务器开发实战项目中不可或缺的一部分。使用C语言能够让开发者实现高效、高性能的Web服务器,从而满足不同场景下的需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值