插入就绪队列/ End

存放C函数编译后的代码 ... 大小固定,压栈和弹栈操作由编译器负责; 栈空间一旦用完,系统将报错 .... 这主要是指“决定程序交叉执行的次序”以及“向进程分配资源”。
展开查看详情

1.第 2 章 进程的基本概念 吕鸣松 东北大学计算机科学与工程学院 2016 年 3 月 《 操作系统原理 》 2016 年 春季课程

2.本章主要内容 计算机硬件基本知识补充( CPU 工作原理) C 程序存储模型 程序的并发执行 进程的基本概念 进程状态转换 进程在操作系统中的描述 进程控制 线程 2016/3/24 CH02 - Process Fundamentals 2

3.本章主要内容 计算机硬件基本知识补充( CPU 工作原理) C 程序存储模型 程序 的并发执行 进程的基本概念 进程状态转换 进程在操作系统中的描述 进程控制 线程 2016/3/24 CH02 - Process Fundamentals 3

4.计算机系统基本组成 2016/3/24 CH02 - Process Fundamentals 4

5.计算机体系结构 冯∙诺依曼体系结构 程序 由一系列的“ 指令 ” 组成 采用 存储程序方式 ,指令和数据不加区别混合存储在同一个存储器 中, 指令和数据通过一条共同的总线,从存储器载入 CPU 存储器 是按地址访问的 线性编址 的一维结构,每个单元的位数是固定 的 指令由操作码和地址 组成 以运算器为中心 , I/O 设备与存储器间的数据传送都要经过 运算器 数据以二进制 表示 2016/3/24 CH02 - Process Fundamentals 5

6.人脑体系结构 2016/3/24 CH02 - Process Fundamentals 6 人脑有 100 亿个神经细胞,功率 20 瓦,每秒 10 万种化学反应,占体重的 2% ,消耗全身氧气的 25% (心脏消耗 7% ), 大脑神经细胞间最快的神经冲动传导速度为 400 多公里 / 小时

7.阿尔法狗 vs 李世石 2016/3/24 CH02 - Process Fundamentals 7

8.计算机体系结构 2016/3/24 CH02 - Process Fundamentals 8

9.高级语言代码  机器码 2016/3/24 CH02 - Process Fundamentals 9 void main() { int b; int i = 0, j = 0; while ( i < 100 ) { if (b) j++; else j- -; i ++; } } main(): simple.c:2 004001f0 <main> addiu $29,$29,-24 004001f8 <main+0x8> sw $30,16($29) 00400200 <main+0x10> addu $30,$0,$29 simple.c:4 00400208 <main+0x18> sw $0,4($30) 00400210 <main+0x20> sw $0,8($30) simple.c:5 00400218 <main+0x28> lw $2,4($30) 00400220 <main+0x30> slti $ 3,$ 2,100 00400228 <main+0x38> bne $ 3,$0,00400238 00400230 <main+0x40> j 004002b8 simple.c:6 00400238 <main+0x48> lw $2,0($30) 00400240 <main+0x50> beq $ 2,$0,00400270 simple.c:7 00400248 <main+0x58> lw $ 3,8($30) 00400250 <main+0x60> addiu $ 2,$3,1 00400258 <main+0x68> addu $ 3,$0,$2 00400260 <main+0x70> sw $3,8($30) 00400268 <main+0x78> j 00400290 simple.c:9 00400270 <main+0x80> lw $ 3,8($30) 00400278 <main+0x88> addiu $ 2,$3,-1 00400280 <main+0x90> addu $ 3,$0,$2 00400288 <main+0x98> sw $3,8($30) simple.c:10 00400290 <main+0xa0> lw $ 3,4($30) 00400298 <main+0xa8> addiu $ 2,$3,1 004002a0 <main+0xb0> addu $ 3,$0,$2 004002a8 <main+0xb8> sw $3,4($30) simple.c:11 004002b0 <main+0xc0> j 00400218 simple.c:12 004002b8 <main+0xc8> addu $ 29,$0,$30 004002c0 <main+0xd0> lw $ 30,16($29) 004002c8 <main+0xd8> addiu $ 29,$29,24 004002d0 <main+0xe0> jr $31 004002d8 <main+0xe8> nop end_addr Entering Loop Exiting Loop Next Iteration

10.一条指令的执行过程 Instruction Cycle 2016/3/24 CH02 - Process Fundamentals 10 系统启动 系统关机 取指令 执行指令 内存 CPU IR PC 工作原理

11.指令完成的主要功能 内存访问 从内存向 CPU 载入数据,从 CPU 向内存写回数据 I/O 访问 CPU 与 I/O 设备之间传输数据 数据运算 对数据的算术或逻辑运算 控制 指令流的控制,如判断分支跳转 2016/3/24 CH02 - Process Fundamentals 11

12.指令的执行:加法运算举例 2016/3/24 CH02 - Process Fundamentals 12

13.中断机制 中断机制:允许 CPU 的执行被打断 为什么需要“中断”? 以 CPU 为中心,但系统应该是开放的 CPU 使用效率问题 系统中几类主要中断 程序执行异常 时钟中断,让 OS 感知时间 与外设通信 硬件故障 2016/3/24 CH02 - Process Fundamentals 13

14.有无中断的区别 2016/3/24 CH02 - Process Fundamentals 14

15.中断执行过程中的控制转移 2016/3/24 CH02 - Process Fundamentals 15

16.中断的感知 中断 的产生 当 外设上有数据需要处理时,通过中断通知 CPU 产生的中断被记录在特定的寄存器中 CPU 根据中断类型和参数,进行相应的 处理 中断的感知 2016/3/24 CH02 - Process Fundamentals 16 系统启动 系统关机 取指令 执行指令 中断检查

