【游戏开发岗面经总结2】(TCP拥塞控制,静态动态链接,TCP和UDP不同点,结构体和类区别,值类型和引用类型,c#中的GC)

TCP中的拥塞控制

在TCP传输过程中,发送端开始发送数据的时候,如果刚开始大量发送数据,那么可能造成一些问题,网络可能在开始的时候非常的拥堵,如果给网络中再次加入大量的数据,那么这个拥堵就会加剧。
拥堵加剧会产生大量的丢包,就会产生大量的超时重传,严重影响传输速率

所以TCP引入了慢启动机制,在开始发送数据的时候,先发送少量的数据探路,探清当前的网络状态如何
在决定使用多大的速度进行传输
**拥塞窗口:**发送刚开始定义拥塞窗口为1,每次收到ACK应答 拥塞窗口加一
在发送数据之前,首先将拥塞窗口和接收端返回的窗口大小进行比对,取最小值作为实际发送的窗口

拥塞窗口的增长是指数级别的,慢启动机制只是说明在开始的时候发送的少,发送的慢,但是增长的速度是很快的,
为控制拥塞窗口的增长,不能单纯的是拥塞窗口加倍
设置一个拥塞窗口阈值,当拥塞窗口超过阈值以后,不再按照指数来增长,而是线性的增长
在慢启动开始的时候,如果慢启动的阈值等于窗口的最大值,一旦发生网络阻塞,发生超时重传
慢启动的阈值会降低为原来的一半,同时拥塞窗口设置为1

拥塞控制是TCP在传输的尽可能的将数据传输,并且避免拥塞的一系列问题,是可靠性的保证同时也维护了传输的高效型

C++编译过程中的动态链接和静态链接有什么区别?动态链接的流程是怎样的

动态链接和静态链接最大的区别就在于链接的时机不同
动态链接的进行在程序执行时链接,静态链接在形成可执行程序之前的链接

流程

预处理->编译->汇编->链接

预处理 编译器把c程序的头文件编译进来,还有宏的替换

编译 这个阶段主要做词法分析,语法分析,语义分析,在检查无错误之后,把代码翻译成为汇编语言

汇编 汇编语言变成机器语言

链接 将编译阶段生成的文件链接为一个整体的文件

TCP和UDP的不同点

1.TCP提供面相链接的传输,通信之前建立连接(三次握手);UDP提供无连接的传输,通信之前不需要连接
2.TCP提供可靠的传输(有序,无差错,不丢失,不重复);UDP提供不可靠的传输
3.TCP面相字节流的传输,每次传输之前,先把信息分割成组,到达接收端在将其充足,UDP面相数据的传输,没有分组和充足
4.TCP提供拥塞控制和流量控制机制,UDP不提供拥塞控制和流量控制机制
5.TCP只是点到点之间的传输,UDP支持一对一,多对多,一对多,多对一
6.TCP的逻辑通信是双全工的可靠信道,UDP是不可信道
7.TCP首部字节开销20字节,UDP首部开销8字节

TCP开销大 稳定 传输速率慢 开销大 适合完整性要求高 不追求效率(大文件传输,文件传输)
UDP 传输速度快,效率高,开销小 不稳定 实时性要求较高场合追求速度(游戏,视频通话,视频电话等)

用UDP如何保证数据的完整性

外加校验码来保证正确性,加顺序码保证完整性,相当于把TCP保证完整性和可靠性的东西自己去完成,不需要做的太复杂

值类型和引用类型的区别

1.管理机制: 值类型是操作系统负责管理,作用于结束只有操作系统会自动释放,引用类型是垃圾回收器负责管理
2.内存分配: 值类型:被分配到变量声明的地方,局部变量分配到栈上
引用类型分配到托管堆上,变量 存储在栈中
3.赋值方式 值类型:赋值变量包含的值,引用类型:赋值对象引用的地址
4.基类值类型:继承System.ValueType;System.ValueType又继承自System.Object
引用类型:继承自System.Object

结构体和类的区别

c++

1.语法定义的区别一个是class 一个是struct
2.声明字段是否可以设置初值 结构体中字段不可设置初值 类中字段可以设置初值
3.构造函数要求 结构体的构造函数中要求所有字段赋值,类的构造函数中无限制
4.所占空间 结构体是值类型在栈中分配空间,类是引用类型,在堆上分配空间
5.处理方式 struct变量使用完成之后会自动解除内存分配,class实例有垃圾回收机制保证内存回收处理
c++中结构体与类的最大区别就是 结构体继承默认访问权限为public class为private

c#

结构体是值类型,类是引用类型
结构体存储在栈中,类存储在堆中
结构体不能继承不能写构造函数,不能写为虚 抽象 保护类型
结构体不能扩展,不能继承与被继承 而c++中不做限制

C#中的GC

GC就是内存的垃圾收集器,以应用程序root为基础,遍历应用程序在Heap上动态分配的所有对象,通过辨识他们是否被引用来确定哪些对象是死亡的,哪些是仍需要被使用的,已经不再被应用程序的root或者是别的对象所引用的就是已经死亡的对象,即所谓垃圾

优点:
1.提高了软件开发的抽象度
2.程序员可以将精力集中在实际问题上,而不是专门分心来管理内存的问题
3.可以使模块的接口更加清晰,减少模块之间的耦合
4.大大减少了因为认为不当的处理而带来的bug
5.是内存更加的使用高效

总体来说就是GC把程序员从复杂的内存问题中解放了出来,从而提高了软件的开发速度,质量和安全性

以上即是最近我刷面经遇到的高频问题,我都总结下来
希望对大家有所帮助

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值