八股文

2022/5/21兴盛优选一面

自我介绍

毕业时间

有参加哪些比赛没有

学的专业,学的什么语言,专业怎么样,年级排名

static和const的区别?以及static的作用还有吗

static内存在哪,我说data和bss,他问哪个区,原来是静态存储区啊,全局变量我也没答出来哪个区

static函数存在代码段,static修饰的局部和全局变量都在静态存储区(静态存储区也叫全局存储区

内存四区是指:栈区,堆区,全局区,代码区。)

static修饰成员函数的时候改变了C++的哪些特性?

const修饰类的成员函数的时候在前面修饰和在后面修饰有什么区别

const修饰类的成员函数时,返回的是左值还是右值

c++三大特性,举例说明

构造函数和析构的定义作用

执行顺序,成员对象什么时候构造

构造函数可以定义为虚函数吗

引用和指针的区别

引用在创建和销毁的时候是否会调用析构函数(我答成浅拷贝了,草)

引用可以重复赋值吗

new,delete,malloc,free区别

malloc申请的在哪个区

堆和栈区别

栈溢出原因

TCP和UDP区别

进程和线程的区别

进程通信方式,讲一下他们的含义

 

 

 

别人的面经

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 文件,减少了消息传递的次数。

实现:客户端发起的请求,必须使用的是奇数号 Stream,服务器主动的推送,使用的是偶数号 Stream。服务器在推送资源时,会通过 PUSH_PROMISE 帧传输 HTTP 头部,并通过帧中的 Promised Stream ID 字段告知客户端,接下来会在哪个偶数号 Stream 中发送包体。


HTTP底层除了TCP和UDP还能用什么协议?我回答的TLS协议
算法题:问了一道LeetCode 3 无重复最长字串

进程和线程的区别

资源分配基本单位,独立的地址空间,一对多线程,进程间崩溃互不影响,切换开销大

调度和执行基本单位,共享地址空间,多对一进程,线程崩溃进程崩溃,切换开销小
碎片知道吗?内部碎片外部碎片区别?怎么解决
算法题:斐波那契数列,要求递归来写,并优化

 

 

struct class区别 new malloc 区别 静态库动态库区别 四种类型转换 tcp三次握手四次挥手 tcp udp区别 http方法

算法题 字符串最长对称子串长度

 

 

 

posted @ 2022-03-31 19:52  剩下的交给时间就好  阅读(94)  评论(0编辑  收藏  举报