1. 进程和线程
1. 什么是进程,线程 ,以及区别
进程
- 进程是操作系统进行资源分配和调度的基本单位,它是程序执行的实列。
- 进程拥有独立的地址空间,一个进程的崩溃并不会到其他进程的运行,进程间的通信需要特殊的机制,比如 管道,队列 ,信号量等等。
- 进程执行开销大,但是利于资源的管理和保护。
线程
- 线程是进程的执行单元,也被称为轻量级别的进程。一个进程包含多个线程,他们共享进程的资源。
- 线程间的通信可以通过直接读写进程的数据来实现,更高效,但同时也就意味着,一个线程崩溃会影响到其他线程。
- 线程的执行开销小,但不利于资源的管理和保护
2. 进程的有几种状态
进程状态:
- 创建
- 就绪
- 运行(获得cpu资源,被系统调度,进入运行状态,时间片用完进入就绪状态)
- 阻塞
- 终止
3. 进程间的通讯方式有哪些,各有什么优点
主要方式有:
- 管道(pipe):适合有亲缘关系的进程间通讯, 是一种半双工通讯方式,数据只能单向流动。
- 命名管道(FIFO): 除了具有管道的功能之外 , 没有亲缘关系的进程间也能进行通讯。
- 信号量(semophore): 是一种计数器,主要用来实现进程间的同步和互斥,用来控制多个进程对共享资源的访问。
- 消息队列(message queue):是由消息组成的链表,存储在内核中,可实现任意进程之间的通讯。
- 信号量(singnal):主要用来实现进程间的同步
- 套接字(socket):用于不同主机之间的通讯,适用于网络通讯。
- 共享内存:允许多个进程访问同一块进程空间,速度快,但需要处理同步问题
自旋锁(SpinLock)和互斥量(Mutex) 以及二者的区别
自旋锁和互斥量都是为了处理多线程或者多核环境 并发访问的同步机制,它们的目的一样但是具体实现又是不同的。
自旋锁(SpinLock)
- 自旋锁(SpinLock)是一种低级同步机制,用于保护很短的代码段: 比如 增加计数器,修改一个标志位等等
- 当一个线程想到获得 已经被获得的互斥锁时,他只能一直进行等待,直到互斥锁被释放,这就将会浪费cpu的资源
- 由于自旋锁不会使得进行进入休眠状态, 所以它适用于 时间短效率高的场景。
互斥量(Mutex)
- 互斥量是一种高级的同步机制,用于保护代码执行时间长的操作,如修改和访问复杂的数据结构等
- 当一个进程想要尝试获得一个已经被持有的互斥量时,它会进入等待过程,直到互斥量可以被再次适用,这样的等待过程是不会消耗cpu资源的
- 互斥量设计到线程的唤醒和休眠,相对于互斥锁有更高的开销,适用于会长时间持有锁的情况。
它们之间的主要区别:
- 等待机制:自旋锁让线程在等待锁的过程中处于忙等(自旋)状态,消耗CPU资源;而互斥量在等待时使线程休眠,不消耗CPU资源。
- 使用场景:自旋锁适用于执行时间极短的操作;互斥量适用于执行时间较长的操作。
- 系统开销:自旋锁的开销较低,但在等待时会消耗CPU;互斥量的开销较高,主要体现在线程休眠和唤醒的过程中。
- 内核抢占: 互斥锁 不允许内核抢占 。 而互斥量允许内核进行抢占,所以持有信号量的代码可以被抢占
自旋锁和互斥量可以睡眠嘛?为什么
自旋锁不可以睡眠, 信号量可以睡眠
原因
- 自旋锁禁止处理器抢占的,而信号量不禁止处理器抢占
- 基于这个原因,如果自旋锁睡眠了,用于不能进行处理器抢占,那系统的其他相应也得不到运行,导致系统不能正常工作
- 信号量在临界区睡眠以后,其他进程可以用抢占式的方式继续运行,可以使得睡眠的进程获得资源而被唤醒,从而恢复正常的代码运行
- 自选锁睡眠的情况也包括多核cpu和中断的情况, 自旋锁睡眠的时候只有当前的cpu禁止抢占,不影响其他cpu的运行。
- 自旋锁睡眠时,如果允许中断处理,那么中断的代码是可以正常允许的,但是中断不会唤醒自旋锁,因此系统任然允许不正常。
TCP 和UDP
TCP ,UDP 的概念
- TCP(Transmission Control Protocol) 传输控制协议 :是一种面向连接的,可靠的,基于字节流的传输通信协议 ,它确保数据的有效性和顺序性,适合可靠性搞的应用场景。在传输前,需要先建立连接,通过三次握手来确定双方准备就绪
- UDP (User Datagram Protocol) 用户数据包协议:是一种无连接的数据传输协议 。 它并不保证数据的可靠性和顺序性,适用于对实时性较高的应用。
TCP 的连接的三次握手
为了保证信息的可靠性和顺序性 ,TCP采用三次握手保证双方接收和收发能力都是正常的
- 第一次握手:客户端(Client)向服务器(Server)发送一个同步序列包(SYN),客户端进入到SYN_SEND 状态,等待服务器确认
- 第二次握手:此时服务器收到了客户端的SYN包,此时必须确认(ACK)客户端的SYN包 ,同时自己也发送一个SYN包,此时服务器进入到SYN_RECV状态
- 第三次握手:客户端接收到服务器的SYN+ ACK 包, 想服务器发送确认包ACK ,此包发送完毕,双方都进入到ESTABLISHED 状态,完成三次握手双方开始发送数据。
TCP 的断开的四次握手
当TCP连接的一方完成数据的传输后,需要发送一个FIN来关闭连接,由于TCP时全双工的,每个方向都必须单独关闭,这个过程需要四次握手:
- 第一次握手:当主机A 认为数据发送完成后,它需要发送一个FIN来终止数据传输
- 第二次握手:当主机B收到这个FIN ,它发送一个ACK给主机A, 确认序列号为收到序号+1 , 这个ACK也就是说“我知道你要关闭连接了”
- 第三次握手:主机B如果数据也发送完毕,将向主机A发送FIN,用来关闭向主机A 的数据传输
- 第四次握手:当主机A收到这个FIN后,发送一个ACK给B,确认序号为收到序号+1,然后让主机A进入到TIME_WAIT状态,这个状态会持续2MSL(最大报文寿命)时间,足够主机B收到这个最终的ACK
进行四次握手的目的是为了确保双方数据完全传输完毕,然后再关闭连接。这样可以防止已经关闭的连接中还有遗留的数据包在网络中,确保双方都能正常关闭连接