跳至主要內容
OS5 - 进程管理3

OS

Java 线程状态

Java 没有 Ready 状态,线程状态有 6 种:

NEW              新建
RUNNABLE         可运行(包含 Ready + Running)
BLOCKED          阻塞(等待锁)
WAITING          等待(wait/join/park 等)
TIMED_WAITING    限时等待
TERMINATED       终止

codejavaCS大约 2 分钟
OS5 - 进程管理3

OS

中断切换

以线程 A 发起读取磁盘文件为例

第一阶段:发起 I/O 时的“软中断”与主动切换(线程 A 交出 CPU)

当线程 A 执行到读取文件的代码时,它其实是没有权限直接控制底层硬件的,必须向操作系统老大哥(内核)求助。

  • 系统调用(软中断/Trap): 线程 A 调用 read() 函数,这会触发一个软中断(在 x86 架构下通常是 int 0x80 指令或 syscall 指令)。CPU 收到这个信号后,会从“用户态”切换到“内核态”,开始执行操作系统的代码。
  • 下达指令与阻塞: 操作系统内核接收到请求,把读取任务交给 DMA 和磁盘控制器。因为此时数据还没准备好,操作系统会将线程 A 的状态标记为 BLOCKED(阻塞状态),并把它移出 CPU 的运行队列。
  • 第一次上下文切换(Context Switch): 既然线程 A 被挂起了,CPU 不能闲着。操作系统的调度器(Scheduler)会立刻介入,从就绪队列里挑出一个线程 B,把 CPU 的控制权交给它。
    • 此时,DMA 在默默搬运硬盘数据,而 CPU 正在全速运行线程 B 的代码。两者互不干扰。

codejavaCS大约 14 分钟
OS1 - 操作系统介绍

OS

操作系统是一个广义概念,指管理计算机硬件和软件资源的完整软件系统

包含内核 + 系统程序 + 应用软件

内核 (Kernel)是操作系统的核心组件,直接管理硬件资源的最底层软件

内核

计算机是由各种外部硬件设备组成的,比如内存、cpu、硬盘等,如果每个应用都要和这些硬件设备对接通信协议,那这样太累了,所以这个中间人就由内核来负责

让内核作为应用连接硬件设备的桥梁,应用程序只需关心与内核交互,不用关心硬件的细节

alt text

codejavaCS大约 3 分钟
OS1 - 内存管理1

OS

虚拟内存

单片机是没有操作系统的,所以每次写完代码,都需要借助工具把程序烧录进去,这样程序才能跑起来

另外,单片机的 CPU 是直接操作内存的「物理地址」

在这种情况下,要想在内存中同时运行两个程序是不可能的。如果第一个程序在 2000 的位置写入一个新的值,将会擦掉第二个程序存放在相同位置上的所有内容,所以同时运行两个程序是根本行不通的,这两个程序会立刻崩溃

操作系统是如何解决这个问题

可以把进程所使用的地址「隔离」开来,即让操作系统为每个进程分配独立的一套「虚拟地址」,人人都有,大家自己玩自己的地址就行,互不干涉


codejavaCS大约 6 分钟
OS3 - 进程管理1

OS

进程与线程的区别

进程是操作系统分配资源的最小单位,每个进程都有自己独立的内存地址空间。一个进程崩溃通常不会直接影响到其他进程(除非耗尽了系统资源)

线程是进程中的独立执行单元,是CPU分配调度的最小单位, 是操作系统真正放在 CPU 核心上去执行的实体

多个线程可以共享同一个进程的资源,如内存;每个线程都有自己独立的栈和寄存器

  • 资源拥有 进程有独立的地址空间(代码段、数据段、堆栈);线程只拥有自己的栈和寄存器,共享进程的堆、全局变量等
  • 开销 进程切换开销大(要切换页表、刷新 TLB);线程切换开销小(只切换寄存器和栈)
  • 通信 进程间通信需要 IPC 机制(管道、消息队列、共享内存等);线程间可以直接读写共享数据
  • 独立性 进程间互不影响;一个线程崩溃可能导致整个进程挂掉

codejavaCS大约 16 分钟
OS4 - 进程管理2

OS

调度

进程都希望自己能够占用 CPU 进行工作,那么这涉及到前面说过的进程上下文切换。

一旦操作系统把进程切换到运行状态,也就意味着该进程占用着 CPU 在执行,但是当操作系统把进程切换到其他状态时,那就不能在 CPU 中执行了,于是操作系统会选择下一个要运行的进程。

选择一个进程运行这一功能是在操作系统中完成的,通常称为调度程序(scheduler)。

那到底什么时候调度进程,或以什么原则来调度进程呢?

这里的进程指只有主线程的进程,所以调度主线程就等于调度了整个进程 主要是操作系统相关书籍,都是用进程调度这个名字,所以也沿用了这个名字


codejavaCS大约 15 分钟