1.TCP和UDP有什么区别,为什么TCP可靠,UDP如何识别可靠呢?
答:tcp传输协议更稳,是有链接的协议,而udp则是无链接,一个要进行三次握手四次挥手一个不需要直接传就可以了,所以一般来说tcp就需要用于一些重要的消息传输比如说你的wechat消息传输,而udp则可以用于一些消息不是那么"重要"的传输,比如说直播画面的传输,这些我们是容忍一些丢包的,TCP可靠的原因源自于它的相关机制,比如说ack,会确定对方是否能收到消息,还有拥塞窗口机制以及流量控制还有超时重传等机制来确保其稳定性,如果想要udp实现这种可靠的识别就需要让udp进行"tcp"化,比如在信息的开头加一些序列号ack确认是否回以及超时重传机制等,我们可以根据需要的场景来客制化udp的传输能力来达到其稳定性
2.进程和线程的区别,它们的上下文切换保存什么信息?进程和线程的上限由什么决定?
答:进程是操作系统调用资源的最小单位,而线程是cpu执行调度的最小单位,进程的切换开销大,但是线程不大,同一个进程内任意一个线程崩溃,整个进程都会被操作系统销毁,所有线程一同退出;不同进程之间相互隔离,一个进程崩溃不影响其他进程。线程保存的是cpu中寄存器,进程则是保存的线程的资源以及修改相关的页表即独立的地址空间等信息,进程的上限数量由pid_max决定的线程也是
3.c++中多态的实现方式,虚函数表是什么,析构函数或者说构造函数可以是虚函数吗?虚函数和纯虚函数的区别,抽象类是什么,菱形继承问题是什么怎么解决?
答:多态首先分为静态和动态多态,其中静态多态的实现方式是编译时就决定了,有函数重载运算符重载和模板,动态多态则需要通过虚函数来实现,在每个虚类对象中都存放的有对应的虚表用于存放相关的虚函数的地址,其中虚表指针初始化后指向其地址,因为vptr即虚表指针需要在构造函数内初始化后才能调用而所以说构造函数不能是虚函数不然vptr不初始化不能调用就不能实现相关的多态,而析构函数则可以,因为一般动态多态的实现要基类对象的的指针或引用指向派生类的对象,也就是说如果delete的话只会delete掉基类对象而派生类不会delete所以我们要加虚函数即virtual关键字这样我们就能delete了,虚函数可以实例化创造对象但是纯虚函数不可以,纯虚函数需要子类重写父类的虚函数但是不是纯虚函数就不需要,只要有一个纯虚函数就是抽象类,菱形问题是指b和c继承了a类但是d继承了b和c类,这时候因为会有两个a类报错,只要我们加上virtual关键字继承就可以了,这样d类可以通过虚表指针来访问a类的相关的地址就不会有二义性导致报错了,但是一般我们不会用因为开销大