首先源码是老师给的。。不保证正确性
我们先分析一下它是什么意思
首先如果当前运行指针不空。。我们就执行算法
直到它为空为止
首先判断它有没有到请求资源的时刻
就是判断它的已运行时间和需要请求资源的时刻大小相等
如果相等则说明该进程需要申请资源才能往后执行
那么我们就进入申请资源的步骤
此处只有一个资源
如果该资源当前正好空闲。。那么我们就占用它。。标记已占用和进程ID
否则的话。。就将它本次调度的时间计数器置零,状态标记为等待,将其插入到等待队列里,
同时将就绪队列的第一个进程装载到当前运行指针。。当然队列要pop
如果装载到的第一个进程第0s就需要申请资源呢?那么并没有判断这个
所以这个程序这里也是不严谨的
那么这个程序是不严谨的。。并没有判断就绪队列是否为NULL,
如果run为NULL,那么后面的程序将会崩溃,需要小心
假设run不为NULL
那么我们就让这个进程运行一个时间单位,总实际运行时间+1,
本次调度的时间计数器+1
并sleep(1);
changePrio++;改变优先数的时刻+1
如果这个时刻是一个偶数那么我们就改变
run队列的优先级,和ready队列的优先级
但是run不是只是一个当前指针吗。。我们依据什么来改优先级
怎么改。。改成什么。。。
那么这里其实改的是当前run指针的进程的优先级
由于他这里设置优先值值最大20.。。越大优先级越小
所以说。。如果不等于这个最大值。。我们就+1,降低它的优先级
那么对于等待队列中的所有进程。。统统减去2.。增加它的优先级
但是他这里系统进程的优先值可以比用户还小。。这tm是什么鬼
他还写了一个sort(),把优先值最小的放到最前面
那么如果不是偶数我们那就不改变优先级
如果一个进程的总运行时间减去它开始占用这个资源的时间大于等于这个资源的最大占用时间
前提是每一个进程都一定需要占用这个资源。。
那么我们就要释放这个资源。。
那么假设这个进程一直需要这个资源才能继续运行。。那么这时候
我们释放了资源之后它就不能正常执行了,如果它还需要执行的话。。
那么如果这个进程执行完了。。如果它占用了资源我们就需要释放资源
并将其附加到完成队列的队尾。。
如果就绪队列不空我们就装载到当前运行指针
如果这个进程没执行完。。但是它时间片用完了。。那么我们
就清空本次调度的时间计数器。。如果就绪队列不空就插入到就绪队列
但是程序也没有考虑插入就绪队列时是否要释放资源。。我认为此处是应当释放资源的
但是程序却没有考虑如果当前就绪队列正好为空。。我们则需要新建就绪队列
因为这个没有执行的程序无论如何都希望被执行。。除非你给我一个什么理由
然后如果就绪队列不空我们就装载就绪队列的队头。。但是如果是上一种新建
的就绪队列。。你又把这个进程弄进来了。。所以说现在我又意识到如果说
这个逻辑是一个进程停止后就执行下一个处于就绪的进程。。然而这两者是有可能相等的
处理完上面的逻辑。。如果新的就绪队列是空的。。那么run就是NULL
那么程序后面依然没有考虑这一点
假设run不为NULL
那么run此时代表的进程可能是已经执行了一个时间的进程
或者是新的从就绪队列Load的进程
那么如果就绪队列不空我们就需要比较。。
究竟哪一个优先值更低即优先级更高。。如果说当前就绪队列里的优先级高
那么我们就把当前run代表的进程插入到就绪队列的队尾
并且装载就绪队列的第一个进程。。。
那么执行完一个时间单位的run的进程。。它
可能是要释放资源的。。那些因为资源抢占而进入等待队列的进程
肯定不能放过这个机会。。如果说资源空闲。。那么等待队列的队首
就进入就绪队列。。等待队列pop
输出本次调度的结果。。
然后如果此时run不为NULL