第四、五章 进程

CPU虚拟化的产物:进程(process)

OS重要思想:资源共享思想

  • 时分共享:每次由一个实体使用一小段时间(one at a time),典型应用是进程共享CPU
  • 空分共享 : 每个实体同时使用一小部分资源(all a little)

一、进程的概念

进程是操作系统对运行程序的抽象。

  • 当用户运行程序时,操作系统创建一个进程
  • 操作系统每次选择一个进程在CPU上运行一段时间
  • 操作系统将CPU时分共享给多个进程

特点:

  • 时分共享,虚拟化
  • 提供假象
  • 一个进程等待时另一个进程做事(Overlap)

(多)进程的引入:优点

  • 提升系统资源利用率,减小延迟
  • 提升系统可靠性
  • 简化编程模型

二、进程的创建

  • 将程序的代码和静态数据加载到进程的内存地址空间。

    • 惰性执行:仅当代码片段或数据需要使用时才进行加载
  • 为程序的运行时栈分配内存

  • 为程序的堆分配内存

  • OS执行一些其他初始化任务

  • 运行程序

    • 进程以进程号PID唯一标识

查看进程信息:

  • $ ps -a //查看运行的进程
  • $ ps -aux|grep PID //查看进程号为PID的进程详细信息
  • $ kill PID //杀死PID进程

三、进程的状态

  • 初始态
  • 运行态
  • 就绪态
  • 阻塞态
  • 终止态

进程控制块

进程控制块(PCB):OS控制进程运行的数据结构

  • 进程标识信息:PID等
  • 执行现场信息:CPU现场
  • 进程映像信息:进程的地址空间
  • 进程资源信息:文件、信号、共享内存、消息队列、通讯端口等
  • 其他信息

四、进程的API

fork()

UNIX系统中,用fork()创建进程

  • 在一个运行的进程(父进程)中创建新的进程
  • 子进程得到父进程的资源拷贝,指令相同(子进程从 fork() 处继续执行)
  • 父子进程PID不同
  • fork() 后父子进程由独立的地址空间
  • 父子进程的 fork() 返回值不同(以此进行区分),父进程返回值是子进程的PID,子进程中返回值是0

仅用 fork() 创建进程有什么问题:父子进程的运行顺序/时间有差异,导致不确定性。

wait()

wait用于等待任一子进程结束。

返回值:

  • 如果成功,返回结束的子进程PID
  • 如果有错误, 返回-1

int wc = wait(NULL)

exec()

  • 将当前进程印象替换成新的程序文件并执行
  • 从可执行文件中加载代码和静态数据,覆盖自己的代码和静态数据,堆、栈也会被重新初始化
  • exec()成功调用不会返回
  • 在子进程中调用exec(),从而执行与父进程不同的程序

为什么要这样设计

  • fork()大大简化了新进程初始化的工作
  • fork()可以更好帮助子进程使用父进程的数据
  • fork() ,wait(),exec()的完美结合,千变万化