[项目] C++高并发Web服务器+个人改进项目

[专栏]嵌入式软件校招笔记(点击跳转)

[知识点] 嵌入式软件开发知识点学习

[知识点] ARM指令集详解

[知识点] 通讯协议(very重要)

[项目] C++高并发Web服务器+个人改进项目详解

[八股] C/C++基础八股

[八股] C/C++进阶八股

[八股] 计算机网络八股

[八股] 操作系统八股

[八股] 嵌入式系统八股

[八股] Linux系统编程八股

[八股] Linux网络编程八股

秋招嵌入式企业面经

秋招项目面试问题进行总结

项目简历介绍:

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%内容,订阅专栏后可继续查看/也可单篇购买

嵌入式软件校招笔记 文章被收录于专栏

记录本人校招过程中遇到的问题及笔记整理!后续会持续更新

全部评论
mark
1 回复 分享
发布于 2023-10-26 16:29 安徽
码住
1 回复 分享
发布于 2023-10-27 23:01 山东
😀码住
点赞 回复 分享
发布于 2023-10-28 11:08 安徽
不错🤣
点赞 回复 分享
发布于 2023-10-28 11:33 安徽
Mark
点赞 回复 分享
发布于 2023-11-12 10:42 江苏
都一个多月了, 没了吗
点赞 回复 分享
发布于 2023-12-11 09:51 辽宁
怎么还没有上传呀?
点赞 回复 分享
发布于 02-25 19:23 吉林
点赞 回复 分享
发布于 03-25 15:55 陕西
我想问一下,为什么要封装内存池呀,项目当中也没有频繁的去调用new和delete呀?单纯的请教下,勿喷!😂
点赞 回复 分享
发布于 07-30 09:28 四川
请问订阅后会有项目源码和详细介绍吗
点赞 回复 分享
发布于 08-05 10:41 湖北
只有问题没有答案吗
点赞 回复 分享
发布于 08-14 21:43 安徽
里面有啥?有项目源码吗
点赞 回复 分享
发布于 11-18 19:01 江苏

相关推荐

10-25 17:21
已编辑
门头沟学院 游戏策划
点赞 评论 收藏
分享
一笑而过2222:啊!拷贝构造函数和赋值操作符的区别 拷贝构造函数用于创建一个新对象作为现有对象的副本,而赋值操作符用于将一个已存在对象的值赋给另一个已存在的对象。 啊!析构函数能不能被重载 析构函数不能被重载,每个类只能有一个析构函数。 啊!构造函数能不能被重载 构造函数可以被重载,允许使用相同的构造函数名但参数列表不同来创建多个构造函数。 啊!虚函数和一般函数的区别 虚函数用于实现多态,允许通过基类指针或引用调用派生类的函数;而一般函数不具备这种动态绑定的能力。 啊!引用和指针的区别 引用必须在声明时初始化且不能更改指向的对象,而指针可以在任何时候指向不同的对象,并且可以为 NULL。 啊!C++内存分区 C++内存分为四个主要区域:栈区、堆区、全局/静态存储区和代码区。 啊!堆区申请的内存没有被释放 如果堆区申请的内存没有被释放,会导致内存泄漏,程序运行时间越长,占用的内存越多,最终可能导致系统资源耗尽。 啊!介绍几种常见的 STL 常见的 STL(标准模板库)组件包括:vector(动态数组)、list(双向链表)、map(键值对集合)、set(唯一元素集合)、queue(队列)、stack(栈)等。
点赞 评论 收藏
分享
投票
思源电气 bms软开 无责任底薪19.2万年包不低于25,公积金2500
点赞 评论 收藏
分享
6 67 评论
分享
牛客网
牛客企业服务