欧美色欧美亚洲高清在线观看,国产特黄特色a级在线视频,国产一区视频一区欧美,亚洲成a 人在线观看中文

  1. <ul id="fwlom"></ul>

    <object id="fwlom"></object>

    <span id="fwlom"></span><dfn id="fwlom"></dfn>

      <object id="fwlom"></object>

      1.操作系統(tǒng)實(shí)驗(yàn)內(nèi)容(進(jìn)程調(diào)度)5篇

      時(shí)間:2019-05-11 23:08:13下載本文作者:會(huì)員上傳
      簡(jiǎn)介:寫(xiě)寫(xiě)幫文庫(kù)小編為你整理了多篇相關(guān)的《1.操作系統(tǒng)實(shí)驗(yàn)內(nèi)容(進(jìn)程調(diào)度)》,但愿對(duì)你工作學(xué)習(xí)有幫助,當(dāng)然你在寫(xiě)寫(xiě)幫文庫(kù)還可以找到更多《1.操作系統(tǒng)實(shí)驗(yàn)內(nèi)容(進(jìn)程調(diào)度)》。

      第一篇:1.操作系統(tǒng)實(shí)驗(yàn)內(nèi)容(進(jìn)程調(diào)度)

      一.實(shí)驗(yàn)?zāi)康?/p>

      用高級(jí)語(yǔ)言編寫(xiě)和調(diào)實(shí)一個(gè)進(jìn)程調(diào)度程序,以加深對(duì)進(jìn)程的概念及進(jìn)程調(diào)度算法的理解. 二.實(shí)驗(yàn)要求:設(shè)計(jì)一個(gè)有 N個(gè)進(jìn)程并發(fā)執(zhí)行的進(jìn)程調(diào)度程序。三.算法講解

      進(jìn)程調(diào)度算法:采用最高優(yōu)先數(shù)優(yōu)先的調(diào)度算法(即把處理機(jī)分配給優(yōu)先數(shù)最高的進(jìn)程)和先來(lái)先服務(wù)算法以及時(shí)間片輪轉(zhuǎn)法。

      每個(gè)進(jìn)程有一個(gè)進(jìn)程控制塊(PCB)表示。進(jìn)程控制塊可以包含如下信息:進(jìn)程名、優(yōu)先數(shù)、到達(dá)時(shí)間、需要運(yùn)行時(shí)間、已用CPU時(shí)間、進(jìn)程狀態(tài)等等。

      進(jìn)程的優(yōu)先數(shù)及需要的運(yùn)行時(shí)間可以事先人為地指定(也可以由隨機(jī)數(shù)產(chǎn)生)。進(jìn)程的到達(dá)時(shí)間為進(jìn)程輸入的時(shí)間。

      進(jìn)程的運(yùn)行時(shí)間以時(shí)間片為單位進(jìn)行計(jì)算。每個(gè)進(jìn)程的狀態(tài)可以是就緒 W(Wait)、運(yùn)行R(Run)、或完成F(Finish)三種狀態(tài)之一。

      就緒進(jìn)程獲得 CPU后都只能運(yùn)行一個(gè)時(shí)間片。用已占用CPU時(shí)間加1來(lái)表示。

      如果運(yùn)行一個(gè)時(shí)間片后,進(jìn)程的已占用 CPU時(shí)間已達(dá)到所需要的運(yùn)行時(shí)間,則撤消該進(jìn)程,如果運(yùn)行一個(gè)時(shí)間片后進(jìn)程的已占用CPU時(shí)間還未達(dá)所需要的運(yùn)行時(shí)間,也就是進(jìn)程還需要繼續(xù)運(yùn)行,此時(shí)應(yīng)將進(jìn)程的優(yōu)先數(shù)減1(即降低一級(jí)),然后把它插入就緒隊(duì)列等待CPU。每進(jìn)行一次調(diào)度程序都打印一次運(yùn)行進(jìn)程、就緒隊(duì)列、以及各個(gè)進(jìn)程的 PCB,以便進(jìn)行檢查。重復(fù)以上過(guò)程,直到所要進(jìn)程都完成為止。四.實(shí)驗(yàn)報(bào)告要求

      1.寫(xiě)出實(shí)驗(yàn)?zāi)康模?2。寫(xiě)出實(shí)驗(yàn)要求:

      3。寫(xiě)出實(shí)驗(yàn)內(nèi)容:(包括算法描述,程序流程圖及給出部分實(shí)驗(yàn)結(jié)果及結(jié)果分析)4。實(shí)驗(yàn)心得體會(huì)。

      附:進(jìn)程調(diào)度源程序如下:

      /*jingchendiaodu.c*/ #include “stdio.h” #include #include #define getpch(type)(type*)malloc(sizeof(type))#define NULL 0 struct pcb /* 定義進(jìn)程控制塊PCB */ { char name[10];char state;int super;int ntime;int rtime;struct pcb* link;}*ready=NULL,*p;typedef struct pcb PCB;sort()/* 建立對(duì)進(jìn)程進(jìn)行優(yōu)先級(jí)排列函數(shù)*/ {

      scanf(“%d”,&p->ntime);printf(“n”);p->rtime=0;p->state='w';p->link=NULL;sort();/* 調(diào)用sort函數(shù)*/ } } int space(){ int l=0;PCB* pr=ready;while(pr!=NULL){ l++;pr=pr->link;} return(l);} disp(PCB * pr)/*建立進(jìn)程顯示函數(shù),用于顯示當(dāng)前進(jìn)程*/ { printf(“n qname t state t super t ndtime t runtime n”);printf(“|%st”,pr->name);printf(“|%ct”,pr->state);printf(“|%dt”,pr->super);printf(“|%dt”,pr->ntime);printf(“|%dt”,pr->rtime);printf(“n”);} check()/* 建立進(jìn)程查看函數(shù) */ { PCB* pr;printf(“n **** 當(dāng)前正在運(yùn)行的進(jìn)程是:%s”,p->name);/*顯示當(dāng)前運(yùn)行進(jìn)程*/ disp(p);pr=ready;printf(“n ****當(dāng)前就緒隊(duì)列狀態(tài)為:n”);/*顯示就緒隊(duì)列狀態(tài)*/ while(pr!=NULL){ disp(pr);pr=pr->link;} } destroy()/*建立進(jìn)程撤消函數(shù)(進(jìn)程運(yùn)行結(jié)束,撤消進(jìn)程)*/ { printf(“n 進(jìn)程 [%s] 已完成.n”,p->name);free(p);

      第二篇:操作系統(tǒng)進(jìn)程調(diào)度實(shí)驗(yàn)

      一.實(shí)驗(yàn)?zāi)康募皩?shí)驗(yàn)環(huán)境 1.實(shí)驗(yàn)?zāi)康?/p>

      通過(guò)觀察、分析實(shí)驗(yàn)現(xiàn)象,深入理解進(jìn)程及進(jìn)程在調(diào)度執(zhí)行和內(nèi)存空間等方面的特點(diǎn),掌握在POSIX 規(guī)范中fork和kill系統(tǒng)調(diào)用的功能和使用。2.實(shí)驗(yàn)環(huán)境

      (1)硬件

      ? CPU:I7-4500U ? 內(nèi)存:8G DDR3 1600 ? 顯示器:華碩筆記本顯示器 ? 硬盤(pán)空間:80G

      (2)軟件

      ? 虛擬機(jī)名稱及版本:非虛擬機(jī)

      ? 操作系統(tǒng)名稱及版本:Ubuntu Kylin 16.04 ? 編譯器:gcc 二.實(shí)驗(yàn)內(nèi)容

      1、實(shí)驗(yàn)前準(zhǔn)備工作

      學(xué)習(xí)man 命令的用法,通過(guò)它查看fork 和kill 系統(tǒng)調(diào)用的在線幫助,并閱讀參考資料,學(xué)會(huì)fork 與kill 的用法,復(fù)習(xí)C 語(yǔ)言的相關(guān)內(nèi)容。

      2、實(shí)驗(yàn)內(nèi)容

      根據(jù)下發(fā)的Linux進(jìn)程管理實(shí)驗(yàn)PPT內(nèi)容,將實(shí)驗(yàn)代碼補(bǔ)充完整。并考慮: 先猜想一下這個(gè)程序的運(yùn)行結(jié)果。假如運(yùn)行“./process 20”,輸出會(huì)是什么樣?然后按照注釋里的要求把代碼補(bǔ)充完整,運(yùn)行程序??梢远噙\(yùn)行一會(huì)兒,并在此期間啟動(dòng)、關(guān)閉一些其它進(jìn)程,看process 的輸出結(jié)果有什么特點(diǎn),記錄下這個(gè)結(jié)果。開(kāi)另一個(gè)終端窗口,運(yùn)行“ps aux|grep process”命令,看看process 究竟啟動(dòng)了多少個(gè)進(jìn)程?;氐匠绦驁?zhí)行窗口,按“數(shù)字鍵+回車”嘗試殺掉一兩個(gè)進(jìn)程,再到另一個(gè)窗口看進(jìn)程狀況。按q 退出程序再看進(jìn)程情況。

      3、回答問(wèn)題

      編寫(xiě)、編譯、鏈接、執(zhí)行實(shí)驗(yàn)內(nèi)容設(shè)計(jì)中的代碼,并回答如下問(wèn)題: 1)你最初認(rèn)為運(yùn)行結(jié)果會(huì)怎么樣?

      手動(dòng)輸入進(jìn)程數(shù),選擇輸入要?dú)⑺赖倪M(jìn)程編號(hào),按q殺死所有進(jìn)程。需手動(dòng)輸入進(jìn)程數(shù),然后鍵入編號(hào)殺死進(jìn)程,鍵入q殺死父進(jìn)程即殺死2)實(shí)際的結(jié)果什么樣?有什么特點(diǎn)?試對(duì)產(chǎn)生該現(xiàn)象的原因進(jìn)行分析。所有進(jìn)程。

      3)proc_number 這個(gè)全局變量在各個(gè)子進(jìn)程里的值相同嗎?為什么? 不相同,proc_number是存儲(chǔ)各個(gè)子進(jìn)程的編號(hào)的,所以在各個(gè)子進(jìn)程中

      是不同的。

      4)kill 命令在程序中使用了幾次?每次的作用是什么?執(zhí)行后的現(xiàn)象是什么?

      使用了2次,第一次是在while循環(huán)中的if語(yǔ)句中使用,用來(lái)殺死用戶鍵入的指定進(jìn)程。第二次是殺死父進(jìn)程,回到程序的開(kāi)始。

      5)使用kill 命令可以在進(jìn)程的外部殺死進(jìn)程。進(jìn)程怎樣能主動(dòng)退出?這兩種退出方式哪種更好一些?

      調(diào)用return 函數(shù)或exit函數(shù)都可以正常退出,而使用kill函數(shù)是異常退出,使用正常退出的方法比較好。

      6)寫(xiě)出fork()和kill()函數(shù)原型,并解釋函數(shù)的功能和參數(shù)的含義?

      原型: #include

      功能:

      一個(gè)現(xiàn)有進(jìn)程可以調(diào)用fork函數(shù)創(chuàng)建一個(gè)新進(jìn)程。由fork創(chuàng)建的新進(jìn)程被稱為子進(jìn)程。fork函數(shù)被調(diào)用一次但返回兩次。兩次返回的唯一區(qū)別是子進(jìn)程中返回0值而父進(jìn)程中返回子進(jìn)程ID。原型:#include #include

      int kill(pid_t pid, int sig);

      功能:

      向某個(gè)進(jìn)程傳遞一個(gè)信號(hào)

      7)ps aux|grep process命令功能是什么?并解釋結(jié)果的含義。

      ps命令是最基本進(jìn)程查看命令.使用該命令可以確定有進(jìn)程正在運(yùn)行數(shù)量和運(yùn)行的狀態(tài)、進(jìn)程是否結(jié)束、是否有僵尸進(jìn)程、進(jìn)程占用的資源。grep命令查看某進(jìn)程的狀態(tài)并打印在屏幕上,ps aux是顯示所有進(jìn)程和他們的狀態(tài)。ps aux輸出格式:

      USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND

      三.方案設(shè)計(jì)

      每創(chuàng)建一個(gè)子進(jìn)程時(shí),將其pid存儲(chǔ)在數(shù)組pid[i]中,i存儲(chǔ)在proc_number中,然后調(diào)用死循環(huán)函數(shù)do_something(),輸出該進(jìn)程的proc_number,當(dāng)輸入數(shù)字是主進(jìn)程執(zhí)行kill(pid[pid-48],SIGTERM),殺死ch-48進(jìn)程。當(dāng)輸入q時(shí)循環(huán)退出,kill(0,SIGTERM),殺死本組所有進(jìn)程,程序退出。

      #include pid_t fork(void);

      四.測(cè)試數(shù)據(jù)及運(yùn)行結(jié)果

      注釋:由于我的電腦運(yùn)行這段代碼報(bào)錯(cuò),所以我和我組高宏偉同學(xué)使用的是同一實(shí)驗(yàn)數(shù)據(jù),同一代碼。五.總結(jié)

      1. 實(shí)驗(yàn)過(guò)程中遇到的問(wèn)題及解決辦法;

      實(shí)驗(yàn)中由于代碼中的大部分已經(jīng)給出,只需填寫(xiě)重要部分。遇到了不懂fork的返回值,所以if和else語(yǔ)句會(huì)同時(shí)執(zhí)行,知道了fork的原理后,fork會(huì)返回兩個(gè)值一個(gè)到子進(jìn)程,一個(gè)到父進(jìn)程。2. 對(duì)設(shè)計(jì)及調(diào)試過(guò)程的心得體會(huì)。

      本次實(shí)驗(yàn)學(xué)會(huì)了創(chuàng)建進(jìn)程命令fork和殺死進(jìn)程命令kill。在開(kāi)始的時(shí)候不理解fork 和kill的原理,有點(diǎn)懵。后來(lái)通過(guò)看書(shū)和上網(wǎng)查詢知道了fork和kill的原理后明白了代碼要填寫(xiě)的空白。六.附錄:源代碼(電子版)

      #include #include #include #include #include #include

      #define MAX_CHILD_NUMBER 10 #define SLEEP_INTERVAL 2

      int proc_number=0;void do_something();

      int main(int argc,char* argv[]){ int child_proc_number=MAX_CHILD_NUMBER;int i,ch;pid_t child_pid;

      pid_t pid[10]={0};if(argc>1){

      child_proc_number = atoi(argv[1]);

      child_proc_number =(child_proc_number>10)?10:child_proc_number;

      for(i=0;i

      child_pid=fork();

      proc_number=i;

      if(child_pid==0){do_something();

      }else if(child_pid>0){

      pid[i]=child_pid;

      printf(“A Parent process,the pid is %dn”,getpid());

      }

      }

      printf(“input the number you want to killn”);

      while((ch=getchar())!='q')

      {

      if(isdigit(ch)){

      ch=(int)ch-48;

      if(kill(pid[ch],SIGKILL)<0){

      perror(“kill”);

      exit(1);

      }else{

      printf(“process %d has been killed!nn”,pid[ch]);

      }

      }else{

      printf(“is not digitn”);

      }

      getchar();

      printf(“input the number you want to kill:n”);

      }

      kill(0,SIGTERM);} return 0;}

      void do_something(){ for(;;){

      printf(“This is process No.%*dn”,proc_number+3,proc_number);

      sleep(SLEEP_INTERVAL);} }

      第三篇:操作系統(tǒng) 實(shí)驗(yàn)一 進(jìn)程調(diào)度

      實(shí)驗(yàn)一

      進(jìn)程控制與處理機(jī)調(diào)度綜合實(shí)驗(yàn)

      一、實(shí)驗(yàn)?zāi)康?/p>

      通過(guò)模擬進(jìn)程控制方法及單處理機(jī)系統(tǒng)的進(jìn)程調(diào)度,了解進(jìn)程的結(jié)構(gòu),進(jìn)程的創(chuàng)建與撤消,進(jìn)程的組織及進(jìn)程的狀態(tài)及其轉(zhuǎn)換,掌握進(jìn)程調(diào)度策略。

      二、實(shí)驗(yàn)環(huán)境

      開(kāi)發(fā)工具使用windows平臺(tái)下的vc++6.0。

      三、實(shí)驗(yàn)內(nèi)容

      本實(shí)驗(yàn)為單機(jī)模擬進(jìn)程調(diào)度算法,在程序設(shè)計(jì)時(shí)不需真正地建立線程或者進(jìn)程。實(shí)驗(yàn)?zāi)M創(chuàng)建若干進(jìn)程(人為輸入或隨機(jī)數(shù)產(chǎn)生),選擇一種或幾種單處理機(jī)的進(jìn)程調(diào)度算法,如FCFS(先來(lái)先服務(wù)),SPF(短進(jìn)程優(yōu)先),RR(時(shí)間片輪轉(zhuǎn)法),優(yōu)先級(jí)算法等,模擬進(jìn)行進(jìn)程調(diào)度。每進(jìn)行一次調(diào)度,都打印一次運(yùn)行進(jìn)程、就緒隊(duì)列、以及各個(gè)進(jìn)程的PCB,并能在進(jìn)程完成后及時(shí)撤消該進(jìn)程。

      四、完成情況

      1、進(jìn)程及進(jìn)程的運(yùn)行狀態(tài)

      進(jìn)程是現(xiàn)代計(jì)算機(jī)中的基本要素,是系統(tǒng)分配資源和調(diào)度的基本單位。進(jìn)程與程序不同,進(jìn)程是系統(tǒng)中動(dòng)態(tài)的實(shí)體,有它的創(chuàng)建、運(yùn)行和撤銷的過(guò)程。PCB塊是系統(tǒng)感知進(jìn)程存在的唯一實(shí)體。進(jìn)程的創(chuàng)建必須首先創(chuàng)建進(jìn)程的PCB塊,而進(jìn)程的運(yùn)行也伴隨著PCB塊的變化,進(jìn)城撤銷也要同時(shí)撤銷它的PCB塊。所以本實(shí)驗(yàn)的任務(wù)就是通過(guò)模擬調(diào)度進(jìn)程的PCB塊來(lái)調(diào)度進(jìn)程。進(jìn)程的PCB塊包含以下四方面的內(nèi)容: a)進(jìn)程標(biāo)示符 b)處理及狀態(tài)信息 c)進(jìn)程調(diào)度信息 d)進(jìn)程控制信息

      進(jìn)程在運(yùn)行中存在三種基本狀態(tài),分別是運(yùn)行狀態(tài)、就緒狀態(tài)和阻塞狀態(tài)。

      2、進(jìn)程調(diào)度

      一個(gè)運(yùn)行進(jìn)程的時(shí)間片用完或發(fā)生阻塞時(shí),系統(tǒng)就會(huì)選擇一個(gè)就緒進(jìn)程調(diào)度執(zhí)行。進(jìn)程的調(diào)度算法有很多如FCFS、SPF、優(yōu)先級(jí)調(diào)度和時(shí)間片輪轉(zhuǎn)方法。進(jìn)程調(diào)度算法模擬試驗(yàn)就是通過(guò)調(diào)度進(jìn)程的PCB塊來(lái)模擬調(diào)度進(jìn)程。在系統(tǒng)中PCB塊就表現(xiàn)為一個(gè)結(jié)構(gòu)體,PCB塊之間的連接方式存在兩種,一種是連接方式,一種是索引方式。本試驗(yàn)中可選擇任意一種連接方式。

      3、例程

      設(shè)計(jì)一個(gè)有 N個(gè)進(jìn)程共行的進(jìn)程調(diào)度程序。進(jìn)程調(diào)度算法:采用最高優(yōu)先數(shù)優(yōu)先的調(diào)度算法(即把處理機(jī)分配給優(yōu)先數(shù)最高的進(jìn)程)。

      每個(gè)進(jìn)程有一個(gè)進(jìn)程控制塊(PCB)表示。進(jìn)程控制塊可以包含如下信息:進(jìn)程名、優(yōu)先數(shù)、到達(dá)時(shí)間、需要運(yùn)行時(shí)間、已用CPU時(shí)間、進(jìn)程狀態(tài)等等。進(jìn)程的優(yōu)先數(shù)及需要的運(yùn)行時(shí)間可以事先人為地指定(也可以由隨機(jī)數(shù)產(chǎn)生)。進(jìn)程的到達(dá)時(shí)間為進(jìn)程輸入的時(shí)間。進(jìn)程的運(yùn)行時(shí)間以時(shí)間片為單位進(jìn)行計(jì)算。每個(gè)進(jìn)程的狀態(tài)可以是就緒 W(Wait)、運(yùn)行R(Run)、或完成F(Finish)三種狀態(tài)之一。就緒進(jìn)程獲得 CPU后都只能運(yùn)行一個(gè)時(shí)間片。用已占用CPU時(shí)間加1來(lái)表示。如果運(yùn)行一個(gè)時(shí)間片后,進(jìn)程的已占用 CPU時(shí)間已達(dá)到所需要的運(yùn)行時(shí)間,則撤消該進(jìn)程,如果運(yùn)行一個(gè)時(shí)間片后進(jìn)程的已占用CPU時(shí)間還未達(dá)所需要的運(yùn)行時(shí)間,也就是進(jìn)程還需要繼續(xù)運(yùn)行,此時(shí)應(yīng)將進(jìn)程的優(yōu)先數(shù)減1(即降低一級(jí)),然后把它插入就緒隊(duì)列等待CPU。每進(jìn)行一次調(diào)度程序都打印一次運(yùn)行進(jìn)程、就緒隊(duì)列、以及各個(gè)進(jìn)程的 PCB,以便進(jìn)行檢查。重復(fù)以上過(guò)程,直到所要進(jìn)程都完成為止。

      調(diào)度算法的流程圖如下:

      開(kāi)始初始化進(jìn)程PCB,輸入進(jìn)程信息各進(jìn)程按優(yōu)先數(shù)從高到低排列y就緒隊(duì)列空?結(jié)束就緒隊(duì)列首進(jìn)程投入運(yùn)行時(shí)間片到CPU占用時(shí)間+1運(yùn)行已占用CPU時(shí)間已達(dá)到所需CPU時(shí)間y進(jìn)程完成撤銷該進(jìn)程是運(yùn)行進(jìn)程的優(yōu)先數(shù)減1把運(yùn)行進(jìn)程插入就緒隊(duì)列 圖1-1 流程圖

      源代碼:#include “stdio.h” #include #include #define getpch(type)(type*)malloc(sizeof(type))#define NULL 0 struct pcb { /* 定義進(jìn)程控制塊PCB */ char name[10];char state;int super;int ntime;int rtime;struct pcb* link;}*ready=NULL,*p;typedef struct pcb PCB;void sort()/* 建立對(duì)進(jìn)程進(jìn)行優(yōu)先級(jí)排列函數(shù)*/ { PCB *first, *second;

      int insert=0;if((ready==NULL)||((p->super)>(ready->super)))/*優(yōu)先級(jí)最大者,插入隊(duì)首 */ {

      p->link=ready;ready=p;} else /* 進(jìn)程比較優(yōu)先級(jí),插入適當(dāng)?shù)奈恢弥?/ {

      first=ready;second=first->link;

      while(second!=NULL)

      {

      if((p->super)>(second->super))/*若插入進(jìn)程比當(dāng)前進(jìn)程優(yōu)先數(shù)

      大,*/

      { /*插入到當(dāng)前進(jìn)程前面*/

      p->link=second;

      first->link=p;

      second=NULL;

      insert=1;}

      else /* 插入進(jìn)程優(yōu)先數(shù)最低,則插入到隊(duì)尾*/

      {

      first=first->link;second=second->link;

      }

      }

      if(insert==0)

      first->link=p;} } void input()/* 建立進(jìn)程控制塊函數(shù)*/ { int i,num;printf(“n請(qǐng)輸入進(jìn)程數(shù)量:”);scanf(“%d”,&num);for(i=0;i

      printf(“n 進(jìn)程號(hào)No.%d:n”,i);

      p=getpch(PCB);

      printf(“n 輸入進(jìn)程名:”);

      scanf(“%s”,p->name);

      printf(“n 輸入進(jìn)程優(yōu)先數(shù):”);

      scanf(“%d”,&p->super);

      printf(“n 輸入進(jìn)程運(yùn)行時(shí)間:”);

      scanf(“%d”,&p->ntime);

      printf(“n”);

      p->rtime=0;p->state='w';

      p->link=NULL;

      sort();/* 調(diào)用sort函數(shù)*/ } }

      int space(){ int l=0;PCB* pr=ready;while(pr!=NULL){

      l++;

      pr=pr->link;} return(l);} void show(){ printf(“nqnametstatetsupertndtimetruntimen”);} void disp(PCB * pr)/*建立進(jìn)程顯示函數(shù),用于顯示當(dāng)前進(jìn)程*/ {

      printf(“ %st”,pr->name);printf(“ %ct”,pr->state);printf(“ %dt”,pr->super);printf(“ %dt”,pr->ntime);printf(“ %dt”,pr->rtime);printf(“n”);} void check()/* 建立進(jìn)程查看函數(shù) */ { PCB* pr;printf(“n****當(dāng)前正在運(yùn)行的進(jìn)程是:%s”,p->name);/*顯示當(dāng)前運(yùn)行進(jìn)程*/ show();disp(p);pr=ready;if(pr==NULL)

      printf(“n****當(dāng)前就緒隊(duì)列為空!”);

      else

      {

      printf(“n****當(dāng)前就緒隊(duì)列狀態(tài)為:”);/*顯示就緒隊(duì)列狀態(tài)*/

      show();

      while(pr!=NULL)

      {

      disp(pr);

      pr=pr->link;

      }

      } } void destroy()/*建立進(jìn)程撤消函數(shù)(進(jìn)程運(yùn)行結(jié)束,撤消進(jìn)程)*/ { printf(“n 進(jìn)程[%s]已完成.n”,p->name);free(p);} void running()/* 建立進(jìn)程就緒函數(shù)(進(jìn)程運(yùn)行時(shí)間到,置就緒狀態(tài)*/ {(p->rtime)++;if(p->rtime==p->ntime)destroy();/* 調(diào)用destroy函數(shù)*/ else {

      (p->super)--;

      p->state='w';

      sort();/*調(diào)用sort函數(shù)*/ } } void main()/*主函數(shù)*/ { int len,h=0;char ch;input();len=space();while((len!=0)&&(ready!=NULL)){

      ch=getchar();

      h++;

      printf(“n 當(dāng)前運(yùn)行次數(shù)為:%d n”,h);

      p=ready;

      ready=p->link;

      p->link=NULL;

      p->state='R';

      check();

      running();

      printf(“n 按任一鍵繼續(xù)......”);

      ch=getchar();} printf(“nn 進(jìn)程已經(jīng)完成.n”);ch=getchar();}

      輸入數(shù)據(jù)后運(yùn)行結(jié)果如下圖所示:

      五、問(wèn)題及解決辦法

      問(wèn)題:當(dāng)插入的進(jìn)程優(yōu)先級(jí)大于當(dāng)前進(jìn)程優(yōu)先級(jí)的時(shí)候,插入的進(jìn)程應(yīng)該放在什么

      位置?

      方法:通過(guò)指針的指向變換,把插入的進(jìn)程放置在當(dāng)前進(jìn)程前面。

      六、實(shí)驗(yàn)心得

      通過(guò)本次實(shí)驗(yàn),了解了進(jìn)程的結(jié)構(gòu),進(jìn)程的創(chuàng)建、撤銷,掌握了進(jìn)程調(diào)度策略處理機(jī)調(diào)度的理解,我更加深刻的認(rèn)識(shí)到調(diào)度進(jìn)程的pcb塊來(lái)調(diào)度進(jìn)程的過(guò)程,以及按照優(yōu)先權(quán)進(jìn)行排序的算法實(shí)現(xiàn)。對(duì)操作系統(tǒng)有了進(jìn)一步的認(rèn)識(shí),后面會(huì)更加努力學(xué)習(xí),掌握這門(mén)學(xué)科。

      第四篇:操作系統(tǒng)進(jìn)程調(diào)度算法模擬實(shí)驗(yàn)報(bào)告

      進(jìn)程調(diào)度算法模擬

      專業(yè):XXXXX 學(xué)號(hào):XXXXX 姓名:XXX 實(shí)驗(yàn)日期:20XX年XX月XX日

      一、實(shí)驗(yàn)?zāi)康?/p>

      通過(guò)對(duì)進(jìn)程調(diào)度算法的模擬加深對(duì)進(jìn)程概念和進(jìn)程調(diào)度算法的理解。

      二、實(shí)驗(yàn)要求

      編寫(xiě)程序?qū)崿F(xiàn)對(duì)5個(gè)進(jìn)程的調(diào)度模擬,要求至少采用兩種不同的調(diào)度算法分別進(jìn)行模擬調(diào)度。

      三、實(shí)驗(yàn)方法內(nèi)容

      1.算法設(shè)計(jì)思路

      將每個(gè)進(jìn)程抽象成一個(gè)控制塊PCB,PCB用一個(gè)結(jié)構(gòu)體描述。

      構(gòu)建一個(gè)進(jìn)程調(diào)度類。將進(jìn)程調(diào)度的各種算法分裝在一個(gè)類中。類中存在三個(gè)容器,一個(gè)保存正在或未進(jìn)入就緒隊(duì)列的進(jìn)程,一個(gè)保存就緒的進(jìn)程,另一個(gè)保存已完成的進(jìn)程。還有一個(gè)PCB實(shí)例。主要保存正在運(yùn)行的進(jìn)程。類中其他方法都是圍繞這三個(gè)容器可以這個(gè)運(yùn)行中的PCB展開(kāi)。

      主要用到的技術(shù)是STL中的vector以維護(hù)和保存進(jìn)程容器、就緒容器、完成容器。

      當(dāng)程序啟動(dòng)時(shí),用戶可以選擇不同的調(diào)度算法。然后用戶從控制臺(tái)輸入各個(gè)進(jìn)程的信息,這些信息保存到進(jìn)程容器中。進(jìn)程信息輸入完畢后,就開(kāi)始了進(jìn)程調(diào)度,每調(diào)度一次判斷就緒隊(duì)列是否為空,若為空則系統(tǒng)時(shí)間加一個(gè)時(shí)間片。判斷進(jìn)程容器中是否有新的進(jìn)程可以加入就緒隊(duì)列。2.算法流程圖 主程序的框架:

      開(kāi)始void FCFS();//先來(lái)先服務(wù)void SJF();//最短進(jìn)程優(yōu)先調(diào)度void RR();//簡(jiǎn)單時(shí)間片輪轉(zhuǎn)void PD();//最高優(yōu)先數(shù)優(yōu)先void PCBInput();//輸入進(jìn)程信息選擇調(diào)度算法輸入進(jìn)程信息將輸入容器中以滿足進(jìn)入條件的進(jìn)程調(diào)入就緒隊(duì)列void ProcessQueueProcess();//查看當(dāng)前時(shí)間下,有無(wú)進(jìn)程加入。若有則把該進(jìn)程調(diào)入就緒隊(duì)列按照選擇的算法開(kāi)始選擇就緒隊(duì)列的進(jìn)程開(kāi)始執(zhí)行void ProcessSelect();//若當(dāng)前就緒隊(duì)列不為空則根據(jù)選擇的調(diào)度算法開(kāi)始調(diào)度,否則,系統(tǒng)時(shí)間加一個(gè)時(shí)間片.以等待新的進(jìn)程到判斷就緒容器和輸入容器是否為空!processScheduler.m_WaitQueue.empty()||!processScheduler.m_ProcessQueue.empt()Y打印各進(jìn)程信息進(jìn)行統(tǒng)計(jì)計(jì)算周轉(zhuǎn)時(shí)間等結(jié)束void PCBDisplay();//打印當(dāng)前狀況下。就緒隊(duì)列、完成隊(duì)列、運(yùn)行中的進(jìn)程信息void SchedulerStatistics();//調(diào)度統(tǒng)計(jì),計(jì)算周轉(zhuǎn)時(shí)間等進(jìn)程調(diào)度過(guò)程:

      開(kāi)始為空判斷就緒隊(duì)列是否為空if(m_WaitQueue.empty())非空讓系統(tǒng)等待一個(gè)時(shí)間片TimePast()根據(jù)設(shè)定的調(diào)度算法從就緒隊(duì)列中調(diào)入一個(gè)進(jìn)程并執(zhí)行(此時(shí)進(jìn)程從就緒隊(duì)列中刪除,賦值到表示運(yùn)行中的成員變量中)void FCFS();//先來(lái)先服務(wù)void SJF();//最短進(jìn)程優(yōu)先調(diào)度void RR();//簡(jiǎn)單時(shí)間片輪轉(zhuǎn)void PD();//最高優(yōu)先數(shù)優(yōu)先進(jìn)程運(yùn)行一個(gè)時(shí)間片N是否達(dá)到該進(jìn)程停止運(yùn)行的條件Y選入的進(jìn)程狀態(tài)是否為“完成”如進(jìn)程已完成,或者分得的時(shí)間片個(gè)數(shù)已到ProcessRun()Yvector

      m_WaitQueue;//進(jìn)程就緒隊(duì)列進(jìn)程未完成,將進(jìn)程優(yōu)先數(shù)減一,并放回到就緒隊(duì)列中設(shè)置進(jìn)程完成時(shí)間,將該進(jìn)程放入完成隊(duì)列vector

      m_FinishQueue;//完成隊(duì)列結(jié)束

      3.算法中用到的數(shù)據(jù)結(jié)構(gòu)

      struct fcfs{

      //先來(lái)先服務(wù)算法從這里開(kāi)始

      char name[10];

      float arrivetime;

      float servicetime;

      float starttime;

      float finishtime;

      float zztime;

      float dqzztime;

      };

      //定義一個(gè)結(jié)構(gòu)體,里面包含的有一個(gè)進(jìn)程相關(guān)的信息

      4.主要的常量變量

      vector

      m_ProcessQueue;//進(jìn)程輸入隊(duì)列

      vector

      m_WaitQueue;//進(jìn)程就緒隊(duì)列 vector

      m_FinishQueue;//完成隊(duì)列 vector

      ::iterator m_iter;//迭代器 PCB m_runProcess;//運(yùn)行中的進(jìn)程

      int m_ProcessCount;//進(jìn)程數(shù) float m_RunTime;//運(yùn)行時(shí)間

      int m_tagIsRun;//是否在運(yùn)行標(biāo)志。表示正在運(yùn)行,表示沒(méi)有 float m_TimeSlice;//時(shí)間片大小

      int m_TimeSliceCount;//指時(shí)間片輪轉(zhuǎn)中一次分到的時(shí)間片個(gè)數(shù) char m_SchedulerAlgorithm;//調(diào)度算法

      5.主要模塊

      void PCBInput();//輸入進(jìn)程信息

      void PCBSort();//對(duì)進(jìn)程控制塊按照優(yōu)先級(jí)排序(采用冒泡排序)void ProcessSelect();//若當(dāng)前就緒隊(duì)列不為空則根據(jù)選擇的調(diào)度算法開(kāi)始調(diào)度。否則,系統(tǒng)時(shí)間void PCBDisplay();//打印當(dāng)前狀況下。就緒隊(duì)列、完成隊(duì)列、運(yùn)行中的進(jìn)程信息

      void ProcessRun();//進(jìn)程運(yùn)行一次。運(yùn)行時(shí)間加個(gè)時(shí)間片。并判斷進(jìn)程是否達(dá)到完成條件。若是則void ProcessQueueProcess();//查看當(dāng)前時(shí)間下,有無(wú)進(jìn)程加入。若有則把該進(jìn)程調(diào)入就緒隊(duì)列 void ProcessDispatch();//進(jìn)程分派,進(jìn)程執(zhí)行完成后決定進(jìn)程該進(jìn)入哪個(gè)隊(duì)列(就緒、完成)void TimePast(){ m_RunTime +=m_TimeSlice;ProcessQueueProcess();}//當(dāng)前系統(tǒng)時(shí)間加個(gè)時(shí)間void SchedulerStatistics();//調(diào)度統(tǒng)計(jì),計(jì)算周轉(zhuǎn)時(shí)間等 void FCFS();//先來(lái)先服務(wù) void SJF();//最短進(jìn)程優(yōu)先調(diào)度 void RR();//簡(jiǎn)單時(shí)間片輪轉(zhuǎn) void PD();//最高優(yōu)先數(shù)優(yōu)先 加.以等待新的進(jìn)程到來(lái)

      ProcessStatus='f'.否則為'w';片,并檢查是否有新的進(jìn)程加入

      四、實(shí)驗(yàn)代碼

      #include #include #include

      using namespace std;

      struct fcfs{

      //先來(lái)先服務(wù)算法從這里開(kāi)始

      char name[10];

      float arrivetime;

      float servicetime;

      float starttime;

      float finishtime;

      float zztime;

      float dqzztime;

      };

      //定義一個(gè)結(jié)構(gòu)體,里面包含的有一個(gè)進(jìn)程相關(guān)的信息

      fcfs a[100];

      void input(fcfs *p,int N)

      {

      int i;

      cout<

      printf(“

      請(qǐng)您輸入進(jìn)程的名字

      到達(dá)時(shí)間

      服務(wù)時(shí)間:(例如: a 0 100)nn”);

      for(i=0;i<=N-1;i++)

      {

      printf(“

      請(qǐng)您輸入進(jìn)程%d的信息:t”,i+1);

      scanf(“ttt%s%f%f”,&p[i].name,&p[i].arrivetime,&p[i].servicetime);

      }

      }

      void Print(fcfs *p,float arrivetime,float servicetime,float starttime,float finishtime,float zztime,float dqzztime,int N)

      { int k;

      printf(“nn調(diào)用先來(lái)先服務(wù)算法以后進(jìn)程運(yùn)行的順序是: ”);

      printf(“%s”,p[0].name);

      for(k=1;k

      {

      printf(“-->%s”,p[k].name);

      }

      cout<

      printf(“n

      具體進(jìn)程調(diào)度信息:n”);

      printf(“t進(jìn)程名

      到達(dá)時(shí)間

      服務(wù)時(shí)間

      開(kāi)始時(shí)間

      結(jié)束時(shí)間

      周轉(zhuǎn)時(shí)間

      帶權(quán)周轉(zhuǎn)時(shí)間n”);

      for(k=0;k<=N-1;k++)

      {

      printf(“t%st%-.2ft %-.2ft

      %-.2ft

      %-.2ft %-.2ft %-.2fn”,p[k].name,p[k].arrivetime,p[k].servicetime,p[k].starttime,p[k].finishtime,p[k].zztime,p[k].dqzztime);

      }

      getchar();

      //此處必須要有這個(gè)函數(shù),否則就看不到顯示器上面的輸出,可以看到的結(jié)果只是一閃而過(guò)的一個(gè)框剪

      }

      void sort(fcfs *p,int N)//排序

      {

      for(int i=0;i<=N-1;i++)

      for(int j=0;j<=i;j++)

      if(p[i].arrivetime

      {

      fcfs temp;

      temp=p[i];

      p[i]=p[j];

      p[j]=temp;

      }

      }

      void deal(fcfs *p, float arrivetime,float servicetime,float starttime,float finishtime,float &zztime,float &dqzztime,int N)

      //運(yùn)行階段

      { int k;

      for(k=0;k<=N-1;k++)

      {

      if(k==0)

      {

      p[k].starttime=p[k].arrivetime;

      p[k].finishtime=p[k].arrivetime+p[k].servicetime;}

      else

      {

      p[k].starttime=p[k-1].finishtime;

      p[k].finishtime=p[k-1].finishtime+p[k].servicetime;}

      }

      for(k=0;k<=N-1;k++)

      {

      p[k].zztime=p[k].finishtime-p[k].arrivetime;

      p[k].dqzztime=p[k].zztime/p[k].servicetime;

      }

      }

      void FCFS(fcfs *p,int N)

      {

      float arrivetime=0,servicetime=0,starttime=0,finishtime=0,zztime=0,dqzztime=0;

      sort(p,N);

      deal(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,N);

      Print(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,N);

      getchar();

      } //先來(lái)先服務(wù)算法到此結(jié)束 struct sjf{//最短進(jìn)程優(yōu)先調(diào)度算法從這里開(kāi)始

      char name[10];float arrivetime;//到達(dá)時(shí)間

      float servicetime;//運(yùn)行時(shí)間

      float starttime;

      //開(kāi)始時(shí)間

      float finishtime;

      //完成時(shí)間

      };sjf a1[100];

      void input(sjf *p,int N1)//進(jìn)程信息輸入 {

      int i;cout<

      printf(“

      請(qǐng)您輸入進(jìn)程的名字

      到達(dá)時(shí)間

      服務(wù)時(shí)間:(例如: a 0 100)n”);

      for(i=0;i<=N1-1;i++){

      printf(“

      請(qǐng)您輸入進(jìn)程%d的信息:t”,i+1);

      scanf(“ttt%s%f%f”,&p[i].name,&p[i].arrivetime,&p[i].servicetime);} }

      void Print(sjf *p,float arrivetime,float servicetime,float starttime,float finishtime,int N1)//最終結(jié)果輸出

      {

      int k;

      printf(“nt調(diào)用最短進(jìn)程優(yōu)先調(diào)度算法以后進(jìn)程的調(diào)度順序?yàn)?”);

      printf(“%s”,p[0].name);

      for(k=1;k

      {printf(“-->%s”,p[k].name);}

      cout<

      printf(“n給個(gè)進(jìn)程具體調(diào)度信息如下:n”);

      printf(“nt進(jìn)程名t到達(dá)時(shí)間t運(yùn)行時(shí)間t開(kāi)始時(shí)間t完成時(shí)間n”);

      for(k=0;k<=N1-1;k++)

      {

      printf(“ t%st %-.2ftt %-.2ftt %-.2ftt %-.2ftn”,p[k].name,p[k].arrivetime,p[k].servicetime,p[k].starttime,p[k].finishtime);

      }

      getchar();

      } void sort(sjf *p,int N1)//排序 {

      for(int i=0;i<=N1-1;i++)

      for(int j=0;j<=i;j++)

      if(p[i].arrivetime

      {

      sjf temp;

      temp=p[i];

      p[i]=p[j];

      p[j]=temp;

      } } void deal(sjf *p, float arrivetime,float servicetime,float starttime,float finishtime,int N1)//運(yùn)行階段

      { int k;

      for(k=0;k<=N1-1;k++)

      {

      if(k==0)

      {

      p[k].starttime=p[k].arrivetime;

      p[k].finishtime=p[k].arrivetime+float(p[k].servicetime)/60;}

      else

      {

      p[k].starttime=p[k-1].finishtime;

      p[k].finishtime=p[k-1].finishtime+float(p[k].servicetime)/60;}

      }

      }

      void sjff(sjf *p,int N1){

      float arrivetime=0,servicetime=0,starttime=0,finishtime=0;

      sort(p,N1);

      for(int m=0;m

      {if(m==0)

      p[m].finishtime=p[m].arrivetime+float(p[m].servicetime)/60;

      else

      p[m].finishtime=p[m-1].finishtime+float(p[m].servicetime)/60;

      int i=0;

      for(int n=m+1;n<=N1-1;n++)

      {

      if(p[n].arrivetime<=p[m].finishtime)

      i++;

      }

      float min=p[m+1].servicetime;

      int next=m+1;

      for(int k=m+1;k

      {

      if(p[k+1].servicetime

      {min=p[k+1].servicetime;

      next=k+1;}

      }

      sjf temp;

      temp=p[m+1];

      p[m+1]=p[next];

      p[next]=temp;

      }

      deal(p,arrivetime,servicetime,starttime,finishtime,N1);

      Print(p,arrivetime,servicetime,starttime,finishtime,N1);

      getchar();}//最短進(jìn)程優(yōu)先調(diào)度算法到這里結(jié)束

      char menu()//用來(lái)輸出相關(guān)信息的函數(shù)

      {

      char cse1;

      while(1)

      {

      system(“cls”);

      fflush(stdin);

      cout<

      cout<

      cout<<“t”<<“|| <<<<<<<<<<<<歡<<<<<<<<<<< >>>>>>>>>>>>迎>>>>>>>>>>> ||”<

      cout<<“t”<<“||

      ||”<

      cout<<“t”<<“||”<<“t 進(jìn)程調(diào)度算法模擬”<<“tt”<<“||”<

      cout<<“t”<<“||

      ||”<

      cout<<“t”<<“||”<<“tt 1.先來(lái)先服務(wù)調(diào)度算法 ”<<“tt”<<“||”<

      cout<<“t”<<“||

      ||”<

      cout<<“t”<<“||”<<“tt 2.最短進(jìn)程優(yōu)先調(diào)度算法”<<“tt”<<“||”<

      cout<<“t”<<“||

      ||”<

      cout<<“t”<<“|| <<<<<<<<<<<<<<<<<<<<<<<<<您>>>>>>>>>>>>>>>>>>>>>>>>> ||”<

      cout<

      cout<

      cout<<“tt

      請(qǐng)輸入您的選擇(1/2):”;

      cse1=getchar();

      if(cse1<'1'||cse1>'2')

      cout<<“你的輸入有錯(cuò)!”<

      else

      break;

      }

      return cse1;} int main(int argc, char *argv[]){

      while(1)

      {

      switch(menu())

      {

      case '1':

      int N;

      cout<

      cout<

      printf(“tt<<---!!@@@先來(lái)先服務(wù)調(diào)度算法@@@!!--->>n”);

      cout<

      printf(“輸入進(jìn)程數(shù)目:”);

      scanf(“%d”,&N);

      input(a,N);

      FCFS(a,N);

      case '2':

      int N1;

      cout<

      cout<

      printf(“tt<<---!!@@@最短進(jìn)程優(yōu)先調(diào)度算法@@@!!--->>n”);

      cout<

      printf(“輸入進(jìn)程數(shù)目: ”);

      scanf(“%d”,&N1);

      input(a1,N1);

      sjf *b=a1;

      sjf *c=a1;

      sjff(b,N1);

      getchar();

      }

      }

      system(“PAUSE”);

      return EXIT_SUCCESS;}

      五、實(shí)驗(yàn)結(jié)果

      1.執(zhí)行結(jié)果

      2.結(jié)果分析

      先來(lái)先服務(wù)調(diào)度算法就是根據(jù)進(jìn)程達(dá)到的時(shí)間為依據(jù),哪一個(gè)進(jìn)程先來(lái)那么該進(jìn)程就會(huì)先執(zhí)行;最短進(jìn)程優(yōu)先調(diào)度算法則是以每個(gè)進(jìn)程執(zhí)行所需時(shí)間長(zhǎng)短為依據(jù),某一個(gè)進(jìn)程執(zhí)行所需花的時(shí)間要短些那么該進(jìn)程就先執(zhí)行。以上就是本次進(jìn)程調(diào)度實(shí)驗(yàn)的依據(jù)。

      六、實(shí)驗(yàn)總結(jié)

      通過(guò)本次實(shí)驗(yàn)了解到算法很重要,又更加明白算法本身可以節(jié)約時(shí)間,而且不同的函數(shù)之間在調(diào)用的時(shí)候要注意很多的問(wèn)題。

      第五篇:操作系統(tǒng) 單處理機(jī)系統(tǒng)的進(jìn)程調(diào)度

      一.實(shí)驗(yàn)內(nèi)容描述

      1.目的

      (1)了解Windows內(nèi)存管理器(2)理解Windows的地址過(guò)程 2.內(nèi)容

      任意給出一個(gè)虛擬地址,通過(guò)WinDbg觀察相關(guān)數(shù)據(jù)并找到其物理地址

      二.理論分析

      Windows采用頁(yè)式虛擬存儲(chǔ)管理技術(shù)管理內(nèi)存,頁(yè)面是硬件級(jí)別上的最小保護(hù)單位 1.Windows內(nèi)存管理器

      Windows的內(nèi)存管理主要由Windows執(zhí)行體中的虛存管理程序負(fù)責(zé),并由環(huán)境子系統(tǒng)負(fù)責(zé),并由環(huán)境子系統(tǒng)負(fù)責(zé)與具體API相關(guān)的一些用戶態(tài)特性的實(shí)現(xiàn)。虛存管理程序是Windows中負(fù)責(zé)內(nèi)存管理的那些子程序和數(shù)據(jù)結(jié)構(gòu)的集合 內(nèi)存管理器的主要任務(wù)是:

      地址變換:將一個(gè)進(jìn)程的虛擬地址空間轉(zhuǎn)譯為物理內(nèi)存地址

      交換:當(dāng)內(nèi)存不足時(shí),將內(nèi)存中的有些內(nèi)容轉(zhuǎn)移到磁盤(pán)上,并且以后還要再次將這些內(nèi)容讀回

      2.Windows內(nèi)存管理策略

      Windows采用頁(yè)式虛擬存儲(chǔ)管理技術(shù)管理內(nèi)存,頁(yè)面是硬件級(jí)別上最小的保護(hù)單位。根據(jù)硬件的體系結(jié)構(gòu)不同,頁(yè)面尺寸被分為兩種,大頁(yè)面和小頁(yè)面。X86系統(tǒng)下小頁(yè)面為4KB,大頁(yè)面為4MB。大頁(yè)面的優(yōu)點(diǎn)是:當(dāng)引用同一頁(yè)面內(nèi)其他數(shù)據(jù)時(shí),地址轉(zhuǎn)移的速度會(huì)很快。不過(guò)使用大頁(yè)面通常要較大的內(nèi)存空間,而且必須用一個(gè)單獨(dú)的保護(hù)項(xiàng)來(lái)映射,因此可能會(huì)造成出現(xiàn)錯(cuò)誤而不引發(fā)內(nèi)存訪問(wèn)違例的情況。通常PC機(jī)都為小頁(yè)面 3.Windows虛擬地址空間布局 x86結(jié)構(gòu)下的布局方式:

      默認(rèn)情況下,32位Windows系統(tǒng)中每個(gè)用戶進(jìn)程可以占有2GB的私有地址空間。操作系統(tǒng)占有另外的2GB 2GB用戶的進(jìn)程地址空間布局如表:

      2GB的系統(tǒng)地址空間布局如同:

      3.虛擬地址轉(zhuǎn)譯

      地址轉(zhuǎn)譯是指將進(jìn)程的虛擬地址空間映射到實(shí)際物理頁(yè)面的過(guò)程。x86系統(tǒng)中地址轉(zhuǎn)譯過(guò)程如圖:

      關(guān)鍵數(shù)據(jù)結(jié)構(gòu)如下: 頁(yè)目錄:每個(gè)進(jìn)程都有一個(gè)頁(yè)目錄,它是內(nèi)存管理器為了映射進(jìn)程中所有的頁(yè)表位置而創(chuàng)建的一個(gè)頁(yè)面。進(jìn)程也目錄的地址被保存在內(nèi)核進(jìn)程快KPROCESS中,在x86系統(tǒng)上,它被映射到虛擬地址0xC0300000,當(dāng)一個(gè)進(jìn)程正在執(zhí)行時(shí),CPU可以通過(guò)寄存器CR3知道該進(jìn)程頁(yè)目錄的位置。頁(yè)目錄由目錄項(xiàng)(PDE)構(gòu)成,每個(gè)PDE長(zhǎng)4字節(jié),描述了該進(jìn)程中所有可能的頁(yè)表的狀態(tài)和位置。其格式和PTE類似。x86系統(tǒng)上,要描述完整的4GB虛擬地址空間,需要1024個(gè)頁(yè)表。因此映射這些頁(yè)表的進(jìn)程頁(yè)目錄需包含1024個(gè)PDE,恰好占用一個(gè)頁(yè)面。

      頁(yè)表:進(jìn)程的頁(yè)目錄項(xiàng)指向頁(yè)表。每個(gè)頁(yè)表占用一個(gè)頁(yè)面,由1024項(xiàng)PTE組成。一個(gè)有效的PTE大小為4字節(jié),包含兩個(gè)主域:數(shù)據(jù)所在的物理頁(yè)面的頁(yè)面幀編號(hào)(PNF)或者內(nèi)存中一個(gè)頁(yè)面的物理地址的PFN;一些描述該頁(yè)面狀態(tài)和保護(hù)屬性的標(biāo)志。

      虛擬地質(zhì)結(jié)構(gòu):x86系統(tǒng)上,一個(gè)32位虛擬地址被解釋為三個(gè)單獨(dú)的部分,頁(yè)目錄索引、頁(yè)表索引和字節(jié)索引。由于頁(yè)目錄項(xiàng)有1024個(gè),因此頁(yè)目錄索引為10位;一個(gè)也表中含有1024個(gè)PTE。因此頁(yè)表索引也為10位,字節(jié)索引為12位,正好表示一頁(yè)(4KB)內(nèi)容

      三.實(shí)驗(yàn)步驟及結(jié)果

      1.查找頁(yè)目錄首地址

      以程序WG.exe作為觀測(cè)對(duì)象。

      啟動(dòng)WinDbg到內(nèi)核調(diào)試模式,運(yùn)行程序WG.exe。終斷目標(biāo)機(jī)運(yùn)行,輸入命令:kd>!process

      發(fā)現(xiàn)WG.exe進(jìn)程正處于運(yùn)行狀態(tài) 輸入命令:

      在KPROCESS中名為DirectoryTableBase的域,對(duì)應(yīng)值為0x9fa6000,即WG.exe進(jìn)程頁(yè)目錄的物理地址 查看CR3寄存其中的內(nèi)容,輸入命令:

      CR3寄存其中的值和KPROCESS中記錄的頁(yè)目錄基址相同。這是因?yàn)樵贑PU切換執(zhí)行任務(wù)時(shí),其內(nèi)容要更新為當(dāng)前進(jìn)程的頁(yè)目錄基址。2.地址轉(zhuǎn)譯過(guò)程

      假設(shè)給定的虛擬地址為0x401001 輸入命令:

      可以看到:

      PDE的虛擬地址為C0300004.PTE的虛擬地址為C0001004 最后一行信息“pfn 9e4a---DA--UWEV”表示PDE中的具體內(nèi)容,9e4a是給定虛擬地址所在頁(yè)表在內(nèi)存中對(duì)應(yīng)的物理頁(yè)號(hào),“---DA—UWEV”是標(biāo)志信息,“pfn a173----A--UREV”表示PTE中的具體內(nèi)容,a173是數(shù)據(jù)頁(yè)裝入內(nèi)存的物理頁(yè)號(hào)。

      將數(shù)據(jù)頁(yè)對(duì)應(yīng)的物理頁(yè)號(hào)a173加上業(yè)內(nèi)索引(0x1)即可得到虛擬地址0x401001的物理地址

      3.觀察系統(tǒng)頁(yè)表

      給定觀測(cè)虛擬地址為0x80001001 輸入命令:

      當(dāng)前正在執(zhí)行的進(jìn)程是:WG.exe 輸入命令:

      得到PDE為C0300800,其對(duì)應(yīng)的物理頁(yè)號(hào)為3b 繼續(xù)讓目標(biāo)機(jī)運(yùn)行,啟動(dòng)A.exe,然后中斷目標(biāo)機(jī)運(yùn)行。輸入命令:

      當(dāng)前正在執(zhí)行的進(jìn)程為A.exe 輸入命令:

      PDE信息和對(duì)應(yīng)的物理頁(yè)號(hào)與前面觀測(cè)到的相同

      四.結(jié)論

      1.數(shù)據(jù)頁(yè)對(duì)應(yīng)的物理頁(yè)號(hào)加上相應(yīng)業(yè)內(nèi)索引即可得到虛擬地址的物理地址 2.不同的進(jìn)程頁(yè)目錄都指向了相同的系統(tǒng)表頁(yè)

      五.心得體會(huì)

      在這次上機(jī)實(shí)驗(yàn),通過(guò)對(duì)WinDbg和VPc的調(diào)試運(yùn)用,我熟悉了Windows內(nèi)存管理器的結(jié)構(gòu),也認(rèn)知到Windows如何進(jìn)行地址轉(zhuǎn)譯和轉(zhuǎn)換。對(duì)相關(guān)的知識(shí)也進(jìn)行了溫習(xí),更牢的掌握了相關(guān)知識(shí)。當(dāng)然這些還遠(yuǎn)遠(yuǎn)不夠,我以后還要繼續(xù)不斷努力,去學(xué)習(xí)了解掌握操作系統(tǒng)的各方面知識(shí)。

      附錄:

      1.A.exe代碼

      #include #include

      #define N 1

      HANDLE mutexSemaphore;HANDLE synchSemaphore_1;HANDLE synchSemaphore_2;

      HANDLE mutexDisplay;

      void Display(char*str,int delayTime){ if(WaitForSingleObject(mutexDisplay,INFINITE)==WAIT_OBJECT_0){ printf(“%snn”,str);ReleaseMutex(mutexDisplay);Sleep(delayTime);} }

      void useTime(double limit){ for(double i=0;i<=limit;i+=0.001);}

      void CreateProduct(){ Display(“Creating a production...”,0);useTime(200000);Display(“Creating finished.”,100);}

      void PutProduct(){ Display(“Putting a production...”,0);useTime(150000);Display(“Putting finished”,100);}

      void GetProduct(){ Display(“Getting a production...”,0);useTime(100000);Display(“Getting finished.”,100);}

      void ConsumeProduct(){ Display(“Cosuming a production...”,0);useTime(100000);Display(“Cosuming finished.”,100);}

      void Producer(){ while(true){ CreateProduct();

      if(WaitForSingleObject(synchSemaphore_1,INFINITE)==WAIT_OBJECT_0){

      if(WaitForSingleObject(mutexSemaphore,INFINITE)==WAIT_OBJECT_0){ PutProduct();ReleaseSemaphore(mutexSemaphore,1,NULL);} ReleaseSemaphore(synchSemaphore_2,1,NULL);} } }

      void Consumer(){ while(true){

      if(WaitForSingleObject(synchSemaphore_2,INFINITE)==WAIT_OBJECT_0){

      if(WaitForSingleObject(mutexSemaphore,INFINITE)==WAIT_OBJECT_0){ GetProduct();ReleaseSemaphore(mutexSemaphore,1,NULL);} ReleaseSemaphore(synchSemaphore_1,1,NULL);} ConsumeProduct();} }

      int main(){ HANDLE thread[2];DWORD threadID[2];

      synchSemaphore_1=CreateSemaphore(NULL,N,N,NULL);synchSemaphore_2=CreateSemaphore(NULL,0,N,NULL);mutexSemaphore=CreateSemaphore(NULL,1,1,NULL);

      mutexDisplay=CreateMutex(NULL,FALSE,NULL);

      printf(“Program start.Please use WinDbg to observe main thread.nPress any key to continue...n”);getchar();

      thread[0]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(Producer),NULL,CREATE_SUSPENDED,&threadID[0]);printf(“A producer was created.Please use WinDbg to observe producer thread.nPress any key to continue...n”);getchar();

      thread[1]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(Consumer),NULL,CREATE_SUSPENDED,&threadID[1]);printf(“A Consumer was created.Please use WinDbg to observe Consumer thread.nPress any key to continue...n”);getchar();

      printf(“Please select:n[1]Make producer thread runn[2]Make Consumer thread runn”);bool flag=true;bool flag_1=true,flag_2=true;int count=0;while(flag){ if(getchar()=='1'&&flag_1){ ResumeThread(thread[0]);count++;flag_1=false;} else if(getchar()=='2'&&flag_2){ ResumeThread(thread[1]);count++;flag_2=false;} if(count==2)flag=false;} WaitForMultipleObjects(1,thread,TRUE,INFINITE);

      return 0;}

      2.WG.exe代碼: #include

      int main(){ int a=0;printf(“I'm Wangn”);while(true){a++;} }

      下載1.操作系統(tǒng)實(shí)驗(yàn)內(nèi)容(進(jìn)程調(diào)度)5篇word格式文檔
      下載1.操作系統(tǒng)實(shí)驗(yàn)內(nèi)容(進(jìn)程調(diào)度)5篇.doc
      將本文檔下載到自己電腦,方便修改和收藏,請(qǐng)勿使用迅雷等下載。
      點(diǎn)此處下載文檔

      文檔為doc格式


      聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn)自行上傳,本網(wǎng)站不擁有所有權(quán),未作人工編輯處理,也不承擔(dān)相關(guān)法律責(zé)任。如果您發(fā)現(xiàn)有涉嫌版權(quán)的內(nèi)容,歡迎發(fā)送郵件至:645879355@qq.com 進(jìn)行舉報(bào),并提供相關(guān)證據(jù),工作人員會(huì)在5個(gè)工作日內(nèi)聯(lián)系你,一經(jīng)查實(shí),本站將立刻刪除涉嫌侵權(quán)內(nèi)容。

      相關(guān)范文推薦

        進(jìn)程調(diào)度[★]

        操作系統(tǒng)課程設(shè)計(jì) 進(jìn) 程 調(diào) 度 實(shí) 踐 報(bào) 告姓名: 董宇超 班級(jí):計(jì)算機(jī)一班 學(xué)號(hào):0906010124 目錄: ? 實(shí)踐內(nèi)容 ? 實(shí)踐目的及意義 ? 功能設(shè)計(jì)及數(shù)據(jù)結(jié)構(gòu) ? 調(diào)試運(yùn)行及測(cè)設(shè)分析 ? 存在的......

        操作系統(tǒng)實(shí)驗(yàn)

        操作系統(tǒng)實(shí)驗(yàn) 實(shí)驗(yàn)一Linux常用命令實(shí)驗(yàn) 一.目的和要求 本實(shí)驗(yàn)的目的是熟悉Linux操作系統(tǒng)的命令接口、圖形接口和程序接口;了解Linux操作系統(tǒng)的啟動(dòng)過(guò)程;了解Linux操作系統(tǒng)的目......

        進(jìn)程調(diào)度實(shí)驗(yàn)報(bào)告

        天津大學(xué)仁愛(ài)學(xué)院 實(shí)驗(yàn)類型:實(shí)驗(yàn)名稱:實(shí)驗(yàn)地點(diǎn): 學(xué)生姓名:班 級(jí):操作系統(tǒng) 實(shí)驗(yàn)報(bào)告 必 修 實(shí)驗(yàn)日期:2014年4月18日進(jìn)程調(diào)度 二實(shí)驗(yàn)樓504 李帥帥 指導(dǎo)教師:張 磊 計(jì)科一班 計(jì)算機(jī)科......

        操作系統(tǒng)實(shí)驗(yàn)二——cpu調(diào)度與內(nèi)存分頁(yè)

        一、 試驗(yàn)?zāi)康?理解操作系統(tǒng)內(nèi)存管理的原理及分頁(yè)內(nèi)存管理方案 二、 試驗(yàn)要求 1、實(shí)現(xiàn)分頁(yè)內(nèi)存管理方案,假定頁(yè)和幀的大小均為4KB,物理內(nèi)存為128MB 2、輸入為進(jìn)程ID,所需內(nèi)存......

        操作系統(tǒng)實(shí)驗(yàn)總結(jié)

        操作系統(tǒng)實(shí)驗(yàn)總結(jié)學(xué)號(hào): 姓名: 班級(jí):在本學(xué)期的計(jì)算機(jī)操作系統(tǒng)這門(mén)課學(xué)習(xí)當(dāng)中,為了更好的了解操作系統(tǒng)相關(guān)知識(shí),我們通過(guò)OS Lab平臺(tái)做了幾個(gè)實(shí)驗(yàn)。在實(shí)驗(yàn)室的過(guò)程中,我對(duì)課堂上學(xué)到......

        《操作系統(tǒng)》實(shí)驗(yàn)指導(dǎo)書(shū)

        《操作系統(tǒng)》實(shí)驗(yàn)指導(dǎo)書(shū) (適用于計(jì)科、網(wǎng)絡(luò)工程、軟件工程、信計(jì)專業(yè)) 計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院 2010-5 目錄 前言 ................................................................

        操作系統(tǒng)實(shí)驗(yàn)體會(huì)

        操作系統(tǒng)實(shí)驗(yàn)體會(huì) 操作系統(tǒng) 2010-04-04 14:38:15 閱讀814 評(píng)論0 字號(hào):大中小 訂閱 每一次課程設(shè)計(jì)度讓我學(xué)到了在平時(shí)課堂不可能學(xué)到的東西。所以我對(duì)每一次課程設(shè)計(jì)的機(jī)會(huì)......

        操作系統(tǒng)實(shí)驗(yàn)六

        void * my_malloc(unsigned int size){ // int i; // Linker *p=first; // for(i=size;inext; // if(i>HEAP_SIZE)//空?間?不?足á? //return NULL; // if(i==HEAP_SIZE){ /......