跳转至

进程与线程

进程

进程实体

由代码段、相关数据和PCB组成

image-20260821172234651image-20260821172241635image-20260821172246587

进程映像

  1. 每个进程的虚拟地址空间都是独立的,且每个进程都认为自己独占了整个主存空间。
  2. 为了把某个程序跑起来,需要在主存空间中划出一部分区域专门存放跑起来需要的东西,这段空间和空间里的东西就叫做进程映像。

下图中操作系统内核区也包含在了进程映像中,这里并非意味着每个进程都拥有内核,而是指的是只要访问这部分地址就代表着要申请内核服务。

image-20260821173001504

image-20260821173026941

进程状态

  1. 创建进程的原因主要有:用户登录、高级调度、系统处理用户程序的请求、用户程序的应用请求。
  2. 当系统调用执行完时,会导致CPU从内核态转为用户态。

image-20260821192623523

进程控制

勘误:第二行是“为程序”,而不是“微程序”

  1. 图中提到撤销父进程时,也必须同时撤销所有的子进程是错误的,只是有些操作系统如此。在408考试中,当操作系统终止进程时,所有的进程资源(如内存空间、进程控制块、设备、打开文件、I/O缓冲区等)都会被释放,撤销父进程时,不一定会撤销所有的子进程。

image-20260821192924598

  1. 决定这个主存能进多少个进程的是PCB空间。

进程通信

image-20260821193619187

线程

基本概念

  1. 因为进程太大,调度起来开销大,因此开发了线程。
  2. 线程也称为轻量级进程,但并不是说所有线程都比进程小,主要是因为同进程内的线程之间切换不需要切换虚拟地址空间(页表),从而降低了开销。

image-20260821193734025

实现方法

  1. 核心概念辨析

1. 用户级线程 (ULT) —— “操作系统的黑户”

  • 管理者:完全由用户空间的线程库管理,操作系统(内核)感知不到它的存在。
  • 调度者:线程库(运行在用户态)。
  • 并发能力:极低。同一进程内的所有 ULT 只能被分配到一个 CPU 核心上运行。

2. 内核级线程 (KLT) —— “CPU 调度的基本单位 / 中间人”

  • 管理者:操作系统内核直接管理,其线程控制块(TCB)存放在内核空间。
  • 运行状态:既可以在用户态执行普通用户代码,也可以在发起系统调用后,切换到内核态执行内核代码。
  • 并发能力:高。可以被内核分配到多个 CPU 核心上真正并行。

  • 为什么切换开销有天壤之别?

  • 内核级线程切换慢的原因: 因为 KLT 是归操作系统管的,它的“户口本”(TCB) 存放在内核空间。当进行线程切换时(无论是因为时间片耗尽触发的硬件中断,还是线程自己发起的系统调用),CPU 都必须切换到内核态,唤醒操作系统的调度程序来完成切换,然后再回到用户态。这种反复的权限状态翻转导致开销很大。

  • 用户级线程切换快的原因: 因为操作系统根本看不到 ULT,它完全归我们应用程序里的线程库管。ULT 的切换纯粹是用户态代码里的“私下交接”,完全不需要惊动操作系统(不需要陷入内核),全程在用户态下完成,所以切换速度极快,开销极小。

image-20260822155519593

image-20260821194004988

CPU调度

进程调度

  1. 进程调度只是决定接下来谁上,把进程换上CPU是分派程序的任务。

image-20260821194520782

调度时机

image-20260821194536440

调度目标

image-20260821194551817

调度算法

image-20260821195526838

image-20260821195539141

image-20260821195548540

同步与互斥

同步机制准则

image-20260821200401788

同步互斥机制

软件

image-20260821201934798

单标志法因为只有进入临界区后才能该turn,因此如果进程不访问临界区了那另一个进程也没机会进临界区了。

image-20260821201943960

  1. 以上四种都违背了让权等待,因为都有while;就算进不去临界区还是会占用CPU。
  2. flag是自己想要进入临界区,turn是谦让。

硬件

image-20260821202743654

  1. Test-and-Set就是TS就是TSL
  2. 前两个都是在加锁,本质是一样的。

管程

image-20260821203429267

把PV操作封装成对象的思想。!!但是,管程中的PV操作并没有对资源数目进行修改,这与普通的PV操作不同的一点!!

死锁

定义

image-20260821204551073

产生死锁的必要条件

image-20260821204608606

死锁的处理策略

image-20260821204636436

  1. 死锁一定饥饿,饥饿不一定死锁。

  2. 死锁预防是最严苛的,直接破坏了四个条件之一,因此可以确保系统不发生死锁。

  3. 银行家算法并不能判断系统是否处于死锁状态。
  4. 限制用户申请资源顺序的只有死锁预防,如通过顺序分配资源来破坏循环等待。