操作系统之进程调度——优先权法和轮转法(附上样例讲解)
操作系統之進程調度——優先權法和輪轉法(附上樣例講解)
操作系統之銀行家算法—詳解流程及案例數據
操作系統之多線程編程—讀者優先/寫者優先詳解
操作系統之存儲管理——FIFO算法和LRU算法
操作系統之磁盤調度——SCAN實例講解
要求
一、實驗目的
多道程序設計中,經常是若干個進程同時處于就緒狀態,必須依照某種策略來決定那個進程優先占有處理機。因而引起進程調度。本實驗模擬在單處理機情況下的處理機調度問題,加深對進程調度的理解。
二、實驗內容
1.優先權法、輪轉法
簡化假設
1)進程為計算型的(無I/O)
2)進程狀態:ready、running、finish
3)進程需要的CPU時間以時間片為單位確定
2.算法描述
1)優先權法——動態優先權
當前運行進程用完時間片后,其優先權減去一個常數。
2)輪轉法
三、流程圖
優先權:
輪轉法:
分析
?想要完成操作系統算法第一步要弄清楚操作系統相關的專業術語。弄清各個算法的流程和目的要求。才能模擬出相關算法的過程。下面先附上實驗的相關要求?
通過本次實驗,深刻的理解了操作系統中線程資源的分配方式和進程的調度方式。操作系統實驗重在理解每一個算法的意圖和目的,那么就選擇適當的數據結構模擬過程就可以完成相關算法了。
優先權算法:
輪轉法:
- 輪轉法強調先進先出的拉鏈式順序,而不以其他的權值作為開始/調度的先后順序,所以普通先進先出的普通隊列是解決該算法的最好方法。
- . 輪轉法和優先權法不一樣的是優先權法每次只進一個線程只執行一次。而輪轉法是進一個可以執行最多是該線程可輪轉的次數/輪轉值(可能在中間就完成線程的釋放),所以在寫程序的時候每次都要判斷是否已經輪轉。并且到最后還要判斷還是否需要調度。如果需要,再拋入隊尾。
代碼
實現的代碼(java):
import java.util.ArrayDeque; import java.util.Comparator; import java.util.PriorityQueue; import java.util.Queue; import java.util.Scanner;public class priority {static pcb pcb[];public static void main(String[] args) {// TODO 自動生成的方法存根System.out.println("創建線程數量:");Scanner sc=new Scanner(System.in);int n=sc.nextInt();pcb=new pcb[n];for(int i=0;i<n;i++){pcb[i]=new pcb(i+1,"ready");}System.out.println("是否采用優先權?Y/N");String s=sc.next();if(s.equals("Y")){priority();}else{lunzhuan();}//printstatus();}private static void lunzhuan() {Queue<pcb>q1=new ArrayDeque<>();for(int i=0;i<pcb.length;i++){int lunhzun=(int) (Math.random()*4)+1+(int)(Math.random()*2);//不能為0int needtime=(int)(Math.random()*8)+1;pcb[i].lunhzuan=lunhzun;pcb[i].needalltime=needtime; q1.add(pcb[i]);}while(!q1.isEmpty()){pcb team=q1.poll();int time=0;//占用cpu時間片樹while(time<team.lunhzuan){if(team.needalltime<=0){break;}time++;team.needalltime-=1;team.status="running";printluzhuan();System.out.println();}if(team.needalltime<=0) {team.status="finish";}else{team.status="ready";q1.add(team);}}printluzhuan();}private static void printluzhuan() {for(int i=0;i<pcb.length;i++){System.out.println("threadid:"+pcb[i].id+" "+pcb[i].status+" needtime:"+pcb[i].needalltime+" lunzhuan:"+pcb[i].lunhzuan);} }private static void priority() {//優先權Queue<pcb>q1=new PriorityQueue<pcb>(com);for(int i=0;i<pcb.length;i++){int proty=(int) (Math.random()*15);int needtime=(int)(Math.random()*4)+1;pcb[i].proty=proty;pcb[i].needalltime=needtime;q1.add(pcb[i]);} // for(int i=0;i<pcb.length;i++) // { // q1.add(pcb[i]); // }while(!q1.isEmpty()){pcb team=q1.poll();team.needalltime-=1;team.proty-=3;team.status="running";printstatus();System.out.println();if(team.needalltime>0){team.status="ready";q1.add(team); }elseteam.status="finish";}printstatus();}private static void printstatus() {// TODO 自動生成的方法存根for(int i=0;i<pcb.length;i++){System.out.println("threadid:"+pcb[i].id+" "+pcb[i].status+" needtime:"+pcb[i].needalltime+" priority:"+pcb[i].proty);} }static Comparator<pcb> com=new Comparator<pcb>() {@Overridepublic int compare(pcb o1, pcb o2) {// TODO 自動生成的方法存根return o2.proty-o1.proty;}}; static class pcb{ int id;//進程idString status;//進程狀態int proty;int needalltime;//需要總時間int lunhzuan;//輪轉時間樹public pcb(int id, String status) {// TODO 自動生成的構造函數存根this.id=id;this.status=status;} } }數據打印
優先權:
2:輪轉法:
聲明:這只是本人的個人理解,如果又紕漏,還請大神指出!?
如果對后端、爬蟲、數據結構算法等感性趣歡迎關注我的個人公眾號交流:bigsai
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的操作系统之进程调度——优先权法和轮转法(附上样例讲解)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 灰暗而空虚的景色β(数学思维题)
- 下一篇: 操作系统之银行家算法—详解流程及案例数据