操作系统
操作系统位于用户程序和硬件之间,通过系统调用提供接口可以让应用程序去使用硬件,但是硬件资源的管理和安全控制由操作系统负责。
用户空间和内存空间
在计算机系统中,内存可以分为两大区域:内核空间(Kernel Space)和用户空间(User Space)。
- 内核空间,是 操作系统内核代码及其运行时数据结构所在的内存区域,拥有对系统所有资源的完全访问权限,如进程管理、内存管理、文件系统、网络堆栈等。
- ⽤户空间,是 操作系统为应用程序(如用户运行的进程)分配的内存区域,用户空间中的进程不能直接访问硬件或内核数据结构,只能通过系统调用与内核通信。
- 当程序 使⽤⽤户空间 时,我们常说该程序在 ⽤户态 执⾏,⽽当程序 使内核空间 时,程序则在 内核态 执⾏。
- 内核态(Kernel Mode):在内核态下,CPU可以执行所有的指令和访问所有的硬件资源。这种模式下的操作具有更高的权限,主要用于操作系统内核的运行。
- 用户态(User Mode):在用户态下,CPU只能执行部分指令集,无法直接访问硬件资源。这种模式下的操作权限较低,主要用于运行用户程序。
进程和线程
进程上下文切换
上下文切换是操作系统在多任务处理环境中,将 CPU 从一个进程切换到另一个进程的过程。
- 保存当前进程的上下文:操作系统保存当前进程的 CPU 寄存器,程序状态等关键信息。
- 程序计数器(PC):保存当前指令的地址,比如指向 Fibonacci 计算的下一条指令(假设是 ADD R1, R2)。
- 栈指针(SP):记录进程 A 的栈顶位置,可能指向保存局部变量的内存地址。
- 通用寄存器(R0, R1, R2 等):比如 R1 保存当前计算的 Fibonacci 值(如 13),R2 保存前一个值(如 8)。
- 状态寄存器(PSR):记录 CPU 的状态(如是否溢出、当前特权级别等)。
- 除了寄存器,操作系统还会保存其他关键信息到 PCB
- 进程 A 的状态(从“运行”变为“就绪”)。
- 当前使用的内存页表地址(确保恢复时能访问正确的内存)。
- 打开的文件描述符(如果有)。
进程的上下文切换不仅包含了虚拟内存、栈、全局变量等用户空间的资源,还包括了内核堆栈、寄存器等内核空间的资源
进程调度算法
多个进程竞争 CPU,CPU怎么分配?
进程之间的通信
进程是独立的执行实体,拥有独立的地址空间,因此进程间通信需要通过操作系统提供的机制跨越地址空间的隔离。
常见方式包括:
用户线程和内核线程
- 用户线程:由用户态的线程库(如 POSIX Pthreads 的某些实现)管理,操作系统内核并不直接感知这些线程。
- 内核线程:内核直接管理,拥有独立的线程控制块(TCB),可以被内核调度。
- 用户线程和内核线程的映射:1:1,N:1;N:M。因为多核 CPU现在Linux和Windows采用 1:1 模型。
线程切换
线程切换比进程切换快是因为线程共享同一进程的地址空间和资源,线程切换时只需切换堆栈和程序计数器等少量信息,而不需要切换地址空间,避免了进程切换时需要切换内存映射表等大量资源的开销,从而节省了时间和系统资源 。
线程通信
线程通信—java
死锁四个条件
- 互斥
- 持有并等待
- 不可剥夺
- 环路等待
破除死锁只需要消灭一个条件
银行家算法分配资源
银行家算法的核心思想,就是在分配给进程资源前,首先判断这个进程的安全性,也就是预执行,判断分配后是否产生死锁现象。
就是看 一套流程下来是不是都能满足“剩余需求是不是小于可用资源”。