操作系统(2) - 进程管理

操作系统的进程管理是操作系统的核心功能之一,负责创建、调度、同步、通信和终止进程。进程管理的目标是确保系统资源的有效利用,提高系统的性能和可靠性。以下是操作系统进程管理的主要概念和技术的详细说明。

1. 进程的基本概念

  • 进程:进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位。一个进程包含程序代码、数据、堆栈和执行上下文等。
  • 进程状态:进程在生命周期中会经历不同的状态,主要包括:
    • 就绪态(Ready):进程已经准备好,等待 CPU 资源。
    • 运行态(Running):进程正在 CPU 上执行。
    • 阻塞态(Blocked):进程因等待 I/O 操作完成或其他事件而暂停执行。
    • 终止态(Terminated):进程已经完成或被终止。

2. 进程控制块(PCB)

进程控制块(Process Control Block, PCB)是操作系统用来管理和控制进程的数据结构,包含以下信息:

  • 进程标识符(PID):唯一标识进程的编号。
  • 处理器状态:包括程序计数器(PC)、寄存器内容等。
  • 内存管理信息:包括内存分配情况、页表等。
  • I/O 状态信息:包括打开的文件、I/O 设备状态等。
  • 会计信息:包括进程的优先级、运行时间等。
  • 状态信息:包括进程的当前状态(就绪、运行、阻塞、终止)。

3. 进程创建

  • 创建新进程:操作系统通过 fork()CreateProcess() 等系统调用创建新进程。
  • 父子关系:创建新进程的进程称为父进程,新创建的进程称为子进程。
  • 资源继承:子进程可以继承父进程的资源,如打开的文件、信号处理函数等。

4. 进程调度

  • 调度算法:操作系统使用不同的调度算法来决定下一个执行的进程。常见的调度算法包括:
    • 先来先服务(FCFS):按进程到达的顺序调度。
    • 短作业优先(SJF):优先调度预计运行时间最短的进程。
    • 优先级调度:根据进程的优先级进行调度。
    • 时间片轮转(RR):每个进程按固定的时间片轮流执行。
    • 多级反馈队列:结合多种调度策略,根据进程的行为动态调整优先级。

5. 进程同步

  • 临界区:一段代码区域,同一时刻只允许一个进程执行。
  • 互斥锁(Mutex):用于实现互斥访问的机制。
  • 信号量(Semaphore):用于控制对共享资源的访问,包括二进制信号量和计数信号量。
  • 条件变量:用于进程间的条件同步。

6. 进程通信

  • 共享内存:允许多个进程共享同一块内存区域,提高数据传输效率。
  • 消息传递:进程间通过发送和接收消息进行通信,包括管道(Pipe)、消息队列等。
  • 信号(Signal):用于进程间的异步通信,发送信号可以中断进程的正常执行。
  • 套接字(Socket):用于网络进程间的通信。

7. 进程终止

  • 正常终止:进程完成任务后正常退出。
  • 异常终止:进程因错误或外部干预而被终止。
  • 僵尸进程:进程已经终止,但其父进程尚未调用 wait()waitpid() 获取其退出状态。
  • 孤儿进程:父进程终止后,子进程成为孤儿进程,由 init 进程(PID 为 1)接管。

操作系统(1) - 内存管理

操作系统的内存管理是计算机系统中的一个核心组件,负责管理和分配计算机的内存资源。有效的内存管理可以提高系统的性能和稳定性。以下是操作系统内存管理的主要概念和技术的详细说明。

1. 内存层次结构

现代计算机系统中的内存层次结构通常包括以下几个层级:

  • 寄存器(Registers):CPU内部的高速缓存,访问速度最快,但容量最小。
  • 高速缓存(Cache):位于CPU和主内存之间,分为L1、L2和L3缓存,访问速度较快,容量适中。
  • 主内存(Main Memory):RAM(随机存取存储器),直接由CPU访问,用于存储正在运行的程序和数据。
  • 辅助存储(Secondary Storage):硬盘、SSD等,用于存储大量的数据和程序,访问速度较慢,但容量大。

2. 内存管理的主要任务

  • 内存分配:为进程分配所需的内存空间。
  • 内存回收:回收不再使用的内存空间。
  • 地址转换:将程序中的逻辑地址转换为物理地址。
  • 内存保护:防止进程访问不属于它的内存区域。
  • 内存共享:允许多个进程共享同一块内存区域。
  • 虚拟内存:扩展物理内存,使用磁盘空间作为虚拟内存的一部分。

3. 内存分配技术

  • 连续内存分配

    • 单一连续分配:整个内存分为系统区和用户区,每个用户进程独占用户区。
    • 分区分配:内存被划分为多个固定或动态大小的分区,每个分区分配给一个进程。
  • 非连续内存分配

    • 分页(Paging):将内存和磁盘空间划分为固定大小的页面,通过页表进行地址转换。
    • 分段(Segmentation):将内存划分为可变大小的段,每个段对应程序的一个逻辑部分,通过段表进行地址转换。
    • 段页式(Segmented-Paging):结合分段和分页,先将内存划分为段,再将每个段划分为页。

4. 虚拟内存

  • 概念:虚拟内存是一种内存管理技术,允许程序使用的地址空间大于实际物理内存的大小。
  • 页面置换算法
    • FIFO(先进先出):最早进入内存的页面最先被替换。
    • LRU(最近最少使用):最近最少使用的页面最先被替换。
    • Optimal(最佳置换算法):选择将来最长时间内不会被访问的页面进行替换。
    • Clock(时钟算法):类似于FIFO,但增加了“使用位”来决定是否替换页面。
    • LFU(最不经常使用):使用次数最少的页面最先被替换。

5. 地址转换

  • 逻辑地址:程序中的地址,也称为虚拟地址。
  • 物理地址:内存中的实际地址。
  • 页表:用于将逻辑地址转换为物理地址的表格。
  • 段表:用于将段号转换为段的基地址和长度的表格。

6. 内存保护

  • 内存访问权限:通过设置内存区域的读、写、执行权限来保护内存。
  • 内存隔离:确保每个进程只能访问属于自己的内存区域,防止恶意或错误的访问。

7. 内存共享

  • 共享内存:允许多个进程共享同一块内存区域,提高数据传输效率。
  • 共享库:允许多个进程共享同一个库文件,减少内存占用。

8. 内存碎片

  • 外部碎片:在分区分配中,空闲分区太小,无法满足新的内存请求。
  • 内部碎片:在分页中,页面的大小通常是固定的,导致每个页面的最后部分可能未被完全利用。