[项目] C++高并发Web服务器+个人改进项目
[专栏]嵌入式软件校招笔记(点击跳转)
秋招项目面试问题进行总结
项目简历介绍:
Webserver项目是用C++实现的高性能WEB服务器,我在双核2G的云服务器ESC上部署(阿里云ESC服务器大学生可以免费申请一个低配的,把本地项目部署在上面很简单的,写到简历上很加分,面试经常被问到这个云服务器)经过webbench压力测试可以实现上万的QPS;
其中功能主要实现了浏览器访问服务器,获取服务器资源的功能。项目总体的框架采用的是单Reactor多线程模型。在主线程里通过IO多路复用监听多个事件。主线程只负责监听文件描述符上是否有事件发生,有的话就立即将该事件通知工作线程,将 socket 可读可写事件放入请求队列,交给工作线程处理。对于到达的HTTP报文,采用了有限状态机和正则表达式进行解析,资源的响应则通过集中写和内存映射的方式进行传输。最后加入日志模块实现服务器日常运行情况的记录。
项目内容:
在Linux系统下开发的WEB服务器,使用线程池+IO复用Epoll的方式实现了高并发,经过webbench压力测试可以实现上万的QPS。
主要功能:
1、 利用IO复用技术Epoll与线程池实现多线程的Reactor高并发模型;
2、 使用基于TCP协议的Socket实现客户端和服务端的网络通信;
3、 利用标准库容器封装char,实现自动增长的缓冲区;
4、 利用正则与状态机解析HTTP请求报文,实现处理静态资源的请求;
5、 利用数据库连接池,减少数据库连接建立与关闭的开销,同时实现了用户注册登录功能;
6、 利用单例模式与阻塞队列实现异步的日志系统,记录服务器运行状态;
项目链接:这个我之前是跟着牛客上一个课程学的,现在好像收费了,不过B站还是有很多的,毕竟Webserver烂大街了,虽然但是呢,其实面试官也都清楚,所以简历中的项目最重要的是你自己的想法和改进!!就比如上面项目功能第3点利用标准库容器封装char,实现自动增长的缓冲区;我自己在网上找的帖子改进的,封装了一个内存池,在介绍项目的时候着重介绍自己的改进,面试官大多数对这个感兴趣。
面试常见问题:
一、基本的技术问题:
1、有没有用到线程池? 为什么使用线程池? 线程池如何实现?(非常重要的恶魔三问)
2、线程的设置的数量是多少?你为什么这样设置?多线程中线程越多越好吗?
3、单Reactor多线程epoll模型的工作流程,多线程是怎么分配任务的?
4、线程池里面的有没有死锁的情况呢
5、线程池工作队列的大小是多少?
6、你的线程池工作线程处理完一个任务后的状态是什么?线程池中的工作线程是一直等待吗?
7、如果同时1000个客户端进行访问请求,线程数不多,怎么能及时响应处理每一个呢?
8、如果一个客户请求需要占
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
记录本人校招过程中遇到的问题及笔记整理!后续会持续更新