⑴ 用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(本);
}
}
}