进程调度算法
总的来说分为两类:1. 非剥夺调度 2. 剥夺调度
-
先来先服务调度算法,不可剥夺
-
短作业优先调度算法
选择估计运行时间最短的作业,对长作业不利,可能导致长作业饿死。短作业优先调度算法的平均等待时间、平均周转时间最少
-
优先级调度算法
每次选择优先级最高的一个或几个作业。根据是否可以抢占CPU资源分为分为非剥夺式和剥夺式,根据优先级是否可变分为静态优先级和动态优先级。
-
高响应比优先调度算法
主要用于作业调度,相应比 = (等待时间 + 要求服务时间)/ 要求服务时间
-
时间片轮转调度算法
主要用于分时系统,1-4主要用于批处理系统。总是选择就绪队列中第一个进程执行,但仅能运行一个时间片。时间片长短的相关因素:系统的响应时间、就绪队列中的进程数目和系统的处理能力
-
多级反馈队列调度算法
基于时间片轮转算法,多级反馈队列调度算法设置多个队列,每个队列的优先级和时间片大小不同,进程在第一个队列没执行完,就会被移到下一个队列。仅当前面的队列全为空时,才能调度当前队列上的进程。
进程间通信IPC
- 共享内存
- 管道(匿名管道和有名管道)
- 消息队列
为什么说进程切换比线程切换开销大
因为进程是操作系统分配资源的最小单位,进程切换的时候需要保持的上下文比线程更多,从而开销更大。此外,每个进程都有一个页表,操作系统根据进程的页表实现虚拟地址到物理地址的映射,而页表查找是很慢的(在6.s801中介绍一次页表查找需要访问3次内存,其页表使用3层结构来节省空间),因此操作系统使用TLB(Translation Lookaside Buffer)来缓存页地址(虚拟地址到物理地址的映射关系),加速页表查找。当进程切换的时候,TLB缓存需要刷新,因此虚拟地址到物理地址的转换也变慢了。而线程因为共用进程的地址空间,所以线程的切换不会导致TLB刷新,只需要切换线程私有的堆栈等上下文就行。所以即使有COW(Copy-on-Write)等技术使进程的切换速度也变得很快,但是进程切换的开销仍然很大。
TCP
可以看到TCP头部最少20个字节,IP头部最少也是20个字节。
其中控制位:
- ACK:该位为
1时,「确认应答」的字段变为有效,TCP 规定除了最初建立连接时的SYN包之外该位必须设置为1。 - RST:该位为
1时,表示 TCP 连接中出现异常必须强制断开连接。 - SYN:该位为
1时,表示希望建立连接,并在其「序列号」的字段进行序列号初始值的设定。 - FIN:该位为
1时,表示今后不会再有数据发送,希望断开连接。当通信结束希望断开连接时,通信双方的主机之间就可以相互交换FIN位置为 1 的 TCP 段。
IP 层是「不可靠」的,它不保证网络包的交付、不保证网络包的按序交付、也不保证网络包中的数据的完整性。TCP 是一个工作在传输层的可靠数据传输的服务,它能确保接收端接收的网络包是无损坏、无间隔、非冗余和按序的。TCP 是面向连接的、可靠的、基于字节流的传输层通信协议。
- 面向连接:一定是「一对一」才能连接,不能像 UDP 协议 可以一个主机同时向多个主机发送消息
- 可靠的:无论的网络链路中出现了怎样的链路变化,TCP 都可以保证一个报文一定能够到达接收端
- 字节流:消息是「没有边界」的,所以无论我们消息有多大都可以进行传输。并且消息是「有序的」,当「前一个」消息没有收到的时候,即使它先收到了后面的字节已经收到,那么也不能扔给应用层去处理,同时对「重复」的报文会自动丢弃
TCP连接
连接:用于保证可靠性和流量控制维护的某些状态信息,这些信息的组合,包括Socket、序列号和窗口大小称为连接
其中socket由目标IP和端口组成,指示了连接的另一头的地址。序列号用来解决乱序传输。窗口大小用来做流量控制
3次握手
最开始,客户端处于close状态,服务端处于listen状态(监听自己某端口)
- 客户端随机初始化
序列号,置SYN为1,表示 SYN报文,该报文不包含应用层数据,之后客户端处于SYN-SENT状态 - 服务端收到SYN报文之后也初始化
序列号,把确认应答号置为客户端传过来的序列号+1,再置SYN和ACK为1,该报文也不包含数据,之后服务端处于SYN-RCVD状态 - 客户端置
ACK为1,确认应答号填入服务端的序列号+1,本次报文可以携带数据,之后客户端处于ESTABLISHED状态
The principle reason for the three-way handshake is to prevent old duplicate connection initiations from causing confusion.
三次握手的首要原因是为了防止旧的重复连接初始化造成混乱。
在两次握手之后,客户端如果发现收到的序列号是过时的序列号就可以发送RST,终止这次连接。
序列号是TCP可靠传输的关键因素,序列号的作用:
- 接收方可以去除重复的数据;
- 接收方可以根据数据包的序列号按序接收;
- 可以标识发送出去的数据包中, 哪些是已经被对方收到的;
序列号$ ISN = M + Hash (localhost, localport, remotehost, remoteport)$
4次挥手
双方都可以主动断开连接,假设客户端发起断开连接
- 置
FIN为1,客户端进入FIN_WAIT_1状态 - 服务端收到
FIN后回复ACK,服务器进入CLOSED_WAIT状态,客户端收到ACK之后进入FIN_WAIT_2,等待服务器发送FIN - 服务器发送
FIN,进入LAST_ACK状态 - 客户端收到
FIN,回复一个ACK,并进入TIME_WAIT状态,服务器在收到这个ACK之后进入CLOSE状态 - 最后客户端在经过2MSL之后进入
CLOSE状态
需要四次挥手的原因是,关闭连接时,客户端向服务端发送 FIN 时,仅仅表示客户端不再发送数据了但是还能接收数据。服务器收到客户端的 FIN 报文时,先回一个 ACK 应答报文,而服务端可能还有数据需要处理和发送,等服务端不再发送数据时,才发送 FIN 报文给客户端来表示同意现在关闭连接。
MSL 是 Maximum Segment Lifetime,报文最大生存时间,任何报文在网络上存在的最长时间。
IP 头中有一个 TTL 字段,是 IP 数据报可以经过的最大路由数,每经过一个处理他的路由器此值就减 1,当此值为 0 则数据报将被丢弃,同时发送 ICMP 报文通知源主机。
最后客户端要等待2MSL。等待2MSL
-
原因一:防止旧连接的数据包
如果没有等待2MSL马上进入
CLOSE状态,之后相同端口的TCP被复用,这是可能会收到上次连接的过期报文 -
原因二:保证连接正确关闭
TIME-WAIT - represents waiting for enough time to pass to be sure the remote TCP received the acknowledgment of its connection termination request.
如果服务端没有收到客户端的ACK,会超时重传FIN,那么A再次接到重传的FIN,会再次发送ACK,这一来一回就是2MSL。确保服务端也可以正常关闭连接。
TCP可靠传输
- 校验
- 序号
- 确认
- 重传
TCP拥塞控制
拥塞控制控制的是整个网络的拥塞,流量控制控制的是发送端的发送速率。
-
慢开始和拥塞避免
慢开始表示,拥塞窗口(cwnd)刚开始的时候等一1,然后在没有碰到阈值(ssthresh)和网络拥塞之前呈指数增长(每次加一倍)。达到ssthresh时执行拥塞避免,即cwnd呈线性增长(每次加1)。发送方检测到超时事件时执行拥塞处理,ssthresh=cwnd/2,cwnd=1,然后重新开始慢开始。
-
快重传和快恢复
快重传对应了TCP重传机制中的快速重传。慢开始和拥塞避免是在发生超时事件的时候才开始处理网络拥塞(ssthresh=cwnd/2,cwnd=1),而快重传是在连续收到三个重复的确认应答号之后开始处理网络拥塞。收到三个重复的确认应答号之后开始处理网络拥塞,即快恢复。ssthresh=cwnd/2,cwnd=cwnd/2,然后开始拥塞避免(cwnd线性增加,每次加1)
数据在链路层会被分成数据帧,最大帧长度是1500字节,1500就是MTU(max transmission unit)能达到的最大值,MTU是由硬件规定的。而MSS(Maximum Segment Size)是TCP分段的最大大小,为MTU减去40个字节的IP和TCP包头。
键入网址发生什么
-
浏览器解析URL,解析出来WEB服务器和文件的路径。
-
根据1解析出来的信息生成HTTP请求报文。
-
查询WEB服务器的IP地址(DNS)
-
操作系统协议栈——TCP,TCP是基于进程到进程的通信
- 三次握手
- 按照MSS将HTTP报文分割成报文段
-
操作系统协议栈——IP,将数据分装成数据包,IP是基于机器到机器的通信
源IP——多网卡可以通过路由表查询
目标IP——DNS解析得到
在 IP 协议里面需要有源地址 IP 和 目标地址 IP,然后根据路由表查看具体怎么走
-
操作系统协议栈——MAC
源MAC,网卡固件中获取
目标MAC,使用ARP(地址解析协议)在以太网中广播获得,先是查看ARP缓存
-
网卡——将数据包转化为电信号
-
交换机,交换机工作在MAC层
-
路由器,基于IP层设计,MAC 头部的作用就是将包送达路由器,因此路由器会丢弃MAC 头部
限流算法
- 固定窗口算法
- 滑动窗口算法
- 令牌桶算法
- 漏桶算法