网易互娱游戏研发面经及答案:计算机网络与操作系统

计算机网络

TCP/UDP

1.TCP和UDP的区别

TCP协议不会自动检测连接是否断开

TCP UDP
连接方式 面向连接的、可靠的数据流传输 非面向连接的、不可靠的数据流传输
通信方式 一对一、点对点 一对一、一对多、多对一、多对多
传输单位 TCP报文段 用户数据报
对系统资源要求 较多(TCP的20个字节信息包),负载高,采用虚电路 较少(UDP信息包的标题很短,只有8个字节)
安全性 可靠,安全 数据传输快,但是不可靠(尽最大努力交付)
对应协议 FTP、Telnet、SMTP、POP3、HTTP DNS、SNMP、TFTP

TCP提供超时重发、丢弃重复数据、检验数据、窗口技术、流量控制等功能,保证数据能传到另外一端。
UDP常用于QQ等即时通讯软件(适合于实时通信,当网络阻塞时,不影响发送端的发送效率。

  • TCP对应的协议
    (1) FTP:定义了文件传输协议,使用21端口。
    (2) Telnet:一种用于远程登陆的端口,使用23端口,用户可以以自己的身份远程连接到计算机上,可提供基于DOS模式下的通信服务。
    (3) SMTP:邮件传送协议,用于发送邮件。服务器开放的是25号端口。
    (4) POP3:它是和SMTP对应,POP3用于接收邮件。POP3协议所用的是110端口。
    (5)HTTP:是从Web服务器传输超文本到本地浏览器的传送协议。
  • UDP对应的协议
    (1) DNS:用于域名解析服务,将域名地址转换为IP地址。DNS用的是53号端口。
    (2) SNMP:简单网络管理协议,使用161号端口,是用来管理网络设备的。由于网络设备很多,无连接的服务就体现出其优势。
    (3) TFTP(Trival File Transfer Protocal),简单文件传输协议,该协议在熟知端口69上使用UDP服务。
2.TCP三次握手和四次挥手的全过程
  • 三次握手
    第一次握手:客户端发送syn包(syn=x)到服务器,并进入SYN_SEND状态,等待服务器确认;
    第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;
    第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
    握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。
  • 四次挥手
    与建立连接的“三次握手”类似,断开一个TCP连接则需要“四次握手”。
    第一次挥手:主动关闭方发送一个FIN,用来关闭主动方到被动关闭方的数据传送,也就是主动关闭方告诉被动关闭方:我已经不 会再给你发数据了(当然,在fin包之前发送出去的数据,如果没有收到对应的ack确认报文,主动关闭方依然会重发这些数据),但是,此时主动关闭方还可以接受数据。
    第二次挥手:被动关闭方收到FIN包后,发送一个ACK给对方,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号)。
    第三次挥手:被动关闭方发送一个FIN,用来关闭被动关闭方到主动关闭方的数据传送,也就是告诉主动关闭方,我的数据也发送完了,不会再给你发数据了。
    第四次挥手:主动关闭方收到FIN后,发送一个ACK给被动关闭方,确认序号为收到序号+1,至此,完成四次挥手。
  • 为什么会采用三次握手,若采用二次握手可以吗?
    采用三次握手是为了防止失效的连接请求报文段突然又传送到主机B,因而产生错误。
    失效的连接请求报文段是指:主机A发出的连接请求没有收到主机B的确认,于是经过一段时间后,主机A又重新向主机B发送连接请求,且建立成功,顺序完成数据传输。考虑这样一种特殊情况,主机A第一次发送的连接请求并没有丢失,而是因为网络节点导致延迟达到主机B,主机B以为是主机A又发起的新连接,于是主机B同意连接,并向主机A发回确认,但是此时主机A根本不会理会,主机B就一直在等待主机A发送数据,导致主机B的资源浪费。
  • 为什么会采用四次挥手,若采用三次挥手可以吗?
    因为关闭连接时,server端收到客户端的FIN报文,并不会立即关闭socket,只能先回复一个ACK告诉client我已经收到你的关闭请求了,同时可能server还有数据没传输完,只有等server端数据传输完成了 才能发送FIN报文,所以这个地方要分两次发送,这样就有了四次挥手。
  • 服务端的Time_Wait状态再哪个阶段出现?持续多久?为什么要设计这么一个状态?
  1. timewait阶段是最后阶段发送确认收到server端的fin报文释放连接请求后回复给server端ack报文,之后client端就进入time_wait阶段.
  2. 持续多久即是问为什么不马上关闭直接进入closed阶段,主要是考虑到网络的不可靠,假如client最后阶段发送给server端端ack报文由于网络原因丢失了server没收到呢,server端会重新发送fin报文过来,这个时候client端就要等. 等多久?等一个计时器时间2MSL,如果该时间段内再次收到server的fin报文 那client就必须回复. 如果没有收到,client就认为server端已经接收到了最后的ack报文.
