网络编程
【1】线程和进程的区别
- 一个程序至少有一个进程,一个进程至少有一个线程
- 进程是资源分配的最小单位,线程是程序执行的最小单位
- 一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发执行
主要差别在它们是不同的操作系统资源管理方式,进程有独立的地址空间,一个进程奔溃后,在保护模式下不会对其它的进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,是共享地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但是在进程进行切换时,耗费资源较大,效率差一些,但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
每个独立的线程有一个程序运行的入口,顺序执行的序列和程序的出口,但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。从逻辑角度来看,多线程的意义在于一个应用程序中,有个多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。
多线程和多进程的区别?
1)多进程数据是分开的,共享复杂,需要用IPC,同步简单,多线程共享进程数据简单,同步复杂
2)进程创建销毁、切换复杂、速度慢
3)进程占用内存多,CPU利用率低
4)进程间不会互相影响,一个线程挂掉将导致整个进程挂掉
【2】三次握手与四次握手
三次握手过程说明: 1、由客户端发送建立TCP连接的请求报文,其中报文中包含seq序列号,是由发送端随机生成的,并且将报文中的SYN字段置为1,表示需要建立TCP连接。(SYN=1,seq=x,x为随机生成数值) 2、由服务端回复客户端发送的TCP连接请求报文,其中包含seq序列号,是由回复端随机生成的,并且将SYN置为1,而且会产生ACK字段,ACK字段数值是在客户端发送过来的序列号seq的基础上加1进行回复, 以便客户端收到信息时,知晓自己的TCP建立请求已得到验证。(SYN=1,ACK=x+1,seq=y,y为随机生成数值)这里的ack加1可以理解为是确认和谁建立连接。 3、客户端收到服务端发送的TCP建立验证请求后,会使自己的序列号加1表示,并且再次回复ACK验证请求,在服务端发过来的seq上加1进行回复。(SYN=1,ACK=y+1,seq=x+1)
四次握手过程: 由于TCP连接是全双工的,断开连接会比建立连接麻烦一点点。 1、客户端先向服务器发送FIN报文,请求断开连接,其状态变为FIN_WAIT1; 2、服务器收到FIN后向客户端发送ACK,服务器的状态围边CLOSE_WAIT; 3、客户端收到ACK后就进入FIN_WAIT2状态,此时连接已经断开了一半了。如果服务器还有数据要发送给客户端,就会继续发送; 4、直到发完数据,就会发送FIN报文,此时服务器进入LAST_ACK状态; 5、客户端收到服务器的FIN后,马上发送ACK给服务器,此时客户端进入TIME_WAIT状态; 6、再过了2MSL长的时间后进入CLOSED状态。服务器收到客户端的ACK就进入CLOSED状态。至此,还有一个状态没有出来:CLOSING状态。
CLOSING状态表示: 客户端发送了FIN,但是没有收到服务器的ACK,却收到了服务器的FIN, 这种情况发生在服务器发送的ACK丢包的时候,因为网络传输有时会有意外。
【3】自旋锁和互斥锁的区别?
【4】什么是原子操作?
原子操作是指不会被线程调度机制打断的操作,这种操作一旦开始,就会一直运行到结束
【5】什么是滑动窗口?
TCP协议里窗口机制有2种,
【6】TCP重发机制怎么实现的?
1.滑动窗口机制
2.选择重传
服务器开发
【1】帧同步与状态同步的理解
所谓同步,就是要多个客户端表现效果是一致的
最大的区别就是战斗核心逻辑写在哪,状态同步的战斗逻辑在服务端,帧同步的战斗逻辑在客户端
在状态同步下,客户端更像是服务端数据的表现层
- 流量:状态同步比帧同步的流量消耗大,每次改变都需要同步属性,服务器压力更大
- 安全性:状态同步比帧同步高,逻辑和数据都在服务端,
- 断线重连:状态同步更好做,
【2】怎么断线重连?
【3】卡帧怎么处理?
【4】帧同步与状态同步实现的方法?