导航:首页 > 编程语言 > 进程调度算法java

进程调度算法java

发布时间:2022-09-15 00:36:14

⑴ 用c语言或者java设计出一个任务调度器。。。

公众:类PrivilegeProcess {
公共静态无效的主要(字串[] args){

MyQueue的MyQueue的新MyQueue的();/ /声明队列

印刷电路板[PCB = {新的PCB(001 ,8,1),新的PCB(002,7,9),新的PCB(003,3,8),新的PCB(004,1,7),新的PCB(005,7,4)};
> PCB段=新的PCB();

(INT I = 0; <pcb.length; + +){/ /初始化先进行排序,选择排序这里使用的是高优先级的一线队

(J =我; <pcb.length; J + +){

(PCB [I]。特权<PCB [J]。特权){

段= PCB [1];

PCB [I] = PCB [J];

PCB [J] =段;

}

}

}

体系。通过out.println(“入队后第一时间的进程的顺序:”);

(INT I = 0; <pcb.length; + +){

的System.out调用println(第一次入队#程序名称:“+ PCB [我]。名称+ totaltime:”+ PCB [I]。totaltime +“的”特权“+ PCB [我]。特权); }

();

myqueue.start(PCB);

}

}

类MyQueue的{

INT指数= 0;

PCB [] PC =新的PCB [5];

PCB [] PC1 =新的PCB [4];

PCB温度=新的PCB() BR />公共无效排队(PCB工艺){/ /排队算法

(指数== 5){

(“出界!”);

返回

}

PC [索引] =进程;

指数+ +;

}

公共:PCB DEQUEUE(){/ /出队算法(索引== 0)

返回空;

(INT I = 0; <pc1.length; + +){

PC1 [I] = PC [ +1];

}

指数 -

温度= PC [0];

(INT I = 0; <pc1.length; + +){ BR /> PC [I] = PC1 [I];

}

回报条件;

}

公共无效启动(PCB [] PC){/ /进程表算法

(PC [0]。isNotFinish ==真| | PC [1 isNotFinish ==真| | PC [2 isNotFinish ==真| | PC [3]。时isNotFinish ==真| | PC [4]。isNotFinish ==){

/ / *注:| |运算符都是假的,所有的表达式结果为假,否则真

(INT I = 0; <PC长度; + +){

PC [I]。运行(这一点); />} 的System.out.println();

(INT I = 0; <pc.length; + +){/ /处理每个运行一次运行的时间片的长度重新排序优先一旦

(J =我; <pc.length; J + +){

如果(PC [I]特权<PC [J]。特权){

温度= PC [I];

PC [I] = PC [J];

PC [J] =温度;

}

}

}

}

}

}

类PCB {/ /声明过程级

和int名,totaltime ,运行时特权;

布尔isNotFinish的;

公众PCB(){

}

公开PCB(名称,诠释totaltime特权){

this.name =的名称;/ /进程名

this.totaltime = totaltime ;/ /

this.privilege =特权;/ /总时间优先 this.runtime = 2 ;/ /时间片值是2

this.isNotFinish =真;/ /是否执行完成

(“初始值:程序名称:”+名+“totaltime:”+ totaltime +“特权”+特权);

System.out的。调用println();

}

MyQueue的MQ公共无效的run(){/ /处理的基础上实施的时间片算法

(totalTime> 1){ totaltime =运行;/ /总时间大于1,总时间=总时间 - 时间片

特权 -

(“程序名称:”+姓名+“ remaintime:“+ +”特权“+特权); totaltime

的} else if(totaltime == 1){

totaltime - ;/ /总时间为1时,执行时间为1
>特权 -

(“程序名称:”+姓名+“remaintime:”+ totaltime +“特权”+特权);

}其他{

isNotFinish =假;/ / 0,将isNotFinish标志设置为假

}

如果(isNotFinish ==真){br mq.deQueue(); mq.enQueue(本); }

}
}

⑵ Java培训班都需要学什么

我了解到Java培训学习课程分为四部分:

1、Java语言基础知识的学习与应用,掌握常见的数据结构和实用算法。

2、数据库的学习与应用,熟练使用oracle数据库。

3、熟练运用Java脚本语言编程,掌握HTML的基本原理与运用。

4、学习软件项目开发。

Java是一门面向对象编程语言,Java语言集合了C++的优点,丢弃了缺点,所以Java语言表现的功能强大而简单易用。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,让程序员能够以清晰的思维方式进行复杂的编程?。

想了解更多信息,我推荐到AAA教育集团了解一下。AAA教育集团以软件教育、数字教育为主,致力于培养“高级软件工程师”为特色,以促进大学生高质量就业为办学宗旨,是业界“互联网金领生产基地”。

随着当今职业多元化发展态势,我国对IT行业软件技术人才需求越来越旺盛,校企双方联合培养软件技术人才,是学校顺应时代发展的必要举措,对推动国家信息化发展进程具有重要的现实意义。

⑶ 求磁盘调度算法scan算法的java代码

1、先来先服务算法(FCFS)First Come First Service
这是一种比较简单的磁盘调度算法。它根据进程请求访问磁盘的先后次序进行调度。此算法的优点是公平、简单,且每个进程的请求都能依次得到处理,不会出现某一进程的请求长期得不到满足的情况。此算法由于未对寻道进行优化,在对磁盘的访问请求比较多的情况下,此算法将降低设备服务的吞吐量,致使平均寻道时间可能较长,但各进程得到服务的响应时间的变化幅度较小。
先来先服务 (125)86.147.91.177.94.150.102.175.130

[java] view plain print?

⑷ 求一个基于优先级的时间片轮转调度算法。实在是不太会做了,没思路。要求java 要求: (1)设系统

cpu进程调度模拟
四个队列是优先级队列(优先级高的在前面)
可以使用结构体做队列的节点
时间片轮转就是指定一个执行时间,时间一到就处理下一个进程,将当前进程进行状态转换(也就是换着状态需要向其放入相应的队列中,优先级队列)

理清头绪的话程序不算太复杂但也很麻烦

⑸ java进程调度中为什么进程名都是1

摘要 Linux2.4版本使用的调度算法的时间复杂度为O(n),其主要原理是通过轮询所有可运行任务列表,然后挑选一个最合适的任务运行,所以其时间复杂度与可运行任务队列的长度成正比。

⑹ fork后子进程从哪里开始执行

(代码验证) fork确实创建了一个子进程并完全复制父进程,但是子进程是从fork后面那个指令开始执行的。 对于原因也很合逻辑,如果子进程也从main开头到尾执行所有指令,那它执行到fork指令时也必定会创建一个子子进程,如此下去这个小小的程序就可以创建无数多个进程可以把你的电脑搞瘫痪,所以fork作者肯定不会傻到这种程度fork和线程,进程的理解2011-10-11 10:09 本文分为三部分:1. 什么是fork?2. fork用途?3. fork怎么工作? 1. 什么是fork?Fork源于OS中多线程任务的需要。在传统的Unix环境下,有两个基本的操作用于创建和修改进程:函数fork( )用来创建一个新的进程,该进程几乎是当前进程的一个完全拷贝;函数族exec( )用来启动另外的进程以取代当前运行的进程。下面说一下进程和线程。进程的简单理解就是:一个进程表示的就是一个可执行程序的一次执行过程中的一个状态。一个进程,主要包含三个元素:一个可以执行的程序; --- 代码段 和该进程相关联的全部数据(包括变量,内存空间,缓冲区等等); --- 数据段 程序的执行上下文(execution context)。 --- 堆栈段 "代码段",顾名思义,就是存放了程序代码的数据,假如机器中有数个进程运行相同的一个程序,那么它们就可以使用相同的代码段。"堆栈段"存放的就是子程序的返回地址、子程序的参数以及程序的局部变量。而数据段则存放程序的全局变量,常数以及动态数据分配的数据空间(比如用malloc之类的函数取得的空间)。 一般的CPU都有上述三种段寄存器,以方便操作系统的运行。这三个部分也是构成一个完整的执行序列的必要的部分。系统如果同时运行数个相同的程序,它们之间就不能使用同一个堆栈段和数据段。 操作系统对进程管理,最典型的是通过进程表完成的。进程表里再通过一个称为“程序计数器(program counter, pc)”的寄存器来完成“上下文的切换”。(实际的上下文交换需要涉及到更多的数据,和fork无关,不再多说,PC主要用于指出程序当前已经执行到哪里,是进程上下文的重要内容,换出CPU的进程要保存这个寄存器的值,换入CPU的进程,也要根据进程表中保存的本进程执行上下文信息,更新这个寄存器)。 进程表中的每一个表项,记录的是当前操作系统中一个进程的情况。对于单 CPU的情况而言,每一特定时刻只有一个进程占用 CPU,但是系统中可能同时存在多个活动的(等待执行或继续执行的)进程。 PC用于指出当前占用 CPU的进程要执行的下一条指令的位置。 当分给某个进程的 CPU时间已经用完,操作系统将该进程相关的寄存器的值,保存到该进程在进程表中对应的表项里面;把将要接替这个进程占用 CPU的那个进程的上下文,从进程表中读出,并更新相应的寄存器(这个过程称为“上下文交换(process context switch)” 下面继续说fork了。当程序执行到下面的语句:pid=fork(); 操作系统创建一个新的进程(子进程),并且在进程表中相应为它建立一个新的表项。新进程和原有进程的可执行程序是同一个程序;上下文和数据,绝大部分就是原进程(父进程)的拷贝,但它们是两个相互独立的进程!此时程序寄存器pc,在父、子进程的上下文中都声称,这个进程目前执行到fork调用即将返回(此时子进程不占有CPU,子进程的pc不是真正保存在寄存器中,而是作为进程上下文保存在进程表中的对应表项内)。问题是怎么返回。它们的返回顺序是不确定的,取决于OS内的调度。如果想明确它们的执行顺序,就得实现“同步”,或者是使用vfork()。这里假设父进程继续执行,操作系统对fork的实现,使这个调用在父进程中返回刚刚创建的子进程的pid(一个正整数),所以下面的if语句中pid<0, pid==0的两个分支都不会执行。所以一般执行fork后都会有两个输出。 2. Fork用途归结起来有两个:第一, 一个进程希望复制自身,从而父子进程能执行不同代码段。第二, 进程想执行另外一个程序归结起来说就是实现多线程。C语言多线程实现需要自己控制来实现,这个比JAVA要复杂。 3. Fork怎么工作?先看一个例子:#include <unistd.h>;#include <sys/types.h>;int main (){ pid_t pid; pid=fork(); // 1)从这里开始程序分岔,父子进程都从这一句开始执行一次 if (pid < 0) printf("error!"); else if (pid == 0) printf("child process, process id is %dn", getpid()); else // pid > 0 printf("parent process, process id is %dn",getpid()); return 0;}结果:[root@localhost yezi]# ./a.out parent process, process id is 4285 对于上面程序段有以下几个关键点: (1)返回值的问题:正确返回:父进程中返回子进程的pid,因此> 0;子进程返回0 错误返回:-1 子进程是父进程的一个拷贝。即,子进程从父进程得到了数据段和堆栈段的拷贝,这些需要分配新的内存;而对于只读的代码段,通常使用共享内存的方式访问。父进程与子进程的不同之处在于:fork的返回值不同——父进程中的返回值为子进程的进程号,而子进程为0。只有父进程执行的getpid()才是他自己的进程号。对子进程来说,fork返回给它0,但它的pid绝对不会是0;之所以fork返回0给它,是因为它随时可以调用getpid()来获取自己的pid; (2) fork返回后,子进程和父进程都从调用fork函数的下一条语句开始执行。这也是程序中会打印两个结果的原因。 fork之后,操作系统会复制一个与父进程完全相同的子进程。不过这在操作系统看来,他们更像兄弟关系,这2个进程共享代码空间,但是数据空间是互相独立的,子进程数据空间中的内容是父进程的完整拷贝,指令指针也完全相同,但只有一点不同,如果fork成功,子进程中fork的返回值是0,父进程中fork的返回值是子进程的进程号,如果fork不成功,父进程会返回错误。2个进程一直同时运行,而且步调一致,在fork之后,他们分别作不同的工作,也就是分岔了。这也是fork为什么叫fork的原因。至于哪一个先运行,与操作系统的调度算法有关,而且这个问题在实际应用中并不重要,如果需要父子进程协同,可以通过原语的办法实现同步来加以解决。 为了加深理解,看下面例子:#include <stdio.h> #include "../include/apue.h" #include <unistd.h>int main(){pid_t a_pid, b_pid; if((a_pid=fork())<0) // // 一定要有红色括号!! 没有的话就a_pid永远等于0,则永远不会执行父进程!!! printf("error!"); else if(a_pid==0){printf("the first child's pid=%d\n",getpid()); printf("b\n");}else{printf("the parent's pid=%d\n",getpid()); printf("a\n"); } if((b_pid=fork())<0) printf("error!"); else if(b_pid==0){printf("c\n");}else{printf("e\n");}return 0;} 输出的结果: (1)the first child's pid=12623bcethe parent's pid=12622ace (2)the first child's pid=12638bthe parent's pid=12637acece (3)the first child's pid=12642bthe parent's pid=12641accee 很奇妙的结果。不过理解了“子进程和父进程都从调用fork函数的下一条语句开始执行”了也不奇怪了。同是这里引入理解fork的第三点 (3) fork函数不同于其他函数,在于它可能会有两个或是多个返回值,而且是同时返回两个值。继续分析上面的例子。 理解上例的关键在于fork()的返回点在哪里。Fork()同时返回两个值。其中pid=0的这个返回值用来执行子进程的代码,而大于0的一个返回值为父进程的代码块。第一次fork调用的时候生叉分为两个进程,假设为a父进程和b子进程。他们分别各自在第二次fork调用之前打印了b和a各一次;在第一次叉分的这两个进程中都含有 if((b_pid=fork())<0) // 一定要有红色括号!! 没有的话就b_pid永远等于0{printf("error!");}else if(b_pid==0) printf("c/n");elseprintf("e/n"); 这段代码。很明显,a父进程和b子进程在这段代码中又各自独立的被叉分为两个进程。这两个进程每个进程又都打印了e,c各一次。到此,在程序中总共打印两次c,e和一次a,b。总共6个字母。 注:在第一次叉分为两个进程的时候父子进程含有完全相同的代码(第二次仍然相同),只是因为在父子进程中返回的PID的值不同,父进程代码中的PID的值大于0,子进程代码中的值等于0,从而通过if这样的分支选择语句来执行各自的任务。 当然在使用fork中还有很多细节,比如输出时,对缓冲区的不同处理会使父子进程执行过程中输出不同,以及fork后,子进程的exec和exit的一些实现细节。以后再说。

⑺ cpu调度的基本方式

我们知道,程序需要获得CPU的资源才能被调度和执行,那么当一个进程由于某种原因放弃CPU然后进入阻塞状态,下一个获得CPU资源去被调度执行的进程会是谁呢?下图中,进程1因为阻塞放弃CPU资源,此时,进程2刚IO操作结束,可以获得CPU资源去被调度,进程3的时间片轮转结束,也同样可以获得CPU资源去被调度,那么,此时的操作系统应该安排哪个进程去获得CPU资源呢?这就涉及到我们操作系统的CPU调度策略了。

根据生活中的例子,我们很容易想到以下两种策略CPU调度的直观想法:1.FIFO谁先进入,先调度谁,这是一种非常简单有效的方法,就好比我们去饭堂打饭,谁先到就给谁先打饭。但是这种策略会遇到一个问题:如果遇到一个很小的任务,但是它是最后进入的,那么必须得前面一大堆任务结束完后才能执行这个小小的任务,这样就感觉很不划算呀!因为我只是简简单单的一个小任务,但是从打开这个任务到结束这个任务要很久。这显然不符合我们的需求,因而我们会想到第2种策略,就是先调度小任务,后调度大任务。2.Priority很简单,就是任务短的优先执行,但是此时又有问题了,任务虽然短,但是它的执行时间不一定短,就好比在一个银行业务中,客户填写一个表,这是一个非常短的任务吧——就单单填个表,但是这个表很长很长,那么这个短任务它的执行时间就很长了,我们怎么知道这个短的任务将来会执行多长的时间呢?所以,这样的策略还是依然有问题。那么,面对诸多的场景,如何设计调度算法呢?首先,我们要明白我们的算法应该让什么更好呢?面对客户:银行调度算法的设计目标应该是用户满意;而面对进程:CPU调度的目标应该是进程满意。那怎么才能让进程满意呢?那就是时间了。进程希望尽早地结束任务,这就是周转时间(从任务到达到任务结束)要短,而且希望用户的操作能够尽快地被响应,这就是响应时间(从操作发生到响应)要短。而且系统内耗时间要少,吞吐量(任务的完成量)要大,系统需要把更多的时间用在任务的执行上,而不能老是去做无关紧要的事情,例如:频繁切换任务,切换栈,分配资源等事情。同时,系统还要去合理地调配任务。那么,CPU的调度策略如何做到合理呢?首先得明白系统中有以下的几种矛盾。1.吞吐量和响应时间之间有矛盾响应时间小=>切换次数多=>系统内耗大=>吞吐量小由于需要较短的响应时间,那么就得频繁地切换任务,这样系统的很多时间都花在切换任务上面了,系统的内耗大了,吞吐量就小了。2.前台任务和后台任务的关注点不同前台任务关注响应时间,后台任务关注周转时间。前台任务例如我们的word文档,我们打一个字,需要立马显示在文档中,这就是word文档这个任务关注的是响应时间;而后台任务中,例如我们的javac编译java代码,它的周转时间要小,即该任务从进入到结束所花的时间要小,即编译完成的时间要小。http://3.IO约束型任务和CPU约束型任务各有各的特点IO约束型任务就是使用CPU的时间较少,进行IO操作的时间较长,CPU约束型的任务就是使用CPU的时间较长。因此,要做到合理,需要折中、综合考虑以上的几种矛盾。由此,产生了一些CPU的调度算法,在下一节我们将重点讲述这些CPU调度算法。

关注小鲸融创,一起深度学习金融科技!

编辑于 2019-12-11 · 着作权归作者所有
赞同 1
评论
展开全部

⑻ )用C语言(或其它语言,如Java)编程实现对N个进程采用某种进程调度算法(如动态优先权调度

公众:类PrivilegeProcess {
公共静态无效的主要(字串[] args){

MyQueue的MyQueue的新MyQueue的();/ /声明队列

印刷电路板[PCB = {新的PCB(001 ,8,1),新的PCB(002,7,9),新的PCB(003,3,8),新的PCB(004,1,7),新的PCB(005,7,4)};
> PCB段=新的PCB();

(INT I = 0; <pcb.length; + +){/ /初始化先进行排序,选择排序这里使用的是高优先级的一线队

(J =我; <pcb.length; J + +){

(PCB [I]。特权<PCB [J]。特权){

段= PCB [1];

PCB [I] = PCB [J];

PCB [J] =段;

}

}

}

体系。通过out.println(“入队后第一时间的进程的顺序:”);

(INT I = 0; <pcb.length; + +){

的System.out调用println(第一次入队#程序名称:“+ PCB [我]。名称+ totaltime:”+ PCB [I]。totaltime +“的”特权“+ PCB [我]。特权); }

();

myqueue.start(PCB);

}

}

类MyQueue的{

INT指数= 0;

PCB [] PC =新的PCB [5];

PCB [] PC1 =新的PCB [4];

PCB温度=新的PCB() BR />公共无效排队(PCB工艺){/ /排队算法

(指数== 5){

(“出界!”);

返回

}

PC [索引] =进程;

指数+ +;

}

公共:PCB DEQUEUE(){/ /出队算法(索引== 0)

返回空;

(INT I = 0; <pc1.length; + +){

PC1 [I] = PC [ +1];

}

指数 -

温度= PC [0];

(INT I = 0; <pc1.length; + +){ BR /> PC [I] = PC1 [I];

}

回报条件;

}

公共无效启动(PCB [] PC){/ /进程表算法

(PC [0]。isNotFinish ==真| | PC [1 isNotFinish ==真| | PC [2 isNotFinish ==真| | PC [3]。时isNotFinish ==真| | PC [4]。isNotFinish ==){

/ / *注:| |运算符都是假的,所有的表达式结果为假,否则真

(INT I = 0; <PC长度; + +){

PC [I]。运行(这一点); />} 的System.out.println();

(INT I = 0; <pc.length; + +){/ /处理每个运行一次运行的时间片的长度重新排序优先一旦

(J =我; <pc.length; J + +){

如果(PC [I]特权<PC [J]。特权){

温度= PC [I];

PC [I] = PC [J];

PC [J] =温度;

}

}

}

}

}

}

类PCB {/ /声明过程级

和int名,totaltime ,运行时特权;

布尔isNotFinish的;

公众PCB(){

}

公开PCB(名称,诠释totaltime特权){

this.name =的名称;/ /进程名

this.totaltime = totaltime ;/ /

this.privilege =特权;/ /总时间优先 this.runtime = 2 ;/ /时间片值是2

this.isNotFinish =真;/ /是否执行完成

(“初始值:程序名称:”+名+“totaltime:”+ totaltime +“特权”+特权);

System.out的。调用println();

}

MyQueue的MQ公共无效的run(){/ /处理的基础上实施的时间片算法

(totalTime> 1){ totaltime =运行;/ /总时间大于1,总时间=总时间 - 时间片

特权 -

(“程序名称:”+姓名+“ remaintime:“+ +”特权“+特权); totaltime

的} else if(totaltime == 1){

totaltime - ;/ /总时间为1时,执行时间为1
>特权 -

(“程序名称:”+姓名+“remaintime:”+ totaltime +“特权”+特权);

}其他{

isNotFinish =假;/ / 0,将isNotFinish标志设置为假

}

如果(isNotFinish ==真){br mq.deQueue();

mq.enQueue(本);

}

}
}

阅读全文

与进程调度算法java相关的资料

热点内容
压缩因子定义 浏览:966
cd命令进不了c盘怎么办 浏览:212
药业公司招程序员吗 浏览:973
毛选pdf 浏览:659
linuxexecl函数 浏览:727
程序员异地恋结果 浏览:374
剖切的命令 浏览:228
干什么可以赚钱开我的世界服务器 浏览:290
php备案号 浏览:990
php视频水印 浏览:167
怎么追程序员的女生 浏览:487
空调外压缩机电容 浏览:79
怎么将安卓变成win 浏览:459
手机文件管理在哪儿新建文件夹 浏览:724
加密ts视频怎么合并 浏览:775
php如何写app接口 浏览:804
宇宙的琴弦pdf 浏览:396
js项目提成计算器程序员 浏览:944
pdf光子 浏览:834
自拍软件文件夹名称大全 浏览:328