对按进程优先级调度进程的算法分析

首先源码是老师给的。。不保证正确性

我们先分析一下它是什么意思

首先如果当前运行指针不空。。我们就执行算法

直到它为空为止

首先判断它有没有到请求资源的时刻

就是判断它的已运行时间和需要请求资源的时刻大小相等

如果相等则说明该进程需要申请资源才能往后执行

那么我们就进入申请资源的步骤

此处只有一个资源

如果该资源当前正好空闲。。那么我们就占用它。。标记已占用和进程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

时间: 2024-10-24 23:06:31

对按进程优先级调度进程的算法分析的相关文章

进程(二) —— 进程控制块

进程(二) —— 进程控制块 进程控制块(PCB, Process Control Block) 定义: 操作系统管理和控制进程运行所用的信息集合 操作系统用 PCB 来 描述进程的 基本情况 以及 运行变化 的过程 PCB是进程存在的唯一标志 每个进程都在 操作系统 中有一个对应的PCB 进程控制块的使用 进程创建 生成 该进程的 PCB 进程终止 回收它的PCB 进程的组织管理 通过对PCB的组织管理来实现 进程控制块内容 进程标志信息 处理机现场保存 进程控制信息 进程控制信息 调度和状态

孤儿进程 && 僵尸进程

background: unix: 每个子进程退出,内核释放该进程所有资源,打开的文件,占用的内存 保留的信息:the process ID,the termination status of the process,the amount of CPU time taken by the process 父进程用wait()/waitpid()释放子进程的保留信息 父进程不调用wait()/waitpid()进程号一直被占用,系统所能提供的进程号有限,没有可用的进程号导致系统不能产生新的进程 Z

进程管理—进程描述符(task_struct)

http://blog.csdn.net/qq_26768741/article/details/54348586 当把一个程序加载到内存当中,此时,这个时候就有了进程,关于进程,有一个相关的叫做进程控制块(PCB),这个是系统为了方便进行管理进程所设置的一个数据结构,通过PCB,就可以记录进程的特征以及一些信息. 内核当中使用进程描述符task_struct. 这个task_struct就是一个定义的一个结构体,通过这个结构体,可以对进程的所有的相关的信息进行维护,对进程进行管理. 接下来我们

进程与进程之间通信Manager

1 #!/usr/bin/env python 2 from multiprocessing import Process,Manager 3 4 #Manager进程与进程之间通信 5 def Foo(i,dic): 6 dic[i] = 100+i 7 print(dic.values()) 8 if __name__ == '__main__': 9 manage = Manager() 10 dic = manage.dict() 11 for i in range(2): 12 p =

进程篇—进程整理(转)

一.概括 系统启动架构图: 上图在Android系统-开篇中有讲解,是从Android系统启动的角度来分析,本文是从进程/线程的视角来分析该问题. 1.1 父进程 在所有进程中,以父进程的姿态存在的进程(即图中的浅红色项),如下: kthreadd进程: 是所有内核进程的父进程 init进程 : 是所有用户进程的父进程(或者父父进程) zygote进程 : 是所有上层Java进程的父进程,另外zygote的父进程是init进程. 1.2 重量级进程 在Android进程中,有3个非常重要的进程(

c# 关闭软件 进程 杀死进程

c# 关闭软件 进程  杀死进程 foreach (System.Diagnostics.Process p in System.Diagnostics.Process.GetProcessesByName("Server")) { p.Kill(); }

linux内核之进程的基本概念(进程,进程组,会话关系)

进程是操作系统的一个核心概念.每个进程都有自己唯一的标识:进程ID,也有自己的生命周期.一个典型的进程的生命周期如图4-1所示. 进程都有父进程,父进程也有父进程,这就形成了一个以init进程为根的家族树.除此以外,进程还有其他层次关系:进程.进程组和会话. 进程组和会话在进程之间形成了两级的层次:进程组是一组相关进程的集合,会话是一组相关进程组的集合. 这样说来,一个进程会有如下ID: ·PID:进程的唯一标识.对于多线程的进程而言,所有线程调用getpid函数会返回相同的值. ·PGID:进

Linux 僵尸进程 孤儿进程

今天有人问到了僵尸进程 和孤儿进程,以前遇到过,但是没有太注意,这里mark 一下 僵尸进程 :进程 fork 出来子进程,但是 父进程没有调用wait 或waitpid 获取子进程的状态信息,子进程的进程描述符任然保存在系统中 查找僵尸进程 ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]' 孤儿进程 :父进程退出,子进程任然在继续,孤儿进程将被init( 1) 收养,并由Init完成对他们的信息采集 僵尸进程的危害:进程退出时候,内核将释放所有资源,包括打

浅析三种特殊进程:孤儿进程,僵尸进程和守护进程.

其实有时想想linux内核的设计也蕴含着很多人生哲学,在linux中有这么几个特殊进程中,我们一开始见到它们的名字可能还会觉得很诧异,但在了解完了原理后,我们仔细想想,这样的命名也不无道理!下面我就给大家分别介绍一下这三种特殊的进程! 1.孤儿进程 如果父进程先退出,子进程还没退出那么子进程将被 托孤给init进程,这是子进程的父进程就是init进程(1号进程).其实还是很好理解的. #include <sys/types.h> #include <unistd.h> #inclu