题目见这里:字节实习
一面
介绍 C++ 多态
类在调用成员函数时,会根据调用的对象的不同去执行不同的函数;
通过虚函数来实现;
虚函数,在函数定义前加上virtual;
C++ 类对象的初始化顺序,有多重继承情况下的顺序
- 各个基类的构造函数;
- 成员变量的初始化;
- 派生类(类本身)的构造;
注:析构函数的执行顺序与构造函数相反。
若同一层次中同时包含虚基类和非虚基类,先调用虚基类的构造函数,再调用非虚基类的构造函数。
同一层次中的非虚基类只调用一次。
.如果派生类的成员与基类的某个成员同名,则派生类将在其作用域隐藏掉该基类成员。(C++ Prime 5)
内联函数和宏,什么时候使用内联函数
宏定义是在预处理阶段由预处理器替换,内联函数是在编译时编译器执行。
内联函数还是有函数的特性,而宏定义真的只是简单的字符串替换,容易出现一些问题。
虚函数
用于实现多态;
有虚函数表;
介绍网络 5 层模型,每一层都实现什么功能
1.物理层:管理维护物理连接,确定传输媒体特性,提供比特流传输服务,对上层(数据链路层)屏蔽物理设备以及协议的差异性。 信息转信号。
2.数据链路层:接收网络层的ip数据包,将其添加首尾封装成帧。
在物理层比特流在介质上传输是不可靠的,数据链路层在物理层的基础上提供差错检测,差错控制,流量控制。为网络层提供一个可靠传输。对网络层屏蔽了不同传输介质的差异性。
3.网络层:网络层是无连接,不可靠尽量交付数据包的服务。由主机的运输层负责对进程提供可靠性的
服务。
4.传输层:提供端对端的连接和数据传输服务(进程对进程),网络层提供的是主机对主机之间的连接服务
5.应用层:规定应用进程通信所遵守的协议
MAC 地址和 IP 地址分别有什么作用
MAC地址用于确定硬件(数据链路层)
IP地址用于确认区域(网络层)
- IP地址可修改,MAC地址不可修改;
- IP32位,MAC48位;
- 都是唯一的地址;
TCP、UDP的区别
- TCP面向字节流,UDP面向报文;
- TCP可靠,UDP不可靠;
- UDP支持一对多;
- UDP无连接;
- UPD头部开销小,八字节,TCP20-60字节;
TCP 的连接释放具体步骤
四次挥手的步骤;
如果三次握手时候每次握手信息对方没收到会怎么样,简答
前两次直接超时重传;
最后一次未收到超时重传到一定次数后关闭连接;
虚拟内存
管理方式:分段,分页,段页内存管理;
物理内存和虚拟内存的映射;
进程通信的几种方式
管道(匿名管道,命名管道)
消息队列;
信号量;
共享内存;
socket()套接字;
二面
事务的特点
ACID
原子性;
隔离性;
持久性;
一致性;
隔离级别
读未提交;
读提交;
不可重复读;
读序列化;
进程和线程
进程和线程的区别:
- 进程崩溃不会影响其他进程,但是线程崩溃会影响其他线程;
- 进程是资源分配的最小单位,线程是执行运算的最小单位;
- 线程可以访问进程的资源;
- 进程开销大,线程开销小;
虚拟内存空间分为哪些部分,虚拟内存的好处,虚拟地址如何转为物理地址
操作系统位每个进程都提供了独立的虚拟地址空间, 主要分用户空间和内核空间;用户空间有代码段,全局变量,常量字符串,堆栈等;
将外存当作内存来使用,缓解物理内存的压力;
分段式,分页式;
线程的同步机制
信号量;
互斥量;
临界区;
事件or信号;
用户态和内核态区别
- 内核态与用户态是操作系统的两种运行级别,当程序运行在3级特权级上时,就可以称之为运行在用户态。因为这是最低特权级,是普通的用户进程运行的特权级,大部分用户直接面对的程序都是运行在用户态;
- 当程序运行在0级特权级上时,就可以称之为运行在内核态。
- 运行在用户态下的程序不能直接访问操作系统内核数据结构和程序。当我们在系统中执行一个程序时,大部分时间是运行在用户态下的,在其需要操作系统帮助完成某些它没有权力和能力完成的工作时就会切换到内核态。
- 这两种状态的主要差别是:
处于用户态执行时,进程所能访问的内存空间和对象受到限制,其所处于占有的处理机是可被抢占的 ;
而处于核心态执行中的进程,则能访问所有的内存空间和对象,且所占有的处理机是不允许被抢占的;
Redis 基本数据类型有哪些
string;
Hash;
List;
Set;
SortedSet(zset)
三面
在 C++ 继承关系中,父类的析构函数为什么定义为虚函数;全局静态变量在什么阶段初始化
如果没有定义成虚函数,那么但子类继承父类的之后如果调用析构函数会调用父类的析构函数;
在main()前初始化,之后销毁;
TCP 是如何保证数据传输的可靠性
检验和、序列号/确认应答、超时重传、最大消息长度、滑动窗口控制;
说一下滑动窗口,如果接收方滑动窗口满了,发送方会怎么做
基于 TCP 流量控制中的滑动窗口协议,我们知道接收方返回给发送方的 ACK 包中会包含自己的接收窗口大小,若接收窗口已满,此时接收方返回给发送方的接收窗口大小为 0,此时发送方会等待接收方发送的窗口大小直到变为非 0 为止,然而,接收方回应的 ACK 包是存在丢失的可能的,为了防止双方一直等待而出现死锁情况,此时就需要坚持计时器来辅助发送方周期性地向接收方查询,以便发现窗口是否变大,当发现窗口大小变为非零时,发送方便继续发送数据
死锁是什么?和如何解决死锁问题?
两个线程占用对方资源,都不释放,卡在那里;
解决方法:
- 破坏死锁的必要条件:①资源互斥/资源不共享 ;②占有和等待/请求并保持;③资源不可剥夺;④环路等待
- 判断“系统安全状态”法:在进行系统资源分配之前,先计算此次资源分配的安全性。若此次分配不会导致系统进入不安全状态,则将资源分配给进程; 否则,让进程等待。
- 银行家算法: