Presentation is loading. Please wait.

Presentation is loading. Please wait.

进 程. “ 程序 ” 和 “ 进程 ” 进程是 OS 对 CPU 执行的程序的运行过程的一种抽象。进程有自 己的生命周期,它由于任务的启动而创建,随着任务的完成(或 终止)而消亡,它所占用的资源也随着进程的终止而释放。 Linux 内核中通常把进程称为任务,每个进程主要通过一个称为进程描 述符(

Similar presentations


Presentation on theme: "进 程. “ 程序 ” 和 “ 进程 ” 进程是 OS 对 CPU 执行的程序的运行过程的一种抽象。进程有自 己的生命周期,它由于任务的启动而创建,随着任务的完成(或 终止)而消亡,它所占用的资源也随着进程的终止而释放。 Linux 内核中通常把进程称为任务,每个进程主要通过一个称为进程描 述符("— Presentation transcript:

1 进 程

2 “ 程序 ” 和 “ 进程 ” 进程是 OS 对 CPU 执行的程序的运行过程的一种抽象。进程有自 己的生命周期,它由于任务的启动而创建,随着任务的完成(或 终止)而消亡,它所占用的资源也随着进程的终止而释放。 Linux 内核中通常把进程称为任务,每个进程主要通过一个称为进程描 述符( process descriptor )的结构来描述,其结构类型定义为 task_struct ,包含了一个进程的所有信息。 一个可执行目标文件(即程序)可被加载执行多次,也即,一个 程序可能对应多个不同的进程。 程序( program )指按某种方式组合形成的代码和数据集合,代码即 是机器指令序列,因而程序是一种静态概念。 进程( process )指程序的一次运行过程。更确切说,进程是具有独 立功能的一个程序关于某个数据集合的一次运行活动,因而进程 具有动态含义 。同一个程序处理不同的数据就是不同的进程

3 创建进程 ——fork

4 命令行参数与环境变量

5

6 进程有自己的生命周期,它由于任务的启动而创建,随着任务的完成 ( 或 终止 ) 而消亡。 每个进程从产生到消亡,经常会处于 5 种不同的状态之一, 并在不同状态之间频繁进行转换 。 进程的状态及其转换:五态模型 选中 选中 时间到 出现等 待事件 事件结束 运行态 就绪态 等待态 新建态终止态 退出 (exit) 接纳 创建 (creat) 系统当前 状态允许 等待使用资 源;或等待 I/O ;或等 待人工干预 进程运行结束 或强迫终止 运行时间到; 或出现有更高 优先权进程 资源得到满 足; I/O 操 作结束;人 工干预完成 CPU 空闲时选择 一个就绪进程 除了正在运行的进程之 外,其他状态的进程分 别在不同的队列中排队 等候

7 进程的队列和调度 (Scheduling) 就绪进程在就绪队 列中排队等待调度 等待从磁盘读出文件的进 程在 I/O 队列中排队等候 等待用户输入的进程在等 待输入队列中排队等候 如何从就绪队列中选择一 个进程交给 CPU 执行,称 为进程调度 ( 短程调度 ) , 又叫做处理器管理 调度 完成 等待队列 就绪队列 事件 出现 生成 1 个 子进程 运行 时间到 等待某 个事件 I/O 队列 I/O 完成 请求 I/O 操作 CPU 新进程 接纳 进程运行

8 内存地址空间 2 32 -1 0 进程的执 行环境和 CPU 现场 IA-32 中进 程的 执行 环境 每个进程都有 专属于该进程 的私有存储空 间,用于存储 它自己的程序、 数据和工作区 程序 数据 工作区 程序 数据 工作区 程序 数据 工作区 OS CPU FLAGS 标志寄存器 通用寄存器 浮点寄存器 MMX 寄存器 XMM 寄存器 指令计数器 代码段基址寄存器 数据段基址寄存器 堆栈段基址寄存器 运行进程就是一条一条地执行相应程序中的指令 指令执行的效果就是改变 CPU 寄存器和存储器的状态 任一指令都在前一条指令的基础上执行 CPU 中所有寄存器的状态,称为 CPU 现场信息 若进程从运行态转换为等待态或就绪态,则必须保存 CPU 现场信息,如果进程再次运行,则需恢复 CPU 现场

9 进程 P 0 操作系统 进程 P 1 运行 等待 等待等待 等待等待 切换进程必须交换上下文 (Context-switch) 上下文信息 →PCB 0 上下文信息 →PCB 1 从 PCB 1 恢复上下文 从 PCB 0 恢复上下文 2 3 4 5 7 8 9 10 1. 进程 P0 处于运行状态, CPU 执行 P0 中的指 令 2. 时间到,系统时钟向 CPU 发出中断信号, OS 取代 P0 进入 CPU 运行 3.OS 把进程 P0 的上下文信息保存在 P0 的进 程控制块 PCB0 中,把 P0 放进就绪队列排队 4.OS 按调度算法从就绪进程的队列中选择另 一个进程 P1 准备运行 5.OS 从 P1 的进程控制块 PCB1 中把进程 P1 的 上下文信息恢复在 CPU 中 6.OS 让出 CPU ,进程 P1 进入运行状态, CPU 执行 P1 中的指令 7. 进程 P1 需要从磁盘上读出文件而执行一个 “ system call ” ,因而引出 OS ,启动磁盘的 文件读出操作 8.OS 把进程 P1 的上下文信息保存在 P1 的进 程控制块 PCB1 中, 然后将 P1 进程放进等 待队列排队 9.OS 按调度算法从就绪进程的队列中选择另 一个进程 P0 准备运行 10.OS 从 P0 的进程控制块 PCB0 中把进程 P0 的 上下文信息恢复在 CPU 中 11.OS 让出 CPU ,进程 P0 进入运行状态, CPU 执行 P0 中的指令 1 6 11 系统调用 (中断) 从就绪队列中选出 P1 从就绪队列中选出 P0

10 “ 进程 ” 与 “ 上下文切换 ” Unix>./hello hello, world Unix> “Unix>” 是 shell 命令行提示符, 说明正在运行 shell 进程。 在一个进程的生命周期中,可 能会有其他不同进程在处理器 上交替运行! 感觉到的运行时间比真实执行 时间要长! OS 通过处理器调度让处理器轮流执行多个进程。实现不同进程中指 令交替执行的机制称为进程的上下文切换( context switching ) 处理器调度等事件会引起用户进程正常执行被打断,因而形成异常控制流。 进程的上下文切换机制很好地解决了这类异常控制流,实现了从一个进程安 全切换到另一个进程执行的过程。

11 信 号

12 信号 ——Linux 中对异常的处理 所有异常处理程序的结构是一致的,都可划分成以下三个部分: ( 1 )准备阶段:在内核栈保存通用寄存器内容(称为现场信息),这部分大多 用汇编语言程序实现。 ( 2 )处理阶段:采用 C 函数进行具体处理。函数名由 do_ 前缀和处理程序名组 成,如 do_overflow 为溢出处理函数。 大部分函数的处理方式:保存硬件出错码(如果有的话)和异常类型号,然 后,向当前进程发送一个 信号 。当前进程接受到信号后,若有对应信号 处理程序,则转信号处理程序执行。 ( 3 )恢复阶段:恢复保存在内核栈中的 各个寄存器的内容,切换到用户态并 返回到当前进程的断点处继续执行 。

13 信号 高层软件形式的 异常 提供了一种通知 用户进程有关低 层硬件异常的机 制 – 异常由内核相应 例程处理,对用 户进程不可见 Linux 系统的 30 种 信号类型 – 每种信号类型对 应于某种系统事 件

14 信号实例 低层硬件异常 进程除 0 时,内核向其发送 SIGFPE 信号 进程执行非法指令时,内核向其发送 SIGILL 信号 进程引用非法存储地址时,内核向其发送 SIGSEGV 信号 高层软件事件 在前台进程运行时键入 Ctrl-C ,内核向其发送 SIGINT 信号 进程可向另一进程发送 SIGKILL 进程强制终止它 进程终止 / 停止时,内核向其父进程发送 SIGCHLD 信号

15 发送 / 接收信号 发送信号至目的进程包括两个步骤: 发送信号 – 内核更新目的进程上下文中的状态 – 两种发送原因: 1 )内核检测到一个系统事件(如除 0 ); 2 )进程 通过调用 kill 函数显式要求内核向目的进程发送一个信号 接收信号 – 内核强制目的进程对发送的信号做出某种响应 – 目的进程可以: 1 )忽略该信号; 2 )执行一个称为信号处理程序 的用户层函数以捕获信号; 3 )终止

16 发送 / 接收信号 一个已发出但尚未被接收的信号称为 pending 信号 任何时刻,进程至多存在每种类型的一个 pending 信号 – 假如已存在一类型 k 的 pending 信号,后续发送至该进程的类型 k 信号将被简单丢弃 进程可选择阻塞( block )接收某种信号 – 被阻塞的信号可以被发送,但不会被接收,直至进程取消阻塞 进程组:由进程组 ID ( PGID )标识 – 默认子进程与父进程属于同一进程组,其进程组 ID 为父进程的 PID

17 发送信号 Unix/Linux Shell 用作业( job )指代其创建的进程 ( 组 ) 任何时刻至多只有一个前台作业,同时可有多个后台作业 –unix> ls | sort// 创建由管道连接在一起的两个进程组成的前台 作业 Shell 为每个作业创建一个独立的进程组 键入 Ctrl-C 将使一个 SIGINT 信号被发送给 Shell 1 ) Shell 捕获该信号, 并向前台进程组中的每 一进程发送 SIGINT 信号 2 )默认进程将终止

18 发送信号 /bin/kill 程序可向一进程发送任一信号 –unix> /bin/kill -9 15213 // 向进程 15213 发送 SIGKILL(9) 信号 –unix> /bin/kill -9 -15213 // 向进程组 15213 中的每一进程发送 SIGKILL(9) 信号 进程可调用 kill 函数向其他进程(包括自己)发送信号 进程可调用 alarm 函数要求内核在指定时间向自己发送 SIGALRM 信号

