八股文
自我介绍
毕业时间
有参加哪些比赛没有
学的专业,学的什么语言,专业怎么样,年级排名
static和const的区别?以及static的作用还有吗
static内存在哪,我说data和bss,他问哪个区,原来是静态存储区啊,全局变量我也没答出来哪个区
static函数存在代码段,static修饰的局部和全局变量都在静态存储区(静态存储区也叫全局存储区
内存四区是指:栈区,堆区,全局区,代码区。)
static修饰成员函数的时候改变了C++的哪些特性?
const修饰类的成员函数的时候在前面修饰和在后面修饰有什么区别
const修饰类的成员函数时,返回的是左值还是右值
c++三大特性,举例说明
构造函数和析构的定义作用
执行顺序,成员对象什么时候构造
构造函数可以定义为虚函数吗
引用和指针的区别
引用在创建和销毁的时候是否会调用析构函数(我答成浅拷贝了,草)
引用可以重复赋值吗
new,delete,malloc,free区别
malloc申请的在哪个区
堆和栈区别
栈溢出原因
进程和线程的区别
进程通信方式,讲一下他们的含义
别人的面经
HTTP请求结构?
请求行 请求头 请求体 ,其中get可以携带数据但是规定不携带
get post 区别
GET和POST两种基本请求方法的区别 - 在途中# - 博客园 (cnblogs.com)
GET产生一个TCP数据包;POST产生两个TCP数据包。POST得跑两趟,第一趟,先去和服务器打个招呼“我一会要来”,然后再回头把数据送过去。
HTTP底层基于什么协议?
TCP/IP
UDP和TCP区别是什么?
TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付
TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
TCP首部开销20字节;UDP的首部开销小,只有8个字节
TCP要求的系统资源较多,UDP较少
TCP如何保证可靠传输的?
校验和 序列号 确认应答 超时重传 流量控制 拥塞控制
time wait状态了解么?为什么要有这个状态?
确保被动方正确关闭 丢弃历史数据包
select和epoll的区别?
-
对于select和poll来说,所有文件描述符都是在用户态被加入其文件描述符集合的,每次调用都需要将整个集合拷贝到内核态;epoll则将整个文件描述符集合维护在内核态,每次添加文件描述符的时候都需要执行一个系统调用。系统调用的开销是很大的,而且在有很多短期活跃连接的情况下,epoll可能会慢于select和poll由于这些大量的系统调用开销。
-
select使用线性表描述文件描述符集合,文件描述符有上限;poll使用链表来描述;epoll底层通过红黑树来描述,并且维护一个ready list,将事件表中已经就绪的事件添加到这里,在使用epoll_wait调用时,仅观察这个list中有没有数据即可。
-
select和poll的最大开销来自内核判断是否有文件描述符就绪这一过程:每次执行select或poll调用时,它们会采用遍历的方式,遍历整个文件描述符集合去判断各个文件描述符是否有活动;epoll则不需要去以这种方式检查,当有活动产生时,会自动触发epoll回调函数通知epoll文件描述符,然后内核将这些就绪的文件描述符放到之前提到的ready list中等待epoll_wait调用后被处理。
-
select和poll都只能工作在相对低效的LT模式下,而epoll同时支持LT和ET模式。
-
综上,当监测的fd数量较小,且各个fd都很活跃的情况下,建议使用select和poll;当监听的fd数量较多,且单位时间仅部分fd活跃的情况下,使用epoll会明显提升性能。
reactor模式解决了什么问题?(游双)
reactor可以解决promise场景下的问题,而且解决方案更加优雅,并形成标准。
- reactor是一种编程模式,与面向对象编程是一个级别的,他的存在是为了解决具体的某一类问题,但又不是解决特定问题的(能简单说一下面向对象编程解决什么问题吗?);简单来说reactor模式关注的是对数据的处理,把一坨数据通过各种操作符号转换为另一坨数据;数据在处理过程中又支持各种异步处理,支持对异步处理的结果进行编排,同时编程风格上推崇链式,所以看上去代码干净一些
- 上面一点里的
支持对异步结果的编排
顺手解决异步编程模式下,的回调地狱问题(与promise一样)
promise顶多算一种设计模式,而reactor是一种编程风格
了解proactor模式吗?说说和reactor模式的区别
Reactor模式:要求主线程(I/O处理单元)只负责监听文件描述符上是否有事件发生(可读、可写),若有,则立即通知工作线程,将socket可读可写事件放入请求队列,读写数据、接受新连接及处理客户请求均在工作线程中完成。(需要区别读和写事件)
Proactor模式:主线程和内核负责处理读写数据、接受新连接等I/O操作,工作线程仅负责业务逻辑(给予相应的返回url),如处理客户请求。
进程和线程的区别说一说
资源分配基本单位,独立的地址空间,一对多线程,进程间崩溃互不影响,切换开销大
调度和执行基本单位,共享地址空间,多对一进程,线程崩溃进程崩溃,切换开销小
进程中的数据段包含的内容有什么?
内存分为内核区和用户区(PCB在内核区)
(6条消息) Linux虚拟地址空间与文件描述符_梅山剑客的博客-CSDN博客
进程实体 = 代码段+数据段+PCB
虚拟内存的原理?操作系统在内存映射中做了什么方面的工作?
为什么要用虚拟内存:有些作业很大或者,有大量作业,这时内存不足。物理上扩充增加成本,所以进行逻辑上扩充。
实现方法:基于局部性原理,使用请求分页系统或者,请求分段系统
好处:允许一个作业分多次装入内存
内存映射:虚拟地址转换成物理地址(去内存里找物理地址,如果不在就缺页中断去外存里找,找到了就置换(页面置换算法)内存里的页面)
分页机制(包括页命中、页异常、页面置换)
分页和分段机制懂不懂?缺页异常了解吗?
指针、地址和引用的区别是什么?(指针对类型也有一定的抽象)
指针是保存地址的变量
指针指向一块内存,它的内容是所指内存的地址;引用是某块内存的别名。
程序为指针变量分配内存区域,而不为引用分配内存区域。
指针使用时要在前加 * ,引用可以直接使用。( int& r = i;)
对引用使用“sizeof”得到的是变量的大小,对指针使用“sizeof”得到的是变量的地址的大小
重载是指同名函数参数的类型,个数,顺序不同,根据参数列表决定调用哪个函数,函数的返回类型不关心。而重写是子类中实例化virtual修饰定义的函数,只有函数体不同,其他完全一样。如果往深入点,可以聊一聊C++经典特性多态特征,然后描述一下指针内存,虚表这些。
多态:基类函数前加virtual,派生类中重写该函数,调用的时候根据实际的对象调用相应的函数。
具体描述一下C++中多态的作用?(原理+具体描述)
多态分为静态多态与动态多态。
静态多态就是重载,编译期确定函数地址。
动态多态就是继承重写基类的虚函数,运行时在虚函数表中寻找调用函数的地址。
一个接口,多钟方法。
构造函数和析构函数可以是虚函数吗(构造不可虚构可),inline可static不可
构造一个对象的时候,必须知道对象的实际类型,而虚函数是在运行期间确定实际类型的。如果构造函数为虚函数,则在构造一个对象时,由于对象还未构造成功,编译器还无法知道对象的实际类型,是该类本身还是派生类。无法确定。
虚函数的执行依赖于虚函数表,而虚函数表是在构造函数中初始化的,即初始化vptr,让它指向虚函数表。如果构造函数为虚函数,则在构造对象期间,虚函数表还没有被初始化,将无法进行。
堆和栈的区别?(初始化了的全局变量在数据段)
分配方式不同。堆都是动态分配的,没有静态分配的堆。栈有 2 种分配方式:静态分配和动态分配。
分配效率不同。栈更快。栈由操作系统自动分配,堆则是由C/C++提供的库函数来完成申请与管理,频繁的内存申请容易产生内存碎片。
管理方式不同。栈由操作系统自动分配释放,无需我们手动控制;堆的申请和释放工作由程序员控制,容易产生内存泄漏;
大小不同。每个进程拥有的栈大小要远远小于堆大小。
方向不同。堆的生长方向向上,内存地址由低到高;栈的生长方向向下,内存地址由高到低。
对智能指针有哪些了解?
auto unique shared weak
STL容器用过哪些?
vector和list区别?
vector底层数组,list链表
map和unordered_map区别?
红黑树,哈希表。
算法题:有序数组统计target数量(也就力扣34. 在排序数组中查找元素的第一个和最后一个位置)
http1.0 1.1 2.0 3.0区别
3.1 HTTP 常见面试题 | 小林coding (xiaolincoding.com)
io多路复用是什么?说说其优势,从操作系统的角度来讲讲
通过一个线程轮询多个 socket 的状态,只有当socket 真正有读写事件发生才会占用资源来进行实际的读写操作。
好处:系统在单线程的情况下可以同时处理多个客户端请求。它的最大优势是系统开销小
http2.0 的服务器推送具体怎么实现的?
表现:客户端在访问 HTML 时,服务器可以直接主动推送 CSS 文件,减少了消息传递的次数。
PUSH_PROMISE
帧传输 HTTP 头部,并通过帧中的 Promised Stream ID
字段告知客户端,接下来会在哪个偶数号 Stream 中发送包体。
HTTP底层除了TCP和UDP还能用什么协议?我回答的TLS协议
算法题:问了一道LeetCode 3 无重复最长字串
进程和线程的区别
资源分配基本单位,独立的地址空间,一对多线程,进程间崩溃互不影响,切换开销大
调度和执行基本单位,共享地址空间,多对一进程,线程崩溃进程崩溃,切换开销小
碎片知道吗?内部碎片外部碎片区别?怎么解决
算法题:斐波那契数列,要求递归来写,并优化
struct class区别 new malloc 区别 静态库动态库区别 四种类型转换 tcp三次握手四次挥手 tcp udp区别 http方法
算法题 字符串最长对称子串长度