面试没答上来的

目录

C++

struct 为什么要用内存对齐

struct 内部每个成员按自身大小对齐。struct 末尾紧贴着一个相同类型的 struct,也能够使下一个 struct 内成员对齐。

CPU 在内存读取数据的时候是 4 字节 / 8 字节 (CPU字长)为一块读取的,如果内存不对齐:例如字长为 4 字节的 CPU 读取 int 时,可能会需要分成俩块读取。

static 关键字的作用

使得变量只属于当前作用域,且不会被删除。变量放在静态区内。

C++ 内存分布

alt

虚函数的作用

将父类函数标虚,可以在 父类指针指向派生类 执行函数时,执行派生类函数,而不是父类(多态的实现)。每个函数内都有一个虚函数指针 *__vprt 指向一个函数指针数组,这个函数指针数组就是虚函数表。

extern 的作用

C 中:extern 修饰后只声明不定义。如 extern int i; 是声明 int i; 是定义。不同文件中使用同一个变量,只有一个文件能定义,其他必须用声明。

C++ 中:extern "C" 可以使得变量或者函数按照 C 的模式编译,即不支持函数重载等功能,从而使得 C++ 与 C 文件可以混合编译。

动态链接库(DLL)

静态链接库:在编译期间装载。

动态链接库:可以动态装载;与可执行文件独立(更新不需要重新编译);与编译器和语言无关;节约内存,多个应用可以使用一个 DLL;可以隐藏具体实现代码。但是会牺牲少量性能。

操作系统

进程之间的通信方式

管道; 消息队列; 共享内存; 信号量; 信号; 套接字;

共享内存

开辟一段内存空间,再使得多个程序的虚拟地址空间映射这个地址,就可以共享这一块区域,但是需要加锁,因为不能不同的进程同时读写。

I/O多路复用

alt

select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间。

用户态和内核态

区别是 CPU 执行进程的状态,即 CPU指令集的等级:用户(Ring 3),内核(Ring 0)。用户态无法直接访问内核的功能,只能通过系统调用间接执行功能,保障系统安全。

态切换的三种情况

  • 系统调用:由用户态的程序请求系统调用,从而执行系统调用服务程序
  • 产生异常: 程序发生了意料之外的错误
  • 外设中断: 键盘输入 / 硬盘读写完成

网络

TCP 为什么可靠

解决干扰:为了能够检测到数据包在传输过程中是否发生了差错,TCP 包中引入了 checksum。

解决乱序和冗余:TCP 的发送端和接收端各自独立维护一个 seq。

解决丢包:TCP 中存在 ACK 包确认收取。

TCP 包的标记

URG:紧急比特,1bit,当 URG=1 时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据

ACK:确认比特,1bit,只有当 ACK=1时确认号字段才有效。当 ACK=0 时,确认号无效

PSH:推送比特,1bit,接收方 TCP 收到推送比特置1的报文段,就尽快地交付给接收应用进程,而不再等到整个缓存都填满了后再向上交付

RST:复位比特,1bit,当RST=1时,表明TCP连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接

SYN:同步比特,1bit,同步比特 SYN 置为 1,就表示这是一个连接请求或连接接受报文

FIN:终止比特,1bit,用来释放一个连接。当FIN=1 时,表明此报文段的发送端的数据已发送完毕,并要求释放运输连接

Websocket建立过程

连接建立过程

  • 客户端发送GET请求,其中包括upgrade:websocket
  • 服务器发送响应,包括switching protocol
  • 连接成功建立
全部评论

相关推荐

评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客企业服务