第一章

操作系统概述

基本概念

操作系统的接口

进程与线程

进程的引入

进程的状态及转换

进程的描述

进程的控制

线程

import multiprocessing
import time
import os
def child_process(char):
print(f"Child process {char} (PID {os.getpid()}) is running.")
time.sleep(2)
print(f"Child process {char} (PID {os.getpid()}) is done.")
def parent_process():
print(f"Parent process A (PID {os.getpid()}) is running.")
# 创建第一个子进程
process1 = multiprocessing.Process(target=child_process, args=("B",))
process1.start()
# 创建第二个子进程
process2 = multiprocessing.Process(target=child_process, args=("C",))
process2.start()
# 等待两个子进程结束
process1.join()
process2.join()
print("Parent process A is done.")
if __name__ == "__main__":
parent_process()

处理器调度

进程调度

  • 周转时间: 完成时间-到达时间
  • 带权周转时间: 周转时间 / 服务时间
  • 等待时间:周转时间-服务时间

第一问

进程 到达时间 服务时间 优先级 开始时间 完成时间 等待时间
P1 0 9 1 0 9 0
P2 1 4 3 19 23 18
P3 2 8 2 23 31 21
P4 3 10 4 9 19 6

P1->P4->P2->P3

第二问

进程 到达时间 服务时间 优先级 开始时间 完成时间 等待时间
P1 0 9 1 0 31 22
P2 1 4 3 1 15 10
P3 2 8 2 15 23 13
P4 3 10 4 3 13 0
进程 服务时间 优先级 开始时间 完成时间 周转时间
P1 10 3 0 10 10
P2 1 1 10 11 11
P3 2 3 16 18 18
P4 1 4 18 19 19
P5 5 2 11 16 16

有一个就绪队列,是按照先来先服务进行的

作业名 到达时间 运行时间 优先级 进入内存时间 开始时间 完成时间 周转时间
P1 8:00 50 4 8:00 8:00 10:00 120
P2 8:20 40 5 8:20 8:20 9:00 40
P3 8:30 60 3 10:00 10:00 11:00 150
P4 8:50 30 6 9:00 9:00 9:30 40

进程同步与死锁

进程同步的基本概念

选B,我也不知道为啥😥😥😥😥

信号量机制

选D,Peterson算法是双标志后检查法的改进,那么turn就是避免互相谦让导致进程饥饿的关键点。

  1. 多个进程,先V后P
  2. 单个进程,先P后V

生产者消费者问题

死锁

关于第三问,在(2)的基础上,可利用的还剩下(2,3,0),小于P4所需要的,不可分配。

存储管理

存储管理的基本概念

连续存诸空间管理

分段存储管理

分页存储管理

分页是把整个虚拟和物理内存空间切成一段段固定尺寸的大小。这样一个连续并且尺寸固定的内存空间,我们叫Page)。在 Linux 下,每一页的大小为 4KB

如果内存空间不够,操作系统会把其他正在运行的进程中的「最近没被使用」的内存页面给释放掉,也就是暂时写在硬盘上,称为换出Swap Out)。一旦需要的时候,再加载进来,称为换入Swap In)。所以,一次性写入磁盘的也只有少数的一个页或者几个页,不会花太多时间,内存交换的效率就相对比较高。

一个页表对一块连续的内存进行随机映射,不过,要把这块内存映射满。

这里的H表示16进制

注意页号大小和页大小

一个进程一个页表,由于进程太多,会导致页表变多,页表所需要的内存会变大,引入多级页表

局部性原理:程序在某个时刻很可能会访问最近已经访问过的数据或指令。

如果使用了二级分页,一级页表就可以覆盖整个 4GB 虚拟地址空间,但如果某个一级页表的页表项没有被用到,也就不需要创建这个页表项对应的二级页表了,即可以在需要时才创建二级页表。做个简单的计算,假设只有 20% 的一级页表项被用到了,那么页表占用的内存空间就只有 4KB(一级页表) + 20% * 4MB(二级页表)= 0.804MB,这对比单级页表的 4MB 是不是一个巨大的节约?

把最常访问的几个页表项存储到访问速度更快的硬件,于是计算机科学家们,就在 CPU 芯片中,加入了一个专门存放程序最常访问的页表项的 Cache,这个 Cache 就是 TLBTranslation Lookaside Buffer) ,通常称为页表缓存、转址旁路缓存、快表等。

TLB命中率

第一问为什么乘以2?

在页式存储技术中,我介们可看到每次存取数据,就要做两次访问内存的工作,一次是地址转换查页表时要作一次访问内存的工作,然后是根据转换后的物理地址访问内存存取数据,这样存取速度降低一倍,将会影响整个系统的使用效率。

选做

在二级页表的分页存储管理方式下,逻辑地址结构为页表目录号、页号、页内偏移。给定逻辑地址空间大小为 (2^16) 页,我们需要确定至少有多少页目录项。

首先,计算一页的大小:

  • 页大小为 1KB=2^10字节。

然后,计算一页表所能包含的页表项数:

  • 页表项大小为 2 字节,因此一页表可以包含(2^10)/2=2^9 个页表项。

最后,计算整个逻辑地址空间的页目录表中包含的表项数:

  • 逻辑地址空间大小为 (2^16) 页,每个页目录项对应一页表,因此至少需要 (2^16 / 2^9 = 2^7) 个页目录项。

因此,整个逻辑地址空间的页目录表中至少包含 (2^7) 个表项。

虚拟存储

局部性原理

局部性原理是计算机科学中一个基本的概念,它指出在程序执行期间,对数据或指令的访问具有一定的局部性,即程序在某个时刻很可能会访问最近已经访问过的数据或指令。这个原理主要包含两个方面:时间局部性和空间局部性。

  1. 时间局部性(Temporal Locality): 时间局部性指的是在一段时间内,如果程序访问了某个存储位置,那么在不久的将来,程序很可能再次访问相同或附近的存储位置。这反映了很多计算机程序中循环结构的特性,即程序在执行循环时会多次访问相同的数据。

  2. 空间局部性(Spatial Locality): 空间局部性指的是如果程序访问了某个存储位置,那么在不久的将来,程序很可能会访问在物理内存中相邻的存储位置。这体现在计算机程序中的数组访问、顺序执行的代码等情况,即程序在一段时间内可能会依次访问相邻的存储单元。

页面置换算法

最佳页面算法

最佳页面算法(Optimal Page Replacement Algorithm)是一种页面置换算法,其主要思想是选择最长时间内不再被访问的页面进行置换

什么是缺页,就是线程加载进来的过程(交换过程)。

先进先出(FIOF)

选择最先进入内存的页面被置换

异常现象:当分配给进程的物理页面数增加时, 缺页次数反而增加

最近最久未用置换(LRU)

选择在最近一段时间最久未使用的页面予以置换

设备管理

磁盘设备管理

磁盘组成

磁盘访问时间

磁盘调度算法

先来先服务FCFS

最短寻道时间优先SSTF

电梯调度算法

综合练习

这里就不放详细答案了,自己看

TODO

  • 加入实验内容

人生是旷野而非轨道,当你有能力的时候,一定要去帮助他人。🤣🤣🤣

2023-11-28日写