19 接收信号 当内核从异常处理程序返回准备将控制传递给进程前,将 检查该进程的未被阻塞的 pending 信号集合。 如果集合非空,内核选择其中某个信号 k (通常取最小的 k )并强制进程接收信号 k ,相应触发进程的特定行为,并 在其完成后控制传递回进程的逻辑控制流的下一条指令 每个信号类型对应下列之一的预定义默认行为: – 进程终止 – 进程终止并转储存储器( core dump ) – 进程停止直到被 SIGCONT 信号重启 – 进程忽略该信号 例如,收到 SIGKILL 信号的默认行为是终止接收进程 可使用 signal 函数改变与某信号相关联的行为

20 处理信号 调用信号处理程序称为捕获( catch )信号 当进程执行信号处理程序的 return 语句时,控制传递回因 接收信号而中断的逻辑控制流中的指令 修改 SIGINT 的默认行 为(终止进程)为捕获 并处理信号(输出信息 )

21 非本地跳转 ( nonlocal jump )

22 非本地跳转 C 语言提供一种用户级异常控制流 ——nonlocal jump – 将控制从一个函数直接传递给另一正在执行的函数,跳过正常的 调用 - 返回处理序列 – 通过 setjmp 和 longjmp 函数实现 setjmp 将当前调用环境(程序计数器、栈指针、通用寄存 器等)保持在 env 缓冲区中,供后面的 longjmp 函数调用 使用。返回 0.

23 非本地跳转 longjmp 从 env 缓冲区中恢复调用环境,并触发从最近一 次设置 env 的 setjmp 中返回,注意不是从 longjmp 返回 注意 setjmp 只被调用一次却返回多次: 1 )第一次调用初 始化 env 内容时返回 0 ; 2 )每次 longjmp 调用触发的返回 (返回非 0 的 longjmp 调用参数 retval ) 非本地跳转的应用之一是允许从深层嵌套的函数调用中返 回至预先设置的任一位置。例如用户级异常捕获与处理。

24 非本地跳转

25 12 月 24 日小班课 PA 报告要求

26 PA 小班口头报告 教学目标 – 通过小班交流与讨论,进一步促进课程 PA 实践环节 – 了解学生在 PA 方面投入的工作量 报告方式 – 以 PPT 方式展示自己在模拟器实现过程中的亮点,尤其 是有特色或有参考价值的做法、功能等 – 可配合现场演示 自愿报名


Download ppt "进 程. “ 程序 ” 和 “ 进程 ” 进程是 OS 对 CPU 执行的程序的运行过程的一种抽象。进程有自 己的生命周期,它由于任务的启动而创建,随着任务的完成(或 终止)而消亡,它所占用的资源也随着进程的终止而释放。 Linux 内核中通常把进程称为任务,每个进程主要通过一个称为进程描 述符("

Similar presentations


Ads by Google