0 00:00:00,000 --> 00:00:06,920 1 00:00:07,000 --> 00:00:10,280 接下来我们介绍进程控制块 2 00:00:10,320 --> 00:00:14,640 进程控制块是进程当中的重要信息 3 00:00:14,680 --> 00:00:16,920 它负责控制 4 00:00:16,960 --> 00:00:18,320 由操作系统控制和 5 00:00:18,360 --> 00:00:20,320 管理进程运行的过程 6 00:00:20,360 --> 00:00:22,520 那进程控制块到底是干什么的 7 00:00:22,560 --> 00:00:24,160 然后它如何用 8 00:00:24,200 --> 00:00:25,720 里头到底有些什么样的信息 9 00:00:25,760 --> 00:00:29,280 我们在这儿呢一一来进行讨论 10 00:00:29,320 --> 00:00:32,800 进程控制块是管理和控制进程 11 00:00:32,840 --> 00:00:35,720 运行所需的信息的集合 12 00:00:35,760 --> 00:00:39,640 那在这些信息里头呢它是有些啥呢 13 00:00:39,680 --> 00:00:43,680 进程的基本信息你比如说它的ID 14 00:00:43,720 --> 00:00:46,720 它执行的是哪一个程序 15 00:00:46,760 --> 00:00:49,200 以及它运行变化的过程 16 00:00:49,240 --> 00:00:53,280 那就是进程的状态 17 00:00:53,320 --> 00:00:55,120 那进程控制块呢是 18 00:00:55,160 --> 00:00:56,920 进程存在的唯一标志 19 00:00:56,960 --> 00:00:58,640 也就是说我任何一个进程 20 00:00:58,680 --> 00:01:00,400 只要它创建了它存在了 21 00:01:00,440 --> 00:01:02,160 它一定有一个 22 00:01:02,200 --> 00:01:04,760 跟它相对应的进程控制块 23 00:01:04,800 --> 00:01:06,240 那一个进程结束了 24 00:01:06,280 --> 00:01:08,200 那它进程控制块呢 25 00:01:08,240 --> 00:01:11,880 也就必然被操作系统回收 26 00:01:11,920 --> 00:01:13,240 好那这时候说 27 00:01:13,280 --> 00:01:15,280 我们这进程块怎么来用呢 28 00:01:15,320 --> 00:01:16,760 那在创建的时候 29 00:01:16,800 --> 00:01:19,240 生成该进程的进程控制块 30 00:01:19,280 --> 00:01:22,240 然后结束的时候 31 00:01:22,280 --> 00:01:24,480 回收它的进程控制块 32 00:01:24,520 --> 00:01:26,640 在中间使用的时候呢 33 00:01:26,680 --> 00:01:29,400 那对进程的所有操作都是 34 00:01:29,440 --> 00:01:32,720 通过进程控制块来实现的 35 00:01:32,760 --> 00:01:35,320 那具体进程控制块里都有些什么 36 00:01:35,360 --> 00:01:37,240 它们是如何组织的呢 37 00:01:37,280 --> 00:01:39,400 以及于我们在进程在 38 00:01:39,440 --> 00:01:40,640 执行过程当中它的状态 39 00:01:40,680 --> 00:01:42,080 到底怎么变化呢 40 00:01:42,120 --> 00:01:44,520 都和这个进程控制块是密切相关的 41 00:01:44,560 --> 00:01:48,640 下面我们先来说进程控制块的内容 42 00:01:48,680 --> 00:01:52,320 进程控制块里的内容呢有标识信息 43 00:01:52,360 --> 00:01:53,640 然后再一类呢 44 00:01:53,680 --> 00:01:55,840 就是我多个进程交替运行 45 00:01:55,880 --> 00:01:56,920 如果你不交替运行的话 46 00:01:56,960 --> 00:01:58,840 第二条你是不需要保存的 47 00:01:58,880 --> 00:02:01,520 好交替运行的时候交替的部分 48 00:02:01,560 --> 00:02:03,000 交替完了之后会被 49 00:02:03,040 --> 00:02:05,160 另外的进程使用的部分的内容呢 50 00:02:05,200 --> 00:02:06,680 你都必须保护下来 51 00:02:06,720 --> 00:02:09,760 那这就是处理机的现场保护 52 00:02:09,800 --> 00:02:14,640 然后再一些呢就是进程控制的信息 53 00:02:14,680 --> 00:02:19,480 那这是我们进程在内存当中的印象 54 00:02:19,520 --> 00:02:21,880 好我们加载的时候呢就是在 55 00:02:21,920 --> 00:02:24,240 内存当中形成这样一段存储区域 56 00:02:24,280 --> 00:02:27,800 存储相应的代码和其它的一些内容 57 00:02:27,840 --> 00:02:30,240 好我们在这里进程控制块里是什么 58 00:02:30,280 --> 00:02:32,480 就从这里抽出一部分信息 59 00:02:32,520 --> 00:02:34,880 来放到我的进程控制块里头 60 00:02:34,920 --> 00:02:36,000 实际上这一块呢 61 00:02:36,040 --> 00:02:38,120 也是存到内存里的某个位置 62 00:02:38,160 --> 00:02:39,720 内核当中的 63 00:02:39,760 --> 00:02:41,520 比如说关键的信息就是 64 00:02:41,560 --> 00:02:43,960 当前指令指针这个P 65 00:02:44,000 --> 00:02:46,560 指向的到底是哪个地方 66 00:02:46,600 --> 00:02:48,360 好第二个是说我在这里头 67 00:02:48,400 --> 00:02:49,520 函数调用和返回 68 00:02:49,560 --> 00:02:52,120 当时的栈顶在什么地方 69 00:02:52,160 --> 00:02:53,440 那这是至关重要的 70 00:02:53,480 --> 00:02:57,040 然后再有你比如说它的标识信息ID 71 00:02:57,080 --> 00:03:01,560 然后它的控制信息调度和这里的 72 00:03:01,600 --> 00:03:03,920 其它寄存器就是你现场保护的时候 73 00:03:03,960 --> 00:03:06,200 别的进程执行的时候要用到寄存器 74 00:03:06,240 --> 00:03:08,960 你在这儿都必须保存 75 00:03:09,000 --> 00:03:10,920 那具体说起来在这里头 76 00:03:10,960 --> 00:03:12,720 控制信息有些啥呢 77 00:03:12,760 --> 00:03:15,880 控制信息呢一个是以调度相关的 78 00:03:15,920 --> 00:03:17,760 那就包括调度的信息 79 00:03:17,800 --> 00:03:19,840 和它的进程的状态 80 00:03:19,880 --> 00:03:22,880 因为它依据状态来决定我如何调度 81 00:03:22,920 --> 00:03:25,520 然后进程之间的通讯信息 82 00:03:25,560 --> 00:03:27,320 任何一个进程它在执行过程当中 83 00:03:27,360 --> 00:03:28,800 你一定要跟外界打交道 84 00:03:28,840 --> 00:03:30,320 比如说我处理不同的数据 85 00:03:30,360 --> 00:03:32,280 读入不同的数据来进行处理 86 00:03:32,320 --> 00:03:33,720 如果没有这一条的话 87 00:03:33,760 --> 00:03:37,760 那这个程序的用处也就很小了 88 00:03:37,800 --> 00:03:40,240 好然后再一个是存储的信息 89 00:03:40,280 --> 00:03:43,840 我这个进程占用了哪些存储空间 90 00:03:43,880 --> 00:03:46,320 那对应的位置是什么样的 91 00:03:46,360 --> 00:03:47,520 你在用完之后 92 00:03:47,560 --> 00:03:49,560 你还必须还给操作系统 93 00:03:49,600 --> 00:03:51,800 好再就是进程占用的资源 94 00:03:51,840 --> 00:03:53,760 你比如说我打开的文件 95 00:03:53,800 --> 00:03:56,560 那这些你在结束的时候是要回收的 96 00:03:56,600 --> 00:04:00,480 以及于我的进程状态的变化体现为 97 00:04:00,560 --> 00:04:02,280 进程控制块所在的 98 00:04:02,320 --> 00:04:03,960 各种各样的链表里头 99 00:04:04,000 --> 00:04:05,880 或者说索引表里头 100 00:04:06,000 --> 00:04:07,960 对应的这些连接关系 101 00:04:08,000 --> 00:04:09,160 那在这儿都是通过 102 00:04:09,200 --> 00:04:11,440 相应的进程队列来实现的 103 00:04:11,480 --> 00:04:15,240 这是进程控制的信息 104 00:04:15,280 --> 00:04:17,720 好 那么进程控制块组织呢 105 00:04:17,760 --> 00:04:19,040 有多种多样的方式 106 00:04:19,080 --> 00:04:21,520 你比如说表 链表 索引 107 00:04:21,560 --> 00:04:23,440 和各种各样的数据结构都可能会用到 108 00:04:23,480 --> 00:04:24,560 在我们这里头呢 109 00:04:24,600 --> 00:04:25,880 我们简单的说两种 110 00:04:25,920 --> 00:04:27,120 一种是链表 111 00:04:27,160 --> 00:04:29,080 那一个元素指向下一个元素 112 00:04:29,120 --> 00:04:30,720 下一个元素再指向下一个 113 00:04:30,760 --> 00:04:33,400 以同一类型的构成一个链表 114 00:04:33,480 --> 00:04:35,120 那比如说在这个地方 115 00:04:35,200 --> 00:04:39,120 那我们就有就绪和等待 116 00:04:39,200 --> 00:04:41,680 这两个进程状态的链表 117 00:04:41,760 --> 00:04:45,000 那这个链表分别是就绪 118 00:04:45,040 --> 00:04:46,360 有三个 119 00:04:46,440 --> 00:04:49,160 这个等待的是三个 120 00:04:49,200 --> 00:04:52,320 那分别是它们组织成两个不同的链表 121 00:04:52,400 --> 00:04:55,360 然后第二种呢是说我们可以用索引 122 00:04:55,440 --> 00:04:58,960 把通过指针指向进程控制块的指针 123 00:04:59,040 --> 00:05:00,280 放到索引表里头 124 00:05:00,320 --> 00:05:02,800 那不同的状态的呢 125 00:05:02,880 --> 00:05:04,800 我构成不同的索引表 126 00:05:04,840 --> 00:05:06,920 这个刚才说的链表同样的 127 00:05:06,960 --> 00:05:08,320 我可以用类似的办法来 128 00:05:08,360 --> 00:05:09,640 组织成索引表 129 00:05:09,680 --> 00:05:11,600 那我们实际上在操作系统里头呢 130 00:05:11,640 --> 00:05:12,920 你原来在数据结构当中 131 00:05:12,960 --> 00:05:14,200 学到的各种各样的数据结构 132 00:05:14,240 --> 00:05:14,600 在这个地方 133 00:05:14,640 --> 00:05:17,920 都会在后续里头呢不断得到体现 134 00:05:18,000 --> 00:05:19,880 好那我们到这儿呢就说清楚了 135 00:05:19,960 --> 00:05:22,160 进程控制块它是干什么的 136 00:05:22,240 --> 00:05:23,280 它是如何来用 137 00:05:23,320 --> 00:05:24,400 以及于里头到底 138 00:05:24,440 --> 00:05:25,880 都有一些什么样的信息 139 00:05:25,920 --> 00:05:28,840 那我们这地方介绍呢还都很初步 140 00:05:28,880 --> 00:05:30,120 那下面通过程序里 141 00:05:30,200 --> 00:05:31,520 实现里内容的来看 142 00:05:31,600 --> 00:05:33,840 对进程控制块里头到底准确的来说 143 00:05:33,920 --> 00:05:35,480 哪个系统里都有一些什么 144 00:05:35,520 --> 00:05:36,680 145 00:05:36,720 --> 00:05:37,440