文章目录
- 1.http项目
- 2. 协议栈
- 3. cpp语法
- 4.Http项目
- 5.提问
- 6.总结
人事面
自我介绍
科技竞赛 比赛项目 社团
C++数据类型:整数 浮点数 字符 布尔 枚举 结构体 联合体 指针【引用 类 stl库】
最近与团队职业合作的经历
时间管理【回答的不合适!】
优势劣势
技术面
1.http项目
-
全局默认port参数的意义:提供默认port + 命令行参数传端口
-
**线程池能容纳多少线程?**回答:没测试过。
【任务复杂度 任务类型 OS限制】
理论:ulimit -u == 6751;实际4362
每个线程的堆栈大小 ulimit -s == 8192KB;8MB
计算密集型任务:线程数建议接近或等于 CPU 核心数。
I/O 密集型任务:线程数可以大于核心数(如 核心数 * 2),以提高并发 -
**c++线程库怎么传类对象给启动例程函数?**回答:不会,不理解。(没复习C++线程库)
指针或std::ref;其余均只能影响线程栈中的值
-
#paragma once和#ifndef。
#pragma once
和#ifndef
是两种用于防止头文件被重复包含的机制。【严格需要跨平台兼容:#ifndef;简洁高效,大多数编译器都已经支持:#paragma once】
#pragma once
:1. 简洁明了;2. 编译器处理效率更高,避免多次解析头文件。3. 不属于标准 C++,主流编译器(如 GCC、Clang、MSVC)都支持。
#ifndef
通过预处理宏条件防止重复包含。1. 标准化,跨平台兼容性兼容性更强。2. 容易出现宏名冲突或拼写错误。
2. 协议栈
-
tcp三次握手。回答的不错。
-
listen第二个参数
面试官坚持listen的第二个参数backlog是半连接队列长度+1,我坚持是全连接队列,但他一直坚持,之后我说我记错了,之后查资料,就是全连接队列。
拓展
Linux:
/proc/sys/net/core/somaxconn
默认值通常是 128。我的是1024.超过
backlog
的连接会被拒绝:如果队列已满,新的连接可能会被丢弃(发送 RST)。若
backlog
设置为 0 或负数,系统会使用默认值(具体依赖于操作系统)
3. cpp语法
- RAII
RAII(Resource Acquisition Is Initialization),编程技术和设计模式。资源获取即是初始化,资源销毁即释放。资源(如内存、文件句柄、网络连接等)的分配和释放应该绑定到对象的生命周期上。
-
智能指针:类型,区别。
-
**unique_ptr传参。**回答:不会。(没懂面试官在问什么,我回答的是传引用,他说拷贝构造都禁用了怎么传–没懂)
传递
unique_ptr
的右值引用右值引用传递(std::unique_ptr&&),允许函数接收一个右值并移动所有权。
#include <iostream> #include <memory>void process(std::unique_ptr<int>&& ptr) {std::cout << "Value: " << *ptr << std::endl; }int main() {std::unique_ptr<int> myPtr = std::make_unique<int>(30);process(std::move(myPtr)); // 通过右值引用传递所有权// 此时 myPtr 不再拥有资源if (!myPtr) {std::cout << "myPtr is empty now." << std::endl;} }
-
通过第二个项目,讨论CS模式。服务器怎么判断客户端掉线。回答:客户端退出触发事件更改数据库字段,服务器检测;客户端退出断开网络连接,服务端直到对方关闭。
keep-live探测包
- 在 HTTP 中的 Keep-Alive 字段
在 HTTP/1.1 中,
Connection: keep-alive
是一个常见的头部字段,表示客户端希望在完成请求后保持连接活跃,以便于后续请求复用。默认情况下,HTTP/1.1 使用持久连接(即连接保持活动),而在 HTTP/1.0 中,通常每个请求都会打开一个新连接。客户端请求中的 Keep-Alive 头:
GET /index.html HTTP/1.1 Host: example.com Connection: keep-alive
服务器响应中的 Keep-Alive 头:
HTTP/1.1 200 OK Content-Type: text/html Connection: keep-alive Keep-Alive: timeout=5, max=100 // 设置连接空闲的最大时间为5秒 此连接最多发送 100 个请求
- 在 TCP 协议中的 Keep-Alive
检查长时间空闲的连接是否仍然有效的机制。通过定期发送小的数据包(也称为 Keep-Alive 探测包),如果没有收到响应,连接可以被认为是失效的。
-
操作系统级别:TCP Keep-Alive 设置通常位于操作系统的网络配置中。它通过配置 TCP 保活的时间、重试次数等参数来管理。
在 Linux 中,TCP Keep-Alive 的相关参数位于
/proc/sys/net/ipv4/
目录下,例如:tcp_keepalive_time
:连接空闲的时间(单位:秒),超过这个时间后会发送 Keep-Alive 包。tcp_keepalive_intvl
:两次 Keep-Alive 探测包之间的时间间隔(单位:秒)。tcp_keepalive_probes
:发送探测包的次数,直到连接被认为失效。
查看当前设置:
cat /proc/sys/net/ipv4/tcp_keepalive_time cat /proc/sys/net/ipv4/tcp_keepalive_intvl cat /proc/sys/net/ipv4/tcp_keepalive_probes
修改 Keep-Alive 设置:
sudo sysctl -w net.ipv4.tcp_keepalive_time=600 # 设置空闲时间为 600 秒 sudo sysctl -w net.ipv4.tcp_keepalive_intvl=60 # 设置探测包间隔为 60 秒 sudo sysctl -w net.ipv4.tcp_keepalive_probes=5 # 设置探测包发送次数为 5 次
-
STL容器
- vector的size和capacity区别。
- 尾插复杂度。【vector有finish指针,直接插;扩容不扩容】。中间插需要挪动数据。
- list插入复杂度。遍历+更改指针指向。
- map/set底层数据结构。红黑树和二叉树查找复杂度。
拓展:红黑树。演进:二叉树 二叉搜索/查找/排序树 平衡二叉树 AVL树,红黑树。
二叉树:查找、插入和删除的时间复杂度在最坏情况下可能是 O(n),没有平衡性保证。
自平衡的二叉查找树(Binary Search Tree, BST),它在插入和删除操作时通过一系列的旋转和颜色标记来维持树的平衡性。在每个节点上添加了一个颜色属性(红色或黑色),并通过一组严格的规则来保持树的平衡,从而保证操作的时间复杂度。
红黑树的性质:
- 每个节点是红色或黑色。
- 根节点是黑色。
- 叶子节点(NIL节点,空节点)是黑色。
- 如果一个节点是红色的,则其子节点必须是黑色的(即不能有两个连续的红色节点)。
- 从任一节点到其所有后代叶子节点的路径中,必须有相同数目的黑色节点。
- 新插入的节点总是红色的。
特点:
- 自平衡:高度始终保持在 O(log n) 以内,查找、插入和删除的最坏时间复杂度为 O(log n)。
- 性能:红黑树在插入和删除时会通过调整颜色和旋转来重新平衡,从而确保树的高度是对数级别,避免了退化成链表的情况。
4.Http项目
- cgi机制
CGI(Common Gateway Interface,通用网关接口)是一个标准化的协议,它允许 Web 服务器与外部程序(通常是脚本或应用程序)进行交互。CGI 是早期 Web 开发中常用的一种技术,尽管今天很多现代 Web 框架和语言(如 PHP、Node.js、Django)已经取代了 CGI,但它仍然是 Web 服务器与动态内容生成之间的桥梁。
- 进程间通信方式。命名管道可以在无血缘间进程使用。
5.提问
公司的业务,技术。
6.总结
数据类型
时间管理
线程池能创建多少线程?
c++的thread传类对象给例程函数方式
unique_ptr传参
keep-live字段