3.TCP如何实现可靠连接

TCP控制传输协议,它充分实现了数据传输时的各种控制功能:
针对发送端发出的数据包确认应答信号ACK;
针对数据包丢失或者出现定时器超时的重发机制;
针对数据包到达接收端主机顺序乱掉的顺序控制;
针对高效传输数据包的滑动窗口控制;
针对避免网络拥堵时候的流量控制;
针对刚开始启动的时候避免一下子发送大量数据包而导致网络瘫痪的慢启动算法和拥塞控制。

此外,TCP作为一种面向有连接的控制传输协议,只有在确认对端主机存在时才会发送数据,从而可以控制通信流量的浪费。

TCP通过序列号、超时重传、检验和、流量控制、滑动窗口、拥塞控制实现可靠性。

  1. 序列号:应用数据被分割成TCP认为最适合发送的数据块。TCP给发送的每一个包进行编号,接收方对数据包进行排序,把有序数据传送给应用层。TCP的接收端会丢弃重复的数据。
  2. 超时重传:当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。
  3. 校验和:TCP将保持它首部和数据的检验和,发送的数据包的二进制相加然后取反。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP将丢弃这个报文段和不确认收到此报文段
  4. 流量控制:TCP连接的每一方都有固定大小的缓冲空间,TCP的接收端只允许发送端发送接收端缓冲区能接纳的我数据。当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。TCP使用的流量控制协议是可变大小的滑动窗口协议。接收方有即时窗口(滑动窗口),随ACK报文发送。(TCP 利用滑动窗口实现流量控制
  5. 滑动窗口:实际中的传输方式。具体介绍。我们都知道,TCP必需要解决的可靠传输以及包乱序的问题,所以,TCP必需要知道网络实际的数据处理带宽或是数据处理速度,这样才不会引起网络拥塞,导致丢包。
  6. 拥塞控制:当网络拥塞时,减少数据的发送。发送方有拥塞窗口,发送数据前比对接收方发过来的即使窗口,取小慢启动、拥塞避免、拥塞发送、快速恢复。应用数据被分割成TCP认为最适合发送的数据块,TCP的接收端会丢弃重复的数据。

停止等待协议也是为了TCP协议传输稳定可靠,它的基本原理就是每发完一个分组就停止发送,等待对方确认。在收到确认后再发下一个分组。

3.面试高频题
  1. UDP/TCP的区别?
    答:可以从连接方式、通信方式、传输单位、对系统资源要求、安全性、对应协议等几个方面回答,具体看上文表格。

  2. TCP的三次握手与四次挥手,画出流程图。为什么TCP要三次握手,两次有什么问题?为什么要四次挥手?三次有什么问题?CLOSE_WAIT和TIME_WAIT的作用。
    网易互娱游戏研发面经及答案:计算机网络与操作系统_第1张图片
    网易互娱游戏研发面经及答案:计算机网络与操作系统_第2张图片
    答:具体看上文。

  3. 什么叫稳定连接?

  4. TCP怎么实现可靠传输?
    答:TCP通过序列号、超时重传、检验和、流量控制、滑动窗口、拥塞控制实现可靠性。具体看上文。

  5. 解释TCP的滑动窗口如何实现,除了流量控制还有什么作用?
    答:具体看上文。还可以加速数据传输。

  6. TCP的nodelay,keepalive是干什么的?底层原理?
    TCP协议中有长连接和短连接之分。短连接环境下,数据交互完毕后,主动释放连接;长连接的环境下,进行一次数据交互后,很长一段时间内无数据交互时,客户端可能意外断电、死机、崩溃、重启,还是中间路由网络无故断开,这些TCP连接并未来得及正常释放,那么,连接的另一方并不知道对端的情况,它会一直维护这个连接,长时间的积累会导致非常多的半打开连接,造成端系统资源的消耗和浪费,且有可能导致在一个无效的数据链路层面发送业务数据,结果就是发送失败。所以服务器端要做到快速感知失败,减少无效链接操作,这就有了TCP的Keepalive机制。

  7. socket编程中,UDP一个一个报文接收就可以,TCP也是这样吗?
    答:TCP比UDP多了listen和accept。具体可以看我的博客

  8. 客户端和服务器是怎么连接通信的?介绍下
    答:Socket通信流程。具体可以看我的博客

  9. 有哪些机制和可以提高UDP可靠性;设计一个可靠的UDP。
    参考TCP的可靠性实现机制。UDP可以加入超时重传(能避免数据报丢失),提供确认序列号(对数据报进行确认和排序)

  10. 在游戏开发中应该使用TCP还是UDP,为什么?梦幻端游使用TCP还是UDP,吃鸡手游呢?
    UDP只适合丢消息无所谓, 流畅时能快速响应的情况。如视频等,赛车游戏等(第一个定位包丢了, 没事, 下一个定位包能把位置定准。)
    TCP能胜任很多情况。但它有一些缺点,第一 延迟发送,不够实时,快速。第二 流式接口, 所以有沾包问题(加包头就解决了)。比如在低可靠网络上的重传会加剧网络性能恶化。
    在实时性方面,TCP协议的网络抗性欠佳,对MOBA类或其他实时性要求较高的游戏,一般是不建议使用TCP作为协议载体。事实上,王者荣耀的PVP通信协议也确实是基于UDP封装的;同样,最近大家喜闻乐见的《绝地求生》,也是基于UDP的。

客户端和服务器采用多路复用,一连发送两个IPC包(没听明白),客户端收到1.5个IPC包??什么原因?怎样解决?在这中间过程,包在哪里传输的?
客户端服务器已经断开连接,客户端再次收到RST包,为什么?怎样处理?

网络里面的滑动窗口(拥塞窗口)知道吗?讲述一下它的扩容过程?

TCP,UDP
项目中的重传时间如何确定。
TCP的RTO计算公式
epoll_wait是否线程安全
TCP是如何实现可靠传输的
14. 了解epoll吗,为什么epoll会比较快,epoll的原理
15. linux文件最大有多大-(回答的不太符合面试官想要的答案,又提示了虚拟内存)>虚拟内存原理


操作系统

进程与线程

1.进程与线程的区别?

进程是一段程序在一个资源集合上的一次执行过程,是操作系统资源分配的基本单位。
线程是进程中的一个执行,他不拥有资源,是操作系统调度执行的最小单位。
a、进程是程序的一次执行,线程是进程中的执行单元;
b、进程间是独立的,这表现在内存空间、上下文环境上,线程运行在进程中;
c、一般来讲,进程无法突破进程边界存取其他进程内的存储空间;而同一进程所产生的线程共享内存空间;
d、同一进程中的两段代码不能同时执行,除非引入多线程。
进程与线程的区别:
进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位

区别 进程 线程
开销 每个进程都有独立的代码和数据空间,程序之间的切换有较大开销 同一类线程共享代码和数据空间,又有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小
环境 在操作系统中能同时运行多个进程 同一个进程中有多个线程同时执行(通过CPU调度,在每个时间片中只有一个线程执行)
内存分配 系统会为每个进程分配不同内存空间 系统不会为线程分配内存。线程组之间只能共享来自其所属进程的资源。
2.什么时候使用多线程,什么时候使用多进程

进程创建和撤销的开销比较大,每次创建和取消都要分配一个进程控制块。比如频繁建立连接,使用多线程;cpu频繁切换使用多线程。多线程适用于多核处理机。
但是多进程可以使用在多机分布式系统,需要扩展到其他机器上,使用多进程。
那如果有很多任务,创建线程越多越好吗?
不是,创建线程越多,对共享资源同步要求多,设计同步容易出错。另外多线程并发容易导致资源分配问题
有没有优化的方式呢?很多线程任务,怎么解决呢 线程池

3.进程状态

就绪:当一个进程获得了除了CPU以外的所有资源,处于就绪状态
运行:获得CPU以后,任务调度,转换到执行状态,如果时间片用完,又会回到就绪状态
阻塞:处于执行过程中的进程,由于I/O请求,变到阻塞状态

4.进程同步方式

临界区(Critical Section)、互斥量(Mutex)、信号量(Semaphore)、事件(Event)

5.进程调度算法

先来先服务、短作业(进程)优先、优先权调度算法、高响应比优先、基于时间片的轮转调度算法

线程之间共享数据的方式

3.常考题目汇总

1. 进程和线程区别;
答:从概念上进行区分,具体见上文。一个进程可创建一个或多个线程,一个线程(主线程)可创建一个或多个线程。进程有独立的地址空间,线程没有。线程与线程通信不可使用共享内存。
2. 什么场景下用多进程,什么场景用多线程
答:需要频繁建立连接、CPU频繁切换时使用多线程。多核处理机用多线程,多机分布式系统用多进程。
4. 进程线程内存分配方式的区别
进程的内存占用分为哪几部分;
进程内存分哪几个区,他们怎么分布的
5. 线程共享什么?
答:进程代码段、进程的公有数据 、进程打开的文件描述符 、信号处理器、 进程用户ID、进程组ID

线程 内容
线程独有 线程ID 寄存器组的值 线程堆栈 错误的返回码 线程的信号屏蔽码
线程共享 进程代码段 进程的公有数据 进程打开的文件描述符 信号处理器 进程用户ID和进程组ID

6.线程的锁机制
为了保证线程安全,有乐观锁,悲观锁
6. 进程怎么通信?
答:信号、信号量、消息队列、共享内存
7. 为什么一个线程崩溃会导致整个进程崩溃?
答:线程能不能脱离进程而存在?

图的最小生成树
LINUX的VFS

先是操作系统,32位系统,64位,int,指针的大小等。。(难的就不会了,也就没接着问)
linux系统了解么?动态链接和静态链接的区别

内存

1. 虚拟内存如何实现的
答:虚拟内存的实现有以下三种方式:请求分页存储管理、请求分段存储管理、 请求段页式存储管理。
2. 内存对齐?为什么要内存对齐?
答:内存对齐是按照成员的声明顺序,依次安排内存,其偏移量为成员大小的整数倍,0看做任何成员的整数倍,最后结构体的大小为最大成员的整数倍。
为什么要内存对齐?①平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。②性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。
4. 程序是怎样在内存中存储的?
5. 进程的虚拟内存和物理内存的区别和联系?
虚拟内存优点:①当不同的进程使用同一段代码时,比如库文件的代码,在物理内存中可以只存储一份这样的代码,不同进程只要将自己的虚拟内存映射过去就好了,这样可以节省物理内存②在程序需要分配连续空间的时候,只需要在虚拟内存分配连续空间,而不需要物理内存是连续的。这样就可以有效地利用我们的物理内存。
7. 用过共享内存吗?没有。
8. 内存模型

操作系统 (页表放置,进程切换与页表切换机制,进程线程理解)

了解哪些文件系统(忘了是FAT、NTFS这些…);

阻塞与死锁

1. 阻塞

阻塞:处于执行过程中的进程,由于I/O请求,变到阻塞状态

2.死锁

死锁是指多个进程因抢占资源而发生的一种阻塞且相互等待的现象 ,死锁的产生源于系统资源不足和进程推进顺序不当 ,可以通过终止和撤销进程来解除死锁。

**产生死锁的四个必要条件:**只要系统发生死锁,这些条件必然成立,而只要条件之一不满足,就不会发生死锁。

条件 描述
互斥条件 一个资源每次只能被一个进程使用,即在一段时间内某 资源仅为一个进程所占有。此时若有其他进程请求该资源,则请求进程只能等待。
请求与保持条件 进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源 已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。
不可剥夺条件 进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,即只能 由获得该资源的进程自己来释放(只能是主动释放)。
循环等待条件 若干进程间形成首尾相接循环等待资源的关系

死锁的避免和预防:
死锁预防是设法至少破坏产生死锁的四个必要条件之一。
死锁避免则不那么严格的限制产生死锁的必要条件的存在。是在系统运行过程中注意避免死锁的最终发生。
死锁避免:线性资源分配法、系统安全状态法、银行家算法 参考博客

  1. 阻塞和非阻塞之间的区别?什么叫阻塞?
  2. 阻塞和非阻塞的区别,如果阻塞模式下开多线程,那么它的性能与非阻塞对比
  3. 死锁产生的情况和避免死锁
    答:原因① 系统资源的竞争,导致系统资源不足,以及资源分配不当,导致死锁。②进程在运行过程中,请求和释放资源的顺序不当,会导致死锁。避免死锁:银行家算法,具体看上文。
  4. 乐观锁和悲观锁?同样是锁,为什么要加乐观锁?不加会有什么影响?

5.操作系统 CPU缓存是如何读取数据的?缓存替换算法?(LRU) LRU一般使用什么实现的?(双向链表+hash)
2、操作系统为什么要任务切换,任务切换的目的是啥?
答:最大化CPU利用率,举了个IO和CPU计算同时的例子。

18.线程同步的加锁方法有哪些
19.进程切换为什么比线程切换开销大,介绍TLB
20.死锁相关 包括死锁的必要条件,银行家算法等
21.平时有多线程开发经验吗

你可能感兴趣的:(面试,C++)