0 00:00:00,000 --> 00:00:06,200 1 00:00:06,480 --> 00:00:10,880 下面我们来讨论进程挂起 2 00:00:10,920 --> 00:00:12,360 在前面我们讨论 3 00:00:12,400 --> 00:00:14,280 进程状态模型的时候呢 4 00:00:14,320 --> 00:00:15,760 它主要讨论的是 5 00:00:15,800 --> 00:00:18,400 跟CPU相关的这些状态 6 00:00:18,440 --> 00:00:19,480 但实际上我们在 7 00:00:19,560 --> 00:00:21,520 进程当中的状态里头呢 8 00:00:21,560 --> 00:00:24,440 还有一类是在跟存储相关 9 00:00:24,480 --> 00:00:26,520 也就是说进程一部分存储是 10 00:00:26,560 --> 00:00:27,880 放到外存里头的 11 00:00:27,920 --> 00:00:29,600 和虚拟存储相关联起来 12 00:00:29,640 --> 00:00:31,080 这是呢就是我们这里的 13 00:00:31,120 --> 00:00:33,280 挂起进程模型 14 00:00:33,320 --> 00:00:34,440 它是指什么意思呢 15 00:00:34,480 --> 00:00:37,160 它是指处于挂起状态的进程是 16 00:00:37,200 --> 00:00:39,200 放在磁盘上的 17 00:00:39,240 --> 00:00:40,520 放到磁盘上的目的呢 18 00:00:40,560 --> 00:00:43,080 是为了减少内存的占用量 19 00:00:43,120 --> 00:00:44,800 那减少它的内存占用量 20 00:00:44,840 --> 00:00:46,280 就可以提供更多的内存 21 00:00:46,320 --> 00:00:49,080 给其它的进程来使用 22 00:00:49,120 --> 00:00:50,640 有了进程挂起之后 23 00:00:50,680 --> 00:00:52,920 我们的进程状态模型图呢 24 00:00:52,960 --> 00:00:54,840 也会因此而发生变化 25 00:00:54,880 --> 00:00:58,400 这就是我们这里的挂起进程模型 26 00:00:58,440 --> 00:01:00,800 和我们前面讲的三状态进程模型 27 00:01:00,840 --> 00:01:04,360 相比呢在这里多了两种状态 28 00:01:04,400 --> 00:01:07,760 就绪挂起和等待挂起 29 00:01:07,800 --> 00:01:09,400 这两种新加的状态呢 30 00:01:09,440 --> 00:01:11,000 实际上就是为了描述 31 00:01:11,040 --> 00:01:14,280 在外存当中的进程的状态 32 00:01:14,320 --> 00:01:17,840 那其它的状态它是不会在外存里的 33 00:01:17,880 --> 00:01:21,240 第一个呢是等待挂起 34 00:01:21,280 --> 00:01:23,720 那这时候描述的是说进程在 35 00:01:23,760 --> 00:01:26,680 外存并且等待事件的出现 36 00:01:26,720 --> 00:01:29,000 那就相当于在等待的基础上 37 00:01:29,040 --> 00:01:34,160 加了一个关于进程的位置的信息 38 00:01:34,200 --> 00:01:36,560 而接下来一个呢是就绪挂起 39 00:01:36,600 --> 00:01:38,080 那就绪挂起呢实际上就相当于 40 00:01:38,120 --> 00:01:39,240 它处于就绪的状态 41 00:01:39,280 --> 00:01:42,160 但这时候呢进程在外存当中 42 00:01:42,200 --> 00:01:44,120 那它只要进入到内存里头呢 43 00:01:44,160 --> 00:01:45,800 它就可以运行了 44 00:01:45,840 --> 00:01:47,720 那这时候它进不到内存里的原因呢 45 00:01:47,760 --> 00:01:49,400 是内存的空间不够 46 00:01:49,440 --> 00:01:52,320 或者说它的优先级不够高 47 00:01:52,360 --> 00:01:54,000 好 有了这两个状态之后 48 00:01:54,040 --> 00:01:56,000 我们就会在状态之间呢 49 00:01:56,040 --> 00:01:57,880 多加了一组变迁 50 00:01:57,920 --> 00:01:59,000 这组变迁呢 51 00:01:59,040 --> 00:02:00,320 我们可以把它分成这样几类 52 00:02:00,360 --> 00:02:01,640 一类是挂起 53 00:02:01,680 --> 00:02:06,560 也就是说把进程从内存转到外存 54 00:02:06,600 --> 00:02:07,560 那具体说起来呢 55 00:02:07,600 --> 00:02:10,080 有三个与此相关的变迁 56 00:02:10,120 --> 00:02:13,920 第一个是从等待到等待挂起 57 00:02:13,960 --> 00:02:16,520 那出现这种变化的原因呢 58 00:02:16,560 --> 00:02:20,400 是没有进程处于就绪状态 59 00:02:20,440 --> 00:02:23,160 或者说就绪进程 60 00:02:23,200 --> 00:02:25,880 需要更多的内存空间 61 00:02:25,920 --> 00:02:28,560 然后第二个呢是说 62 00:02:28,600 --> 00:02:32,040 就绪到就绪挂起 63 00:02:32,080 --> 00:02:33,120 那在这里头呢 64 00:02:33,160 --> 00:02:36,080 有高优先级的进程等待 65 00:02:36,120 --> 00:02:38,240 而这时候呢低优先级的进程呢 66 00:02:38,280 --> 00:02:40,960 在内存当中处于就绪状态 67 00:02:41,000 --> 00:02:43,080 那为了让这个高优先级等待进程 68 00:02:43,120 --> 00:02:44,960 进来之后有足够的空间 69 00:02:45,000 --> 00:02:46,760 那这时候它把它 70 00:02:46,800 --> 00:02:49,920 把这个低优先级的就绪进程呢 71 00:02:49,960 --> 00:02:52,880 对换到外存当中 72 00:02:52,920 --> 00:02:57,360 从而呢成为挂起就绪 73 00:02:57,400 --> 00:02:58,760 好 还有一个变迁呢是 74 00:02:58,800 --> 00:03:02,600 直接从运行状态到了挂起就绪 75 00:03:02,640 --> 00:03:03,680 那在这里头呢 76 00:03:03,720 --> 00:03:04,960 实际上就是对于分时系统 77 00:03:05,000 --> 00:03:06,160 如果有抢先的话 78 00:03:06,200 --> 00:03:07,560 在极特殊的一些情况下 79 00:03:07,600 --> 00:03:09,080 会出现这种情况 80 00:03:09,120 --> 00:03:11,280 比如说有高优先级等待的进程 81 00:03:11,320 --> 00:03:13,920 因事件的出现而进入就绪 82 00:03:13,960 --> 00:03:15,600 而这时候呢没有足够的内存空间 83 00:03:15,640 --> 00:03:16,320 它就会把当前 84 00:03:16,360 --> 00:03:18,760 正在运行的这个进程呢 85 00:03:18,800 --> 00:03:22,880 抢先并且把它变成挂起就绪的状态 86 00:03:22,920 --> 00:03:28,400 好 这是三个从内存到外存的变迁 87 00:03:28,440 --> 00:03:31,200 分别涉及到就绪运行和等待 88 00:03:31,240 --> 00:03:32,840 也就相当于三状态进程模型里 89 00:03:32,880 --> 00:03:34,200 在内存里三个状态呢 90 00:03:34,240 --> 00:03:36,760 都会有可能会 放到外存里头去 91 00:03:36,800 --> 00:03:38,840 从而产生相应的挂起 92 00:03:38,880 --> 00:03:40,160 然后在外存当中 93 00:03:40,200 --> 00:03:41,560 可能出现的状态呢就是 94 00:03:41,600 --> 00:03:44,840 我们在这里内存当中的等待到就绪 95 00:03:44,880 --> 00:03:45,960 这地方有挂起 96 00:03:46,000 --> 00:03:49,240 等待挂起到就绪挂起 97 00:03:49,280 --> 00:03:51,200 好 那这个地方呢 98 00:03:51,240 --> 00:03:52,960 是等待的事件出现 99 00:03:53,000 --> 00:03:57,560 并且相关的进程呢处于等待挂起上 100 00:03:57,600 --> 00:04:00,840 那这时候它就变成是就绪挂起 101 00:04:00,880 --> 00:04:03,280 好 反过身来这几个 102 00:04:03,320 --> 00:04:05,280 在外存当中的进程呢 103 00:04:05,320 --> 00:04:07,440 它可能会被倒回到内存当中来 104 00:04:07,480 --> 00:04:10,320 这时候的变迁呢称之为叫激活 105 00:04:10,360 --> 00:04:13,200 那具体说起来的激活有两种情况 106 00:04:13,240 --> 00:04:16,000 一种是从就绪挂起到就绪 107 00:04:16,040 --> 00:04:17,520 那这种情况是说 108 00:04:17,560 --> 00:04:20,720 我在内存当中没有就绪进程 109 00:04:20,760 --> 00:04:22,840 或者说挂起就绪这个进程呢 110 00:04:22,880 --> 00:04:23,960 它的优先级比较高 111 00:04:24,000 --> 00:04:26,480 这个时候它会把它倒回来 112 00:04:26,520 --> 00:04:31,240 还有一种呢就是从等待挂起到等待 113 00:04:31,280 --> 00:04:33,440 这种状态呢通常情况下是 114 00:04:33,480 --> 00:04:35,800 前面的进程释放了大量的空间 115 00:04:35,840 --> 00:04:38,320 而且这个等待挂起的 116 00:04:38,360 --> 00:04:41,200 这个进程呢优先级比较高 117 00:04:41,240 --> 00:04:44,600 好 这是呢我们在这里说到的 118 00:04:44,640 --> 00:04:47,720 挂起进程模型里头 119 00:04:47,760 --> 00:04:49,800 它所涉及到进程模型的变化 120 00:04:49,840 --> 00:04:52,120 那我们看到由于状态的不同 121 00:04:52,160 --> 00:04:55,240 我们会涉及到很多的队列 122 00:04:55,280 --> 00:04:57,440 把进程控制块连成一体 123 00:04:57,480 --> 00:04:59,040 好 从这个角度来讲呢 124 00:04:59,080 --> 00:05:01,200 我们甚至可以用状态队列 125 00:05:01,240 --> 00:05:03,320 来对进程的状态呢 126 00:05:03,360 --> 00:05:04,760 有某种形式的描述 127 00:05:04,800 --> 00:05:06,360 也就是说我们通常情况下 128 00:05:06,400 --> 00:05:09,560 在代码当中去考察进程状态时候 129 00:05:09,600 --> 00:05:11,640 就是它的标志性操作 130 00:05:11,680 --> 00:05:13,840 就是把这个PCB 131 00:05:13,880 --> 00:05:16,080 挂到哪个队列当中 132 00:05:16,120 --> 00:05:17,360 好 我们在这里呢 133 00:05:17,400 --> 00:05:18,240 维护了一组队列 134 00:05:18,280 --> 00:05:20,080 表示进程的当前状态 135 00:05:20,120 --> 00:05:22,600 然后每一个不同的队列呢 136 00:05:22,640 --> 00:05:24,360 它表示不同的状态 137 00:05:24,400 --> 00:05:25,920 你比如说各种各样的等待 138 00:05:25,960 --> 00:05:28,160 就绪队列 139 00:05:28,200 --> 00:05:31,160 好 这些队列的状态的变化呢 140 00:05:31,200 --> 00:05:32,760 导致了相应的进程在 141 00:05:32,800 --> 00:05:35,600 不同队列之间的切换 142 00:05:35,640 --> 00:05:37,240 或者说移动 143 00:05:37,280 --> 00:05:38,200 那这时候呢 144 00:05:38,240 --> 00:05:40,360 我们可以把这种状态的变化呢 145 00:05:40,400 --> 00:05:42,480 以一种队列的形式来体现出来 146 00:05:42,520 --> 00:05:45,720 我们这儿有就绪队列若干个 147 00:05:45,760 --> 00:05:48,480 然后这个地方有等待队列若干个 148 00:05:48,520 --> 00:05:49,160 这是处理机 149 00:05:49,200 --> 00:05:51,240 实际上这时候的状态变迁呢 150 00:05:51,280 --> 00:05:55,440 变成是队列之间的进程的搬迁 151 00:05:55,480 --> 00:05:56,520 152 00:05:56,560 --> 00:05:57,520 好 到这儿呢 153 00:05:57,560 --> 00:06:01,080 我们就把进程的状态呢说明白了 154 00:06:01,120 --> 00:06:01,760 155 00:06:01,800 --> 00:06:01,840