17.系统时间行为:无中断 2016/3/24 CH02 - Process Fundamentals 17

18.系统时间 行为:有中断 2016/3/24 CH02 - Process Fundamentals 18

19.系统时间 行为:长等待 2016/3/24 CH02 - Process Fundamentals 19

20.切换边界上的系统行为 2016/3/24 CH02 - Process Fundamentals 20 硬件产生中断 处理器执行完当前指令 处理器发现中断 保存处理器现场 设 置中断处理程序入口 保存其它程序信息 执行中断处理程序 恢复其它程序信息 恢复处理器现场 软 件 硬件

21.本章主要内容 计算机硬件基本知识补充( CPU 工作原理) C 程序存储模型 程序 的并发执行 进程的基本概念 进程状态转换 进程在操作系统中的描述 进程控制 线程 2016/3/24 CH02 - Process Fundamentals 21

22.高级语言代码  机器码 2016/3/24 CH02 - Process Fundamentals 22 void main() { int b; int i = 0, j = 0; while ( i < 100 ) { if (b) j++; else j- -; i ++; } } main(): simple.c:2 004001f0 <main> addiu $29,$29,-24 004001f8 <main+0x8> sw $30,16($29) 00400200 <main+0x10> addu $30,$0,$29 simple.c:4 00400208 <main+0x18> sw $0,4($30) 00400210 <main+0x20> sw $0,8($30) simple.c:5 00400218 <main+0x28> lw $2,4($30) 00400220 <main+0x30> slti $ 3,$ 2,100 00400228 <main+0x38> bne $ 3,$0,00400238 00400230 <main+0x40> j 004002b8 simple.c:6 00400238 <main+0x48> lw $2,0($30) 00400240 <main+0x50> beq $ 2,$0,00400270 simple.c:7 00400248 <main+0x58> lw $ 3,8($30) 00400250 <main+0x60> addiu $ 2,$3,1 00400258 <main+0x68> addu $ 3,$0,$2 00400260 <main+0x70> sw $3,8($30) 00400268 <main+0x78> j 00400290 simple.c:9 00400270 <main+0x80> lw $ 3,8($30) 00400278 <main+0x88> addiu $ 2,$3,-1 00400280 <main+0x90> addu $ 3,$0,$2 00400288 <main+0x98> sw $3,8($30) simple.c:10 00400290 <main+0xa0> lw $ 3,4($30) 00400298 <main+0xa8> addiu $ 2,$3,1 004002a0 <main+0xb0> addu $ 3,$0,$2 004002a8 <main+0xb8> sw $3,4($30) simple.c:11 004002b0 <main+0xc0> j 00400218 simple.c:12 004002b8 <main+0xc8> addu $ 29,$0,$30 004002c0 <main+0xd0> lw $ 30,16($29) 004002c8 <main+0xd8> addiu $ 29,$29,24 004002d0 <main+0xe0> jr $31 004002d8 <main+0xe8> nop end_addr

23.C 程序内存管理 代码区 存放 C 函数编译后的代码 数据 区 字符串常量 全局变量 静态变量 栈 区 函数的参数、返回值、局部变量 堆区 动态开辟的存储空间 2016/3/24 CH02 - Process Fundamentals 23 代码区(程序代码) 数据区 文字常量 全局变量 静态变量 堆区( heap ) 栈 区( stack )

24.C 程序内存管理 2016/3/24 CH02 - Process Fundamentals 24 int a = 0; char *p1; main()  {  int a,b ; char s[] = “ abc ”; char *p2 ; char *p3 = “123456”; static int c =0 ; p1 = (char *) malloc (10 ); strcpy (p1 , "123456"); Foo( a,b ); } Foo( int p1, int p2){ int x, y; static int z; } 代码区(程序代码) 数据区 文字常量 全局变量 静态变量 堆区( heap ) 栈 区( stack )

25.函数调用过程 函数调用 返回地址最先入栈 各个参数入栈 函数的局部变量入栈 函数内部定义的静态变量不入栈 函数返回 以上数据逆序从栈中弹出 跳 转至返回地址 2016/3/24 CH02 - Process Fundamentals 25

26.栈与堆 栈 大小固定,压栈和弹栈操作由编译器负责 栈空间一旦用完,系统将报错 堆 有一个初始大小,超出后,通过系统调用申请更多 地址空间可能不连续 C 程序需要程序员显式管理堆空间,极易出现“内存泄露” 2016/3/24 CH02 - Process Fundamentals 26

27.本章主要内容 计算机硬件基本知识补充( CPU 工作原理) C 程序存储模型 程序的并发执行 进程的基本概念 进程状态转换 进程在操作系统中的描述 进程控制 线程 2016/3/24 CH02 - Process Fundamentals 27

28.程序的“顺序”执行 什么是“ 程序 ”? 完成所要求的功能时,所应采取的顺序步骤,是执行指令的有序集合 程序的“ 顺序执行 ” 具有独立功能的程序 独占 CPU 直至得到最终结果的过程 这里,“顺序”不是指程序内部指令间的关系,而是指 程序与程序 之间的关系 2016/3/24 CH02 - Process Fundamentals 28

29.程序的“顺序”执行 顺序执行的特点 顺序性 :按照程序结构所指定的次序(可能有分支与循环) 封闭性 :独占全部资源( CPU ,内存,外设),计算机的状态只由该程序的控制逻辑所决定 可再现性 :初始条件相同则逻辑结果相同 主要用于早期的单道批处理 系统 2016/3/24 CH02 - Process Fundamentals 29