基础问答【二】

网络编程

【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】帧同步与状态同步实现的方法?

 

posted @ 2021-07-05 10:47  欧阳图图的少年成长记  阅读(81)  评论(0编辑  收藏  举报