巨人网络游戏开发工程师1面

1、HTTP 和 TCP 协议的区别?

1、HTTP 是应用层的协议,主要解决如何包装数据和解析数据,TCP 是传输层协议,解决数据如何在网络中传输,以及可靠的传输

2、HTTP 协议是基于 TCP 协议的,当浏览器从服务器获取数据的时候会发出一次 HTTP 请求,HTTP 会通过 TCP 协议建立到服务器的连接通道.

2、保证 TCP 传输可靠的机制?

TCP 协议传输的特点主要是面向字节流,面向有连接,通过确认应答、超时重传、连接管理、流量控制、拥塞控制.

TCP 协议在传输的过程中,将每个字节的数据进行编号,如果数据传输到服务器,服务器会对客户端进行确认应答,如果客户端没有收到 ACK 确认应答,这个时候 TCP 引入了超时重传机制,进行再次发送数据.

连接管理可以分为三次握手和四次挥手,服务器首先进入监听状态,然后客户端发送一次连接请求报文,SYN 同部位置位1,同时初始化自己的序列号,进入同步已发送状态,服务器收到请求报文后,如果同意连接,则发出确认报文,报文中 ACK 位和 SYN 位置为 1 ,确认号值是上一个发送的序列号值 + 1,同时自己初始化一个序列号,进入已连接状态;最后客户端向服务器发送确认报文,ACK 依然置位 1,此时 TCP 已经进入连接状态.

四次挥手依然是客户端首先发送连接释放报文,并且停止发送数据,报文中 FIN 置为1,序列号比如为 seq=u ,此时客户端进入终止等待状态 1,服务器收到连接释放报文后,发出确认,确认号是上一次发送序列号+1,并且带上自己的序列号,此时服务器进入关闭等待的状态,如果服务器还有数据想要发送,依然是可以发送的,当客户端收到确认释放报文后,进入终止等待状态2 . 如果服务器想要发送数据,则它将数据发送完毕后,会发送一次释放连接报文,FIN 位置1,此时服务器进入最后确认状态,等待客户端最后发来确认报文,如果客户端收到服务器发出的连接释放报文,会向服务器发出确认,客户端进入 TIME-WAIT 时间等待状态,此时客户端依然没有关闭,当服务器收到客户端发出的确认,立即进入关闭状态,就结束了这次的连接.

流量控制,是针对发送端发送数据的约束,服务器每次发送的时候,会把缓冲区的大小作为窗口字段的大小,如果发送的数据大于这个窗口则会浪费资源,因为缓冲区容不下,所以需要进行流量控制.

3、线程和进程的区别?

进程指的是系统正在运行的一个实例,程序一旦加载到内存就是进程,从内核角度来看,进程是分配系统资源的基本单位

线程是程序执行的最小单位,或者可以说线程是进程内部独立执行的单元执行流

线程的进程的区别主要体现在

  • 线程共享进程的地址空间, 进程拥有自己独立的地址空间,这也就导致了创建进程的效率比线程更低,所以进程比线程更加安全,是因为一个进程奔溃后,不会影响到别的进程,而一个线程奔溃后,整个进程就会挂掉

  • 在通信方面,线程比进程更加方便,线程可以通过访问全局变量的方式,因为线程之间共享数据段,但是需要实现同步与互斥,只一点可以使用互斥锁、条件变量、信号量得以实现,而对于进程来说,有管道、消息队列、共享内存、套接字、信号量等 IPC 通信方式来实现.

  • 在 CPU 系统上,线程使得 CPU 的分配更加高效,因为操作系统可以保证当前线程数不大于 CPU 数目的情况下,实现并行.也就是不同的线程运行在多核 CPU 上面

进程和线程的联系
1、一个线程只能属于一个进程,一个进程中有多个线程,线程是CPU 基本的调度单位

2、系统将资源分配给进程后,同一进程中所以线程共享该进程的资源,共享代码段,数据段,但是每个线程又都有自己的堆栈,存放局部变量和临时变量

3、在 CPU 上运行的是线程,所以线程是 CPU 调用的基本单位,而进程是资源分配的基本单位.

4、进程的通信方式?

进程之间通信可以实现数据的传输和资源共享,或者事件通知

管道,分为匿名管道和命名管道,半双工的通信方式,匿名管道只能在亲缘之间的进程之间通信,命名管道运行无亲缘关系的进程通信

它们的功能和限制区别不大,比如当缓冲区(管道本质就是一块缓冲区)没有数据时,read 读数据的时候会陷入阻塞,当管道中写满数据的时候,write 写数据会陷入阻塞,如果写端对应的文件描述符被关闭,则 read 会返回0,如果读端对应的文件描述符被关闭,则 write 写数据会触发异常.

消息队列在内核中创建一个队列,队列中的每个元素是一个数据报,不同的进程之间可以通过句柄去访问这个队列,每个数据都是有类型的

共享内存是最快的进程间通信方式,因为它少了两步用户态到内核态之间的数据拷贝,当系统加载一个进程的时候,分配给进程的内存并不是实际物理内存,而是虚拟内存空间,那么我们可以让两个进程各自拿出一块虚拟地址空间来,然后映射到相同的物理内存中,这样,两个进程虽然有着独立的虚拟内存空间,但有一部分却是映射到相同的物理内存,这就完成了内存共享机制了

5、哈希结构和链表结构的区别?

链表是一种物理存储单元非连续的结构,通过指针的指向进行插入和删除元素,它是由一系列的接口组成,这些节点可以在动态的时候生成

哈希表是根据关键字 key 去计算对于的哈希地址的方式来访问数据,通过把哈希码映射到哈希表中的一个位置,这样可以加快查找的速度,这个映射是哈希函数,或者哈希散列函数,存放记录的元素是哈希散列表

他们之间的区别?
对于插入元素,链表不需要扩容,直接改变指针的指向即可,哈希表需要通过计算哈希装载因子来判断是否需要扩容,在增容的时候可以重新创建一个哈希表,将之前的元素插入到新的哈希表中,如果在插入的过程中,遇到哈希碰撞,可以通过闭散列或者开散列的方式解决.

对于删除元素,链表可以直接改变指针的指向,然后释放节点的内存,对于哈希表则不可以直接删除,因为一个哈希位置可能会对应多个关键字,所以需要对位置进行标记,意味着这是伪删除,其实并没有真正的删除元素.

对于查找元素,链表的底层的内存并不是连续的,所以需要遍历的方式去查找,对于哈希表来说,可以直接通过关键码来查找对应的值,这也是哈希结构的优势,查找的效率很高.

6、C++ 智能指针的原理?

智能指针通过类将一个普通的指针封装成栈对象,当栈对象声明周期结束的时候,由于超出了类的作用范围,所以会自动调用析构函数释放内存,C++11 中最常用的智能指针是 shared_ptr ,它是通过引用计数的方法来记录当前资源被多少个对象使用,新增一个对象会 + 1,释放一个对象会 -1,当引用计数为0的时候,会释放内存资源.

7、算法概率题

题目:有三只老鼠,分别停留在三角形的三个顶点,三个老鼠分别沿着三条边朝一个方向运动,它们互相不碰撞的概率是多大?

概率:1/4 ,同时朝着顺时针移动,或者同时朝着逆时针移动.感觉这题很简单,很可惜答错了,我回答的是 1/8 ,没考虑另一个方向,面试官是一个技术小姐姐,完全出乎意料,语速超快. 感觉这次凉了,面试被挂应该不是我的问题,怪她声音太好听了,耳朵怀孕啦~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿的温柔香

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值