精品一区二区中文在线,无遮挡h肉动漫在线观看,国产99视频精品免视看9,成全免费高清大全

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

時(shí)間:2025-01-20 10:20:24 林惜 工作報(bào)告 我要投稿

操作系統(tǒng)實(shí)驗(yàn)報(bào)告(通用5篇)

  在生活中,大家逐漸認(rèn)識(shí)到報(bào)告的重要性,我們?cè)趯?xiě)報(bào)告的時(shí)候要注意語(yǔ)言要準(zhǔn)確、簡(jiǎn)潔。其實(shí)寫(xiě)報(bào)告并沒(méi)有想象中那么難,以下是小編精心整理的操作系統(tǒng)實(shí)驗(yàn)報(bào)告,僅供參考,希望能夠幫助到大家。

  操作系統(tǒng)實(shí)驗(yàn)報(bào)告 1

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

  用高級(jí)語(yǔ)言編寫(xiě)和調(diào)試一個(gè)進(jìn)程調(diào)度程序,以加深對(duì)進(jìn)程的概念及進(jìn)程調(diào)度算法的理解。

  二、實(shí)驗(yàn)內(nèi)容和要求

  編寫(xiě)并調(diào)試一個(gè)模擬的進(jìn)程調(diào)度程序,采用“簡(jiǎn)單時(shí)間片輪轉(zhuǎn)法”調(diào)度算法對(duì)五個(gè)進(jìn)程進(jìn)行調(diào)度。

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

  進(jìn)程的到達(dá)時(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)兩種狀態(tài)之一。

  就緒進(jìn)程獲得 CPU后都只能運(yùn)行一個(gè)時(shí)間片。用運(yùn)行時(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)分配時(shí)間片給就緒隊(duì)列中排在該進(jìn)程之后的進(jìn)程,并將它插入就緒隊(duì)列隊(duì)尾。 每進(jìn)行一次調(diào)度程序都打印一次運(yùn)行進(jìn)程、就緒隊(duì)列、以及各個(gè)進(jìn)程的 PCB,以便進(jìn)行檢查。

  重復(fù)以上過(guò)程,直到所要進(jìn)程都完成為止。

  三、實(shí)驗(yàn)主要儀器設(shè)備和材料

  硬件環(huán)境:IBM-PC或兼容機(jī)

  軟件環(huán)境:C語(yǔ)言編程環(huán)境

  四、實(shí)驗(yàn)原理及設(shè)計(jì)方案

  1、進(jìn)程調(diào)度算法:采用多級(jí)反饋隊(duì)列調(diào)度算法。其基本思想是:當(dāng)一個(gè)新進(jìn)程進(jìn)入內(nèi)在后,首先將它放入第一個(gè)隊(duì)列的末尾,按FCFS原則排隊(duì)等待高度。當(dāng)輪到該進(jìn)程執(zhí)行時(shí),如能在該時(shí)間片內(nèi)完成,便可準(zhǔn)備撤離系統(tǒng);如果它在一個(gè)時(shí)間片結(jié)束時(shí)尚為完成,調(diào)度程序便將該進(jìn)程轉(zhuǎn)入第二隊(duì)列的`末尾,再同樣地按FCFS原則等待調(diào)度執(zhí)行,以此類(lèi)推。

  2、實(shí)驗(yàn)步驟:

  (1)按先來(lái)先服務(wù)算法將進(jìn)程排成就緒隊(duì)列。

  (2)檢查所有隊(duì)列是否為空,若空則退出,否則將隊(duì)首進(jìn)程調(diào)入執(zhí)行。

  (3)檢查該運(yùn)行進(jìn)程是否運(yùn)行完畢,若運(yùn)行完畢,則撤消進(jìn)程,否則,將該進(jìn)程插入到下一個(gè)邏輯隊(duì)列的隊(duì)尾。

  (4)是否再插入新的進(jìn)程,若是則把它放到第一邏輯隊(duì)列的列尾。

  (5)重復(fù)步驟(2)、(3)、(4),直到就緒隊(duì)列為空。

  五、流程圖

  六、結(jié)果過(guò)程及截圖 初始化隊(duì)列

  按Y鍵繼續(xù)運(yùn)行進(jìn)程:

  按Y鍵繼續(xù)運(yùn)行進(jìn)程:

  運(yùn)行若干次后的狀態(tài):

  添加新的進(jìn)程:

  七、所遇困難的解決以及心得體會(huì)

  在這個(gè)多級(jí)反饋的實(shí)驗(yàn)中,我采取了用一條實(shí)際上的鏈表隊(duì)列來(lái)模擬多個(gè)邏輯上的隊(duì)列,通過(guò)維護(hù)幾個(gè)鏈表的狀態(tài)信息來(lái)找到每個(gè)進(jìn)程運(yùn)行完后應(yīng)該插入的地方,還有一個(gè)標(biāo)志位Fend用來(lái)表明新插入的隊(duì)列的位置。雖然實(shí)驗(yàn)原理很簡(jiǎn)單,但是在編寫(xiě)代碼的過(guò)程中遇到了不少的問(wèn)題,在兩個(gè)小時(shí)之內(nèi)已經(jīng)完成的大體代碼的編寫(xiě),但是之中存在不少的問(wèn)題,導(dǎo)致了用了差不多四個(gè)小時(shí)的時(shí)間去調(diào)試才把它弄好,這主要?dú)w咎于在開(kāi)始設(shè)計(jì)代碼的不太合理,在后期使得代碼結(jié)構(gòu)有些混亂,使得調(diào)試更加的麻煩,以及對(duì)編程的不熟悉。通過(guò)這個(gè)實(shí)驗(yàn)不僅使我對(duì)進(jìn)程的調(diào)度算法有了更深的認(rèn)識(shí),使得理論知識(shí)得到的實(shí)踐,也使我的編程能力得到了進(jìn)一步提高。

  七、思考題

  分析不同調(diào)度算法的調(diào)度策略,比較不同調(diào)度算法的優(yōu)缺點(diǎn),總結(jié)它們的適用范圍。

  答:動(dòng)態(tài)有限權(quán)算法:動(dòng)態(tài)優(yōu)先權(quán)是指在創(chuàng)建進(jìn)程時(shí)所創(chuàng)建的優(yōu)先權(quán),會(huì)隨進(jìn)程的推進(jìn)或者等待時(shí)間的增加而改變,以便獲得更好的調(diào)度性能。處理機(jī)為每個(gè)進(jìn)程分配一定的時(shí)間片,在就緒隊(duì)列中,優(yōu)先權(quán)高的進(jìn)程將優(yōu)先獲得處理機(jī),進(jìn)程在進(jìn)去運(yùn)行完響應(yīng)的時(shí)間片后,如沒(méi)完成,優(yōu)先權(quán)減1,從新回到就緒隊(duì)列等待分配處理機(jī)。

  時(shí)間片的輪轉(zhuǎn)法:系統(tǒng)將所有進(jìn)程排成一個(gè)隊(duì)列,按照先來(lái)先服務(wù)的原則,對(duì)隊(duì)列首的進(jìn)程進(jìn)行處理,每個(gè)進(jìn)程在用完自己的時(shí)間片后,從新回到隊(duì)尾進(jìn)行排隊(duì)。每運(yùn)行一次,進(jìn)程的需要時(shí)間減1,直到就緒隊(duì)列為空!

  八、源代碼

  #include #include

  #include

  #define getpch(type) (type*)malloc(sizeof(type)) #define NULL 0

  #define TIME 2//時(shí)間片長(zhǎng)度

  typedef struct pcb{//進(jìn)程管理塊 char name[10];//進(jìn)程名字 char state; //進(jìn)程狀態(tài)

  int queue; int ntime; int rtime; int etime;

  //進(jìn)程所在的隊(duì)列

  //進(jìn)程需要運(yùn)行的時(shí)間

  //進(jìn)程已經(jīng)運(yùn)行的時(shí)間

  //進(jìn)程在本隊(duì)列可運(yùn)行的時(shí)間片

  struct pcb *link;

  }PCB;

  PCB *ready = NULL, *p = NULL, *pfend = NULL,*p =NULL; 位置的變量

  int geti() //使用戶僅能輸入整數(shù) {

  char ch; int i = 0; fflush(stdin); ch = get); while(ch == ){

  //就緒隊(duì)列,進(jìn)程插入

  printf(

  fflush(stdin); ch = get); }

  while(ch != ){

  if(ch > 9 || ch

  fflush(stdin); i = 0; ch = get);

  }else{ i = i*10 + (ch - 0); }

  ch = get);

  }

  return i;

  }

  void findpos()//更新?tīng)顟B(tài)量 {

  PCB *ps = pfend;

  if(!ps || !ps -> link || (ps-> link->queue - ps->queue) > 1) p = ps; else{ while (ps->link && ps ->link->queue != (pfend ->queue +2)) }

  ps = ps->link; p = ps;

  }

  void ()//插入進(jìn)程 {

  if(!ready ){

  ready = p;

  pfend = p; p = p;

  }else if(ready ->queue == 1){//第一隊(duì)列存在

  p->link = pfend->link; pfend->link = p; pfend = p; findpos();

  }

  void input()/*建立進(jìn)程控制塊函數(shù)*/ {

  int i,num;

  printf(

  for(i=0; i

  p=getpch(PCB);

  printf(

  printf(

  p->queue =1;

  p->etime = TIME; p->link=NULL;

  ();/*調(diào)用函數(shù)*/ } else{ p->link = ready; ready = p; }

  findpos();

  }

  void disp(PCB *pr)/*建立進(jìn)程現(xiàn)實(shí)函數(shù),用于顯示當(dāng)前進(jìn)程*/ {

  printf(

  }

  void check()/*建立進(jìn)程查看函數(shù)*/

  {

  }

  void sort()//調(diào)整進(jìn)程隊(duì)列

  {

  } if(!ready->link ||ready->queue link->queue) return; p = ready ->link; ready ->link = p ->link; p ->link = ready; p = ready; ready = p; if (ready && ready -> queue == p ->queue){ findpos(); } PCB *pr; printf(

  void addnew()//添加新的進(jìn)程

  {

  if(ready ->queue != 1){ (ready -> queue)++; ready->etime *= 2; ready -> state=w; sort();/*調(diào)用sort函數(shù)*/ input(); } else{ input();

  }

  }

  void destroy()/*建立進(jìn)程撤銷(xiāo)函數(shù)(進(jìn)程運(yùn)行結(jié)束,撤銷(xiāo)進(jìn)程)*/

  {

  }

  void running()/*建立進(jìn)程就緒函數(shù)(進(jìn)程運(yùn)行時(shí)間到,置就緒狀態(tài))*/

  {

  }

  void main()

  {

  char ch; input(); while(ready != NULL) { printf(

  }

  ready ->state = R; check(); running(); printf(

  操作系統(tǒng)實(shí)驗(yàn)報(bào)告 2

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

  本實(shí)驗(yàn)要求學(xué)生模擬作業(yè)調(diào)度的實(shí)現(xiàn),用高級(jí)語(yǔ)言編寫(xiě)和調(diào)試一個(gè)或多個(gè)作業(yè)調(diào)度的模擬程序,了解作業(yè)調(diào)度在操作系統(tǒng)中的作用,以加深對(duì)作業(yè)調(diào)度算法的理解。

  二、實(shí)驗(yàn)內(nèi)容和要求

  1、編寫(xiě)并調(diào)度一個(gè)多道程序系統(tǒng)的作業(yè)調(diào)度模擬程序。

  作業(yè)調(diào)度算法:采用基于先來(lái)先服務(wù)的調(diào)度算法。可以參考課本中的方法進(jìn)行設(shè)計(jì)。 對(duì)于多道程序系統(tǒng),要假定系統(tǒng)中具有的各種資源及數(shù)量、調(diào)度作業(yè)時(shí)必須考慮到每個(gè)作業(yè)的資源要求。

  三、實(shí)驗(yàn)主要儀器設(shè)備和材料

  硬件環(huán)境:IBM-PC或兼容機(jī)

  軟件環(huán)境:C語(yǔ)言編程環(huán)境

  四、實(shí)驗(yàn)原理及設(shè)計(jì)方案

  采用多道程序設(shè)計(jì)方法的操作系統(tǒng),在系統(tǒng)中要經(jīng)常保留多個(gè)運(yùn)行的作業(yè),以提高系統(tǒng)效率。作業(yè)調(diào)度從系統(tǒng)已接納的暫存在輸入井中的一批作業(yè)中挑選出若干個(gè)可運(yùn)行的作業(yè),并為這些被選中的作業(yè)分配所需的系統(tǒng)資源。對(duì)被選中運(yùn)行的作業(yè)必須按照它們各自的作業(yè)說(shuō)明書(shū)規(guī)定的步驟進(jìn)行控制。

  采用先來(lái)先服務(wù)算法算法模擬設(shè)計(jì)作業(yè)調(diào)度程序。

  (1)作業(yè)調(diào)度程序負(fù)責(zé)從輸入井選擇若干個(gè)作業(yè)進(jìn)入主存,為它們分配必要的資源,當(dāng)它們能夠被進(jìn)程調(diào)度選中時(shí),就可占用處理器運(yùn)行。作業(yè)調(diào)度選擇一個(gè)作業(yè)的必要條件是系統(tǒng)中現(xiàn)有的尚未分配的資源可滿足該作業(yè)的資源要求。但有時(shí)系統(tǒng)中現(xiàn)有的尚未分配的資源既可滿足某個(gè)作業(yè)的要求也可滿足其它一些作業(yè)的要求,那么,作業(yè)調(diào)度必須按一定的算法在這些作業(yè)中作出選擇。先來(lái)先服務(wù)算法是按照作業(yè)進(jìn)入輸入井的先后次序來(lái)挑選作業(yè),先進(jìn)入輸入井的作業(yè)優(yōu)先被挑選,當(dāng)系統(tǒng)中現(xiàn)有的尚未分配的資源不能滿足先進(jìn)入輸入井的.作業(yè)時(shí),那么順序挑選后面的作業(yè)。

  (2) 假定某系統(tǒng)可供用戶使用的主存空間共100k,并有5臺(tái)磁帶機(jī)。

  (3)流程圖:

  五、結(jié)果過(guò)程及截圖

  讀取文件jobs.txt來(lái)初始化主存,磁帶機(jī)的個(gè)數(shù),并打印出來(lái)。

  初始時(shí)間是9:00:

  按Y運(yùn)行5分鐘:

  按Y運(yùn)行5分鐘:

  按Y運(yùn)行5分鐘:

  多次運(yùn)行后最后狀態(tài):

  六、所遇困難的解決以及心得體會(huì)

  這個(gè)實(shí)驗(yàn)是花的時(shí)間最多的一個(gè)實(shí)驗(yàn),第一次做的時(shí)候由于理解有些問(wèn)題,所以做錯(cuò)了。之后重新做了一遍,收獲還是很多的,遇到了很多的細(xì)節(jié)問(wèn)題,例如像是時(shí)間化成浮點(diǎn)數(shù)和浮點(diǎn)數(shù)化成時(shí)間等一些問(wèn)題,從中也暴露了自己的編程能力欠缺,之后要多多的寫(xiě)程序。

  七、思考題

  1、 寫(xiě)出每種算法的調(diào)度策略,最后比較各種算法的優(yōu)缺點(diǎn)。

  答:先來(lái)先服務(wù)算法是根據(jù)作業(yè)的進(jìn)入時(shí)間來(lái)排序,到達(dá)時(shí)間短的先運(yùn)行,優(yōu)點(diǎn)是實(shí)現(xiàn)簡(jiǎn)單,缺點(diǎn)是運(yùn)行時(shí)間慢。

  短作業(yè)優(yōu)先算法是根椐作業(yè)的估計(jì)運(yùn)行時(shí)間來(lái)排序,估計(jì)運(yùn)行時(shí)間短的先運(yùn)行,優(yōu)點(diǎn)是運(yùn)行時(shí)間快,缺點(diǎn)是實(shí)現(xiàn)起來(lái)比較復(fù)雜。

  2、 選擇調(diào)度算法的依據(jù)是什么?

  答:如果作業(yè)要求的速度不高,而且作業(yè)比較小型,那就最好用先來(lái)先服務(wù)算法。

  如果作業(yè)要求的速度高,作業(yè)流程復(fù)雜,那就最好用短作業(yè)優(yōu)先算法。

  八、源代碼

  #include

  #include

  #include

  #include

  #define getjcb() (JCB*)malloc(sizeof(JCB))

  typedef struct {//資源的總量

  int memory; int tape;

  }RESOURCE;

  typedef struct JCB {//作業(yè)控制塊

  char username[20];//用戶名

  char jobname[10];//作業(yè)名

  char state;//作業(yè)狀態(tài) char atime[5];//到達(dá)時(shí)間 float rtime;//運(yùn)行時(shí)間 RESOURCE resource;//資源數(shù)量 struct JCB*link; }JCB;

  RESOURCE source = {100,5};

  JCB *pjcb =getjcb();//作業(yè)鏈表頭

  char nowtime[5];//現(xiàn)在時(shí)間,初始時(shí)間為9:00

  FILE* ignore(FILE *fp)//忽略文件中的空白符

  {

  if(feof(fp)) return fp; char ch = fgetc(fp); while (!feof(fp) && (ch == || ch == )){ ch = fgetc(fp); } //if(!feof(fp)) return fp; fseek(fp, -1, SEEK_CUR);

  return fp;

  }

  FILE* findFILE *fp,char c)//在文件中找到一個(gè)字符的位置(讀取文件時(shí)用) {

  if(feof(fp)) return fp; char ch = fgetc(fp); while (!feof(fp) && (ch != c)){ } ch = fgetc(fp); fseek(fp, -1, SEEK_CUR); return fp;

  }

  void destory()//釋放鏈表所占的內(nèi)存

  {

  JCB *p = pjcb->link; while(pjcb){ free(pjcb); pjcb = p; if(p) p = p->link;

  }

  }

  float stof(char *time)//把時(shí)間轉(zhuǎn)化為浮點(diǎn)型數(shù)

  {

  float h = 0, m = 0; int i = 0; while(time[i] != :){ h = h*10 + time[i] - 0; } i++; while(time[i] != ){ m = m*10 + time[i] - 0; } i++; i++;

  return (h + m/60);

  }

  char* ftos(double ftime)//把浮點(diǎn)型數(shù)值轉(zhuǎn)化為時(shí)間

  {

  }

  float timesub(char *time1, char *time2)//兩個(gè)時(shí)間相減,得到時(shí)間差

  {

  }

  void print()//打印輸出

  {

  JCB *p = pjcb->link; printf(

  p->atime, p->rtime, p->resource.memory,p->resource.tape);

  }

  void sendsource()//為作業(yè)分配資源

  {

  JCB *p; p = pjcb->link; while(p){//為到達(dá)的作業(yè)調(diào)度 p = p->link; }

  if(p->state == W && source.memory - p->resource.memory >=0 && source.tape - p->resource.tape >=0){

  } } p = p->link; p->state = R; source.memory -= p->resource.memory; source.tape -= p->resource.tape; printf(

  }

  void init()//初始化,讀取文件中的作業(yè)信息

  {

  FILE *fp; JCB *p= NULL,*q = pjcb ; if((fp = fopen(

  } } fp = ignore(fp); p->rtime = 0;//不初始化則會(huì)發(fā)生錯(cuò)誤,? fscanf(fp,

  int checkend() //檢查是否所有的作業(yè)都已經(jīng)運(yùn)行完了

  {

  JCB *p = pjcb ->link; while(p){ if(p ->state != F){ return 0; } p = p->link; } return 1;

  }

  void run()//運(yùn)行作業(yè)

  {

  if(checkend()){//檢查是否所有的作業(yè)都已經(jīng)運(yùn)行完了 printf(

  }

  } p = p->link; } p = pjcb ->link; while(p){//計(jì)算到達(dá)的作業(yè) if( strcmp(nowtime, p->atime) ==0 && p->state == N){ p->state = W; printf(

  int main()

  {

  char ch;

  double time =9.00;

  }

  double step = float(5)/60+0.00001; ftos(9.0); init(); do{ run(); puts(

  操作系統(tǒng)實(shí)驗(yàn)報(bào)告 3

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

  模擬文件系統(tǒng)實(shí)現(xiàn)的基本功能,了解文件系統(tǒng)的基本結(jié)構(gòu)和文件的各種管理方法,加深理解文件系統(tǒng)的內(nèi)部功能及內(nèi)部實(shí)現(xiàn)。通過(guò)用高級(jí)語(yǔ)言編寫(xiě)和調(diào)試一個(gè)簡(jiǎn)單的文件系統(tǒng),模擬文件管理的工作過(guò)程,從而對(duì)各種文件操作命令的.實(shí)質(zhì)內(nèi)容和執(zhí)行過(guò)程有比較深入的了解。

  二、實(shí)驗(yàn)內(nèi)容和要求

  編程模擬一個(gè)簡(jiǎn)單的文件系統(tǒng),實(shí)現(xiàn)文件系統(tǒng)的管理和控制功能。要求本文件系統(tǒng)采用兩級(jí)目錄,即設(shè)置主文件目錄[MFD]和用戶文件目錄[UED]。另外,為打開(kāi)文件設(shè)置運(yùn)行文件目錄[AFD]。設(shè)計(jì)一個(gè)10個(gè)用戶的文件系統(tǒng),每次用戶可保存10個(gè)文件,一次運(yùn)行用戶可以打開(kāi)5個(gè)文件,并對(duì)文件必須設(shè)置保護(hù)措施。在用戶程序中通過(guò)使用文件系統(tǒng)提供的Create、open、read、write、close、等文件命令,對(duì)文件進(jìn)行操作

  三、實(shí)驗(yàn)主要儀器設(shè)備和材料

  硬件環(huán)境:IBM-PC或兼容機(jī)

  軟件環(huán)境:C語(yǔ)言編程環(huán)境

  四、實(shí)驗(yàn)原理及設(shè)計(jì)方案

  1、實(shí)驗(yàn)原理

  運(yùn)用二級(jí)目錄思想來(lái)模擬文件系統(tǒng)。

  為每個(gè)用戶建立一個(gè)單獨(dú)的用戶文件目錄UFD。這些文件目錄具有相似的結(jié)構(gòu),它由用戶文件的文件塊組成。此外,在系統(tǒng)再建立一個(gè)主文件目錄MFD;在主文件目錄中,每個(gè)用戶目錄都占有一個(gè)目錄項(xiàng),其目錄項(xiàng)中包含文件名和指向該文件目錄文件的指針。

  3、程序流程圖

  五、結(jié)果過(guò)程及截圖

  系統(tǒng)的使用簡(jiǎn)要說(shuō)明:

  登陸:

  create命令新建文件

  file5

  Create失敗

  命令刪除文件

  Delete失敗:

  open打開(kāi)命令,及write命令來(lái)追加文件

  Read命令和close命令關(guān)閉

  對(duì)沒(méi)打開(kāi)的文件讀寫(xiě):

  六、所遇困難的解決以及心得體會(huì)

  本實(shí)驗(yàn)的代碼長(zhǎng)度的最常的,但是原理很簡(jiǎn)單,并且實(shí)驗(yàn)要求的是模擬,所以大大降低了實(shí)驗(yàn)的難度,在操作系統(tǒng)課中我們還有一個(gè)課程設(shè)計(jì),也是文件管理系統(tǒng),但是要比這個(gè)難很多,通過(guò)這個(gè)實(shí)驗(yàn),我對(duì)文件管理系統(tǒng)的運(yùn)行機(jī)制有了深入的了解,因?yàn)橐龊眠@個(gè)實(shí)驗(yàn)必須要懂得文件管理系統(tǒng)的架構(gòu),這也迫使我認(rèn)認(rèn)真真的研究了操作系統(tǒng)中關(guān)于文件管理這一章的內(nèi)容。同時(shí)這個(gè)程序也為以后的課程設(shè)計(jì)奠定了基礎(chǔ),并且很多的代碼也是可以重用的。

  七、思考題

  1、文件系統(tǒng)要解決哪些問(wèn)題?

  答:要解決文件和用戶是否同名,文件創(chuàng)建數(shù)是否超額,所要求文件是否存在等問(wèn)題。

  2、什么是文件目錄?什么是文件目錄中包含哪些信息?目前廣泛采用的目錄結(jié)構(gòu)形式是哪種?

  答:文件目錄就是用來(lái)展示一個(gè)用戶的所有文件的一個(gè)表格,文件目錄應(yīng)包含文件名,保密碼,文件大小,目前廣泛采用的目錄結(jié)構(gòu)形式是多級(jí)目錄形式。

  八、源代碼

  #include

  #include

  #include

  #include

  #define NULL 0

  typedef struct mdf{//MDF結(jié)構(gòu)體

  char username[20];//用戶名 char filename[20];//文件名

  struct mdf *next;

  }MDF;

  typedef struct ufd{//UFD結(jié)構(gòu)體

  char filename[20];//文件名

  int protect;//文件保護(hù)碼 unsigned int length;//文件長(zhǎng)度

  struct ufd *next;

  }UFD;

  typedef struct afd{//AFD結(jié)構(gòu)體

  char filename[20];//文件名 int protect;//文件保護(hù)碼 unsigned int point;//文件讀寫(xiě)指針

  struct afd *next;

  }AFD;

  MDF *pmdf;//全局鏈表頭指針

  UFD *pufd;

  AFD *pafd;

  char UserUFD[20];//已經(jīng)登陸成功的用戶名

  void initM DF()//初始化MDF表

  {

  FILE *fp; pmdf= (MDF*)malloc(sizeof(MDF)); MDF *p = pmdf; if((fp = fopen(

  } exit(1); } while (!feof(fp)){//把MDF文件中的內(nèi)容裝入鏈表 } p->next = (MDF*)malloc(sizeof(MDF)); p = p->next; fscanf(fp,

  void printUFD()//打印MDF表 {

  UFD *p = pufd->next; puts(

  }

  void initUFD(char *name)//初始化UFD表 {

  FILE *fp; pufd= (UFD*)malloc(sizeof(UFD)); UFD *p = pufd; if((fp = fopen(name,

  } p->next = NULL; fclose(fp);

  int checkuser()//檢測(cè)登陸的用戶名 {

  } char username[20]; while(1){ puts(

  void initAFD()//初始化AFD {

  pafd = (AFD*)malloc(sizeof(AFD)); pafd->next = NULL; }

  bool create()//創(chuàng)建文件命令 {

  char filename[20]; UFD *p = pufd->next; AFD *pa = pafd; puts(

  } } if(!p->next) break; p= p->next; p->next = (UFD*)malloc(sizeof(UFD)); p=p->next; strcpy(p->filename, filename); p->protect = 2; p->length = 0; p->next = NULL; while(pa->next){//創(chuàng)建文件后加入到AFD } pa=pa->next; pa->next = (AFD*)malloc(sizeof(AFD)); pa = pa->next; strcpy(pa->filename ,filename); pa->protect = 2; pa->point = 0; pa->next = NULL; return 1;

  }

  bool _()//刪除文件命令 {

  char filename[20]; puts(

  puts(

  return 0;

  }

  bool open()//打開(kāi)文件命令

  {

  char filename[20]; unsigned int protect; puts(

  } } puts(

  void close()//關(guān)閉文件命令

  {

  char filename[20]; UFD *pu = pufd->next; puts(

  int read()//讀文件命令

  {

  char filename[20]; unsigned int length; AFD *p = pafd->next;

  } puts(

  int write()//寫(xiě)文件命令

  {

  }

  char filename[20]; unsigned int length; AFD *p = pafd->next; puts(

  void destroy()//釋放內(nèi)存

  {

  }

  void saveUFD()//保存UFD文件

  {

  }

  void bye()//推出系統(tǒng)

  { FILE *fp; UFD *p = pufd->next; if((fp = fopen(UserUFD,

  UFD *pu = pufd->next; while(pa){ if(pa->protect == 2){ while(pu){ } saveUFD(); printUFD(); destroy(); } } if(strcmp(pa->filename, pu->filename) == 0){ } pu->length = pa->point; break; pu = pu->next; pa =pa->next;

  }

  void operate()//命令識(shí)別

  {

  while(1){ char command[20]; char name[][8] = {

  }

  } return; }else puts(

  void print()

  {

  puts(

  int main()

  {

  }

  print(); initM DF(); checkuser(); initAFD(); operate();)//命令識(shí)別 return 0;

  操作系統(tǒng)實(shí)驗(yàn)報(bào)告 4

  1.實(shí)習(xí)目的

  (一).通過(guò)綜合實(shí)訓(xùn)進(jìn)一步鞏固、深化和擴(kuò)展學(xué)生的專業(yè)技能。

  1.熟練掌握Linux操作系統(tǒng)的安裝及基本配置。

  2.熟練掌握Linux系統(tǒng)管理。

  3.掌握Linux下用戶和組的管理。

  4.掌握Linux下FTP服務(wù)器的管理。

  (二)訓(xùn)練和培養(yǎng)學(xué)生獲取信息和處理信息的能力,充分培養(yǎng)和提高學(xué)生的動(dòng)手能力,學(xué)會(huì)通過(guò)網(wǎng)站、書(shū)籍等方式收集所需的資料。

  (三)培養(yǎng)學(xué)生運(yùn)用所學(xué)的知識(shí)和技能解決Linux使用、管理過(guò)程中所遇到的實(shí)際問(wèn)題的能力及其基本工作素質(zhì)。

  (四)培養(yǎng)學(xué)生理論聯(lián)系實(shí)際的工作作風(fēng)、嚴(yán)肅認(rèn)真的科學(xué)態(tài)度以及獨(dú)立工作的能力,樹(shù)立自信心。

  (五)訓(xùn)練和培養(yǎng)學(xué)上的團(tuán)隊(duì)協(xié)作精神與合作能力。

  2 實(shí)習(xí)概況

  2.1 實(shí)習(xí)要求

  具體來(lái)講,《linux操作系統(tǒng)》課程包括以下實(shí)習(xí)內(nèi)容:

  (一)獨(dú)立完成實(shí)訓(xùn)。

  (二)要求熟練掌握Linux操作系統(tǒng)的安裝與基本配置。

  (三)熟練掌握Linux系統(tǒng)管理基本方法。

  (四)掌握Linux下用戶和組的管理。

  (五)掌握Linux下的FTP服務(wù)器的管理。

  2.2 實(shí)習(xí)時(shí)間

  20XX年12月16日至20XX年12月20日

  2.3 實(shí)習(xí)基本情況

  實(shí)習(xí)地點(diǎn):四教學(xué)樓 4112、4212、4312、4412

  實(shí)習(xí)環(huán)境 :RedHat9軟件

  實(shí)習(xí)內(nèi)容:掌握l(shuí)inux操作系統(tǒng)

  2.4 硬件環(huán)境

  3 實(shí)習(xí)內(nèi)容

  3.1 linux安裝 Linux是一類(lèi)Unix計(jì)算機(jī)操作系統(tǒng)的統(tǒng)稱。Linux 是以Unix 操作系統(tǒng)為原型的多任務(wù)、多用戶的`系統(tǒng)。可運(yùn)行于多種硬件平臺(tái):PC、Alpha、SPARC、

  POWER PC。 今天實(shí)習(xí)的主要內(nèi)容是學(xué)習(xí)了解Linux的安裝過(guò)程;Linux登錄和退出 ,熟悉Linux操作系統(tǒng)的圖形界面

  (一)Linux的安裝過(guò)程

  1)VMware軟件的安裝

  因?yàn)槲矣玫氖菣C(jī)房的電腦,所以不用安裝VMware軟件。如果要安裝,過(guò)程十分簡(jiǎn)單,下載完畢,直接“Next”即可完成安裝。

  2)虛擬機(jī)的安裝。打開(kāi)VMware軟件,單擊“新建虛擬機(jī)”命令根據(jù)提示選擇一種要安裝的操作系統(tǒng),一般選擇典型設(shè)置,然后直接按“下一步”即可。需要注意的就是在分區(qū)的時(shí)候需按要求建立合適的分區(qū),如下圖所示。

  圖3-1-1 選擇分區(qū)

  3)Red Hat Linux 9.0安裝

  首先單擊“編輯虛擬機(jī)設(shè)置”,改寫(xiě)鏡像為“l(fā)inux9cd1”,然后返回初始界面。點(diǎn)擊“啟動(dòng)該虛擬機(jī)”,便進(jìn)入到軟件的安裝過(guò)程。開(kāi)始是“歡迎使Red Hat Linux”界面,然后經(jīng)歷語(yǔ)言選擇、鍵盤(pán)配置、鼠標(biāo)配置、磁盤(pán)分區(qū)設(shè)置、選擇軟件包組、安裝軟件包等操作后,然后是虛擬機(jī)安裝完第一張盤(pán)后要進(jìn)行第二張盤(pán)的安裝,如圖3-2經(jīng)過(guò)老師的指點(diǎn),按住“Ctrl+Alt”,將鼠標(biāo)調(diào)出,雙擊右下方任務(wù)欄第一個(gè)按鈕,依次選擇第二、三鏡像,繼續(xù)安裝,便安裝成功了。

  操作系統(tǒng)實(shí)驗(yàn)報(bào)告 5

  一、課程設(shè)計(jì)任務(wù)劃分

  二、基本原理

  (一)頁(yè)面置換算法定義

  在地址映射過(guò)程中,若在頁(yè)面中發(fā)現(xiàn)所要訪問(wèn)的頁(yè)面不再內(nèi)存中,則產(chǎn)生缺頁(yè)中斷。當(dāng)發(fā)生缺頁(yè)中斷時(shí)操作系統(tǒng)必須在內(nèi)存選擇一個(gè)頁(yè)面將其移出內(nèi) 存,以便為即將調(diào)入的頁(yè)面讓出空間。而用來(lái)選擇淘汰哪一頁(yè)的規(guī)則叫做頁(yè)面置換算法。

  (二)所使用的算法

  1) 最佳置換算法(OPT):將以后永不使用的或許是在最長(zhǎng)(未來(lái))時(shí)間內(nèi) 不再被訪問(wèn)的頁(yè)面換出。

  2) 先進(jìn)先出算法(FIFO):淘汰最先進(jìn)入內(nèi)存的頁(yè)面,即 選擇在內(nèi)存中駐留時(shí)間最久的頁(yè)面予以淘汰。

  3) 最近最久未使用算法(LRU):淘汰最近最久未被使用 的頁(yè)面。

  (三)設(shè)計(jì)思想

  選擇置換算法,先輸入所有頁(yè)面號(hào),為系統(tǒng)分配物理塊,依次進(jìn)行置換:

  OPT基本思想:

  是用一維數(shù)組page[pSIZE]存儲(chǔ)頁(yè)面號(hào)序列,memery[mSIZE]是存儲(chǔ)裝入物理塊中的頁(yè)面。數(shù)組next[mSIZE]記錄物理塊中對(duì)應(yīng)頁(yè)面的最后訪問(wèn)時(shí)間。每當(dāng)發(fā)生缺頁(yè)時(shí),就從物理塊中找出最后訪問(wèn)時(shí)間最大的頁(yè)面,調(diào)出該頁(yè),換入所缺的頁(yè)面。

  FIFO基本思想:

  是用隊(duì)列存儲(chǔ)內(nèi)存中的頁(yè)面,隊(duì)列的特點(diǎn)是先進(jìn)先出,與該算法是一致的,所以每當(dāng)發(fā)生缺頁(yè)時(shí),就從隊(duì)頭刪除一頁(yè),而從隊(duì)尾加入缺頁(yè)。或者借助輔助數(shù)組time[mSIZE]記錄物理塊中對(duì)應(yīng)頁(yè)面的進(jìn)入時(shí)間,每次需要置換時(shí)換出進(jìn)入時(shí)間最小的頁(yè)面。

  LRU基本思想:

  是用一維數(shù)組page[pSIZE]存儲(chǔ)頁(yè)面號(hào)序列,memery[mSIZE]是存儲(chǔ)裝入物理塊中的頁(yè)面。數(shù)組flag[10]標(biāo)記頁(yè)面的訪問(wèn)時(shí)間。每當(dāng)使用頁(yè)面時(shí),刷新訪問(wèn)時(shí)間。發(fā)生缺頁(yè)時(shí),就從物理塊中頁(yè)面標(biāo)記最小的一頁(yè),調(diào)出該頁(yè),換入所缺的頁(yè)面。

  三、基本思路

  實(shí)驗(yàn)環(huán)境:vc++,編程語(yǔ)言:c語(yǔ)言 #include #include /*全局變量*/

  int mSIZE; /*物理塊數(shù)*/

  int pSIZE; /*頁(yè)面號(hào)引用串個(gè)數(shù)*/

  static int memery[10]={0}; /*物理塊中的頁(yè)號(hào)*/ static int page[100]={0}; /*頁(yè)面號(hào)引用串*/ static int temp[100][10]={0}; /*輔助數(shù)組*/ /*置換算法函數(shù)*/ void FIFO(); void LRU(); void OPT(); /*輔助函數(shù)*/

  void print(unsigned int t); void designBy(); void download();

  void mDelay(unsigned int Delay); /*主函數(shù)*/ void main() {

  int i,k,code; system("color 0A"); designBy(); printf("┃請(qǐng)按任意鍵進(jìn)行初始化操作... ┃ "); printf("┗━━━━━━━━━━━━━━━━━━━━━┛ "); printf(" >>>"); getch(); system("cls"); system("color 0B"); printf("請(qǐng)輸入物理塊的個(gè)數(shù)(M<=10):"); scanf("%d",&mSIZE); printf("請(qǐng)輸入頁(yè)面號(hào)引用串的個(gè)數(shù)(P<=100):"); scanf("%d",&pSIZE); puts("請(qǐng)依次輸入頁(yè)面號(hào)引用串(連續(xù)輸入,無(wú)需隔開(kāi)):"); for(i=0;i

  scanf("%1d",&page[i]); download(); system("cls"); system("color 0E"); do{ puts("輸入的頁(yè)面號(hào)引用串為:"); for(k=0;k<=(pSIZE-1)/20;k++)

  { for(i=20*k;(i

  (i==pSIZE-1))) printf("%d ",page[i]); else printf("%d ",page[i]); } } printf("* * * * * * * * * * * * * * * * * * * * * * *"); printf("* 請(qǐng)選擇頁(yè)面置換算法: *"); printf("* ----------------------------------------- *");

  printf("* 1.先進(jìn)先出(FIFO) 2.最近最久未使用(LRU) *"); printf("* 3.最佳(OPT) 4.退出 *"); printf("* * * * * * * * * * * * * * * * * * * * * * *"); printf("請(qǐng)選擇操作:[ ]"); scanf("%d",&code); switch(code) {

  case 1:

  FIFO(); break; case 2:

  LRU(); break; case 3:

  OPT(); break; case 4: system("cls"); system("color 0A"); designBy(); /*顯示設(shè)計(jì)者信息后退出*/ printf("┃謝謝使用頁(yè)面置換算法演示器!

  ┃ "); printf("┗━━━━━━━━━━━━━━━━━━┛ "); exit(0); default: printf("輸入錯(cuò)誤,請(qǐng)重新輸入:"); } printf("按任意鍵重新選擇置換算法:>>>"); getch();

  system("cls"); }while (code!=4); getch(); }

  /*載入數(shù)據(jù)*/ void download() { int i; system("color 0D"); printf("╔════════════╗ "); printf("║正在載入數(shù)據(jù),請(qǐng)稍候 !!!║ "); printf("╚════════════╝ "); printf("Loading... "); printf(" for(i=0;i<51;i++) printf(""); for(i=0;i<50;i++) { mDelay((pSIZE+mSIZE)/2); printf(">"); } printf(" Finish. 載入成功,按任意鍵進(jìn)入置換算法選擇界面:

  >>>"); getch(); }

  /*設(shè)置延遲*/

  void mDelay(unsigned int Delay) {

  unsigned int i;

  for(;Delay>0;Delay--) { for(i=0;i<124;i++) { printf(" "); } } }

  /*顯示設(shè)計(jì)者信息*/ void designBy() { printf("┏━━━━━━━━━━━━━━━━━━━━┓ "); printf("┃ 頁(yè)面置換算法 ┃ "); printf("┃ 12級(jí)1班 ┃ ");

  O");

  printf("┃ 姓名:張海洋,李奔 ┃ "); printf("┣━━━━━━━━━━━━━━━━━━━━┫ "); }

  void print(unsigned int t) { int i,j,k,l; int flag; for(k=0;k<=(pSIZE-1)/20;k++) { for(i=20*k;(i=j) printf(" |%d|",temp[i][j]); else printf(" | |"); } for(i=mSIZE+20*k;(i

  printf("置換次數(shù):%d ",t); printf("訪問(wèn)命中率:%d%% ",(pSIZE-(t+mSIZE))*100/pSIZE); printf("---------------------------------------- "); }

  /*計(jì)算過(guò)程延遲*/ void compute() { int i; printf("正在進(jìn)行相關(guān)計(jì)算,請(qǐng)稍候"); for(i=1;i<20;i++) { mDelay(15); if(i%4==0) printf(" "); else printf("Θ"); } for(i=0;i++<30;printf("")); for(i=0;i++<30;printf(" ")); for(i=0;i++<30;printf("")); }

  /*先進(jìn)先出頁(yè)面置換算法*/ void FIFO() {

  int memery[10]={0};

  int time[10]={0}; /*記錄進(jìn)入物理塊的時(shí)間*/ int i,j,k,m;

  int max=0; /*記錄換出頁(yè)*/ int count=0; /*記錄置換次數(shù)*/ /*前mSIZE個(gè)數(shù)直接放入*/ for(i=0;i

  memery[i]=page[i]; time[i]=i;

  for(j=0;j

  for(i=mSIZE;i

  if(memery[j]!=page[i]) k++;

  }

  if(k==mSIZE) /*如果不在物理塊中*/ {

  count++; /*計(jì)算換出頁(yè)*/

  max=time[0]

  time[max]=i; /*記錄該頁(yè)進(jìn)入物理塊的時(shí)間*/ for(j=0;j

  for(j=0;j

  /*最近最久未使用置換算法*/ void LRU() {

  int memery[10]={0};

  int flag[10]={0}; /*記錄頁(yè)面的訪問(wèn)時(shí)間*/ int i,j,k,m;

  int max=0; /*記錄換出頁(yè)*/ int count=0; /*記錄置換次數(shù)*/ /*前mSIZE個(gè)數(shù)直接放入*/ for(i=0;i

  memery[i]=page[i]; flag[i]=i;

  for(j=0;j

  for(i=mSIZE;i

  if(memery[j]!=page[i]) k++; else flag[j]=i; /*刷新該頁(yè)的訪問(wèn)時(shí)間*/ }

  if(k==mSIZE) /*如果不在物理塊中*/ {

  count++; /*計(jì)算換出頁(yè)*/

  max=flag[0]

  flag[max]=i; /*記錄該頁(yè)的訪問(wèn)時(shí)間*/ for(j=0;j

  for(j=0;j

  /*最佳置換算法*/ void OPT() {

  int memery[10]={0};

  int next[10]={0}; /*記錄下一次訪問(wèn)時(shí)間*/ int i,j,k,l,m;

  int max; /*記錄換出頁(yè)*/

  int count=0; /*記錄置換次數(shù)*/ /*前mSIZE個(gè)數(shù)直接放入*/ for(i=0;i

  memery[i]=page[i]; for(j=0;j

  for(i=mSIZE;i

  /*判斷新頁(yè)面號(hào)是否在物理塊中*/ for(j=0,k=0;j

  if(memery[j]!=page[i]) k++; }

  if(k==mSIZE) /*如果不在物理塊中*/ { count++; /*得到物理快中各頁(yè)下一次訪問(wèn)時(shí)間*/ for(m=0;m=next[1]?0:1; for(m=2;mnext[max]) max=m; /*下一次訪問(wèn)時(shí)間都為pSIZE,則置換物理塊中第一個(gè) */ memery[max]=page[i]; for(j=0;j

  for(j=0;j

  四、調(diào)試及實(shí)驗(yàn)結(jié)果

  第一組數(shù)據(jù):

  1.運(yùn)行結(jié)果

  2. 按任意鍵進(jìn)行初始化:

  3. 載入數(shù)據(jù):

  4. 進(jìn)入置換算法選擇界面:

  5.運(yùn)算中延遲操作:

  6.三種算法演示結(jié)果

  7.退出算法

  第二組數(shù)據(jù):

  1.運(yùn)行結(jié)果

  2.按任意鍵進(jìn)行初始化:

  3.載入數(shù)據(jù):

  4.進(jìn)入置換算法選擇界面:

  5.運(yùn)算中延遲操作:

  6. 三種算法演示結(jié)果

  7.退出算法

  五、個(gè)人體會(huì)

  由于時(shí)間有限,本次設(shè)計(jì)完成的并不是很完美,下面從以下幾點(diǎn)來(lái)說(shuō)明本次課程設(shè)計(jì)的個(gè)人體會(huì):

  1.本次課程設(shè)計(jì)中做的比較好的地方:

  做的好的'地方就是在于對(duì)題目意思的正確理解,以及在此基礎(chǔ)上的模型設(shè)計(jì)。最開(kāi)始一看題目的時(shí)候感覺(jué)很迷茫,有點(diǎn)不知道如何著手,等靜下心來(lái)仔細(xì)分析了程序,明確了目標(biāo),明確了思路,才對(duì)程序有了一個(gè)較為完整的實(shí)現(xiàn)。

  2.做得不太好的地方,以及以后如何改正:

  做得不太好的地方就是不能把自己所學(xué)的C知識(shí)和本次課程設(shè)計(jì)的相關(guān)知識(shí)很好的結(jié)合起來(lái),以至于沒(méi)有很好的表達(dá)出本次課程設(shè)計(jì)的細(xì)節(jié)。在以后的過(guò)程中,我會(huì)運(yùn)用本次課程設(shè)計(jì)中所學(xué)的知識(shí),以及思考問(wèn)題的方式和方法,爭(zhēng)取能夠發(fā)揚(yáng)優(yōu)點(diǎn),盡量克服不細(xì)心,不嚴(yán)謹(jǐn)?shù)热秉c(diǎn)。

  3.從本次設(shè)計(jì)中得到的收獲:

  通過(guò)本次課程設(shè)計(jì),我學(xué)會(huì)了綜合運(yùn)用所學(xué)相關(guān)知識(shí)的能力,動(dòng)手能力以及獨(dú)立思考問(wèn)題的能力。下面具體的收一個(gè)邊學(xué)程序是遇到的困難,首先就是如何把想法變?yōu)樽龇ǖ膯?wèn)題,最開(kāi)始一拿到題目,我就覺(jué)得無(wú)從下手,因?yàn)槲业拈啔v,不知道如何把這樣一個(gè)問(wèn)題變成程序,變成能夠讓人一目了然的東西,于是,我就先寫(xiě)下了p,v操作的實(shí)現(xiàn)過(guò)程,因?yàn)檫@個(gè)對(duì)我來(lái)說(shuō)簡(jiǎn)單一些,然后,在此基礎(chǔ)之上,就好辦了,結(jié)果最后用了2個(gè)函數(shù)就解決問(wèn)題了,所以,我覺(jué)得有時(shí)候思考問(wèn)題不要太死腦筋,換一個(gè)角度的話,也許會(huì)更好,說(shuō)不定就能達(dá)到事半功倍的效果。

《日本少妇被黑人xxxxx,国产熟女乱子视频正在播放,老鸭窝视频在线观看.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

【操作系統(tǒng)實(shí)驗(yàn)報(bào)告】相關(guān)文章:

科技實(shí)驗(yàn)報(bào)告實(shí)驗(yàn)報(bào)告08-10

什么是操作系統(tǒng)04-26

什么是操作系統(tǒng)04-26

什么是操作系統(tǒng)04-26

什么是操作系統(tǒng)04-26

什么是操作系統(tǒng)04-26

什么是實(shí)驗(yàn)報(bào)告及實(shí)驗(yàn)報(bào)告怎么寫(xiě)05-04

什么是兼容操作系統(tǒng)04-26

什么是網(wǎng)絡(luò)操作系統(tǒng)04-26

操作系統(tǒng)實(shí)驗(yàn)報(bào)告(通用5篇)

  在生活中,大家逐漸認(rèn)識(shí)到報(bào)告的重要性,我們?cè)趯?xiě)報(bào)告的時(shí)候要注意語(yǔ)言要準(zhǔn)確、簡(jiǎn)潔。其實(shí)寫(xiě)報(bào)告并沒(méi)有想象中那么難,以下是小編精心整理的操作系統(tǒng)實(shí)驗(yàn)報(bào)告,僅供參考,希望能夠幫助到大家。

  操作系統(tǒng)實(shí)驗(yàn)報(bào)告 1

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

  用高級(jí)語(yǔ)言編寫(xiě)和調(diào)試一個(gè)進(jìn)程調(diào)度程序,以加深對(duì)進(jìn)程的概念及進(jìn)程調(diào)度算法的理解。

  二、實(shí)驗(yàn)內(nèi)容和要求

  編寫(xiě)并調(diào)試一個(gè)模擬的進(jìn)程調(diào)度程序,采用“簡(jiǎn)單時(shí)間片輪轉(zhuǎn)法”調(diào)度算法對(duì)五個(gè)進(jìn)程進(jìn)行調(diào)度。

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

  進(jìn)程的到達(dá)時(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)兩種狀態(tài)之一。

  就緒進(jìn)程獲得 CPU后都只能運(yùn)行一個(gè)時(shí)間片。用運(yùn)行時(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)分配時(shí)間片給就緒隊(duì)列中排在該進(jìn)程之后的進(jìn)程,并將它插入就緒隊(duì)列隊(duì)尾。 每進(jìn)行一次調(diào)度程序都打印一次運(yùn)行進(jìn)程、就緒隊(duì)列、以及各個(gè)進(jìn)程的 PCB,以便進(jìn)行檢查。

  重復(fù)以上過(guò)程,直到所要進(jìn)程都完成為止。

  三、實(shí)驗(yàn)主要儀器設(shè)備和材料

  硬件環(huán)境:IBM-PC或兼容機(jī)

  軟件環(huán)境:C語(yǔ)言編程環(huán)境

  四、實(shí)驗(yàn)原理及設(shè)計(jì)方案

  1、進(jìn)程調(diào)度算法:采用多級(jí)反饋隊(duì)列調(diào)度算法。其基本思想是:當(dāng)一個(gè)新進(jìn)程進(jìn)入內(nèi)在后,首先將它放入第一個(gè)隊(duì)列的末尾,按FCFS原則排隊(duì)等待高度。當(dāng)輪到該進(jìn)程執(zhí)行時(shí),如能在該時(shí)間片內(nèi)完成,便可準(zhǔn)備撤離系統(tǒng);如果它在一個(gè)時(shí)間片結(jié)束時(shí)尚為完成,調(diào)度程序便將該進(jìn)程轉(zhuǎn)入第二隊(duì)列的`末尾,再同樣地按FCFS原則等待調(diào)度執(zhí)行,以此類(lèi)推。

  2、實(shí)驗(yàn)步驟:

  (1)按先來(lái)先服務(wù)算法將進(jìn)程排成就緒隊(duì)列。

  (2)檢查所有隊(duì)列是否為空,若空則退出,否則將隊(duì)首進(jìn)程調(diào)入執(zhí)行。

  (3)檢查該運(yùn)行進(jìn)程是否運(yùn)行完畢,若運(yùn)行完畢,則撤消進(jìn)程,否則,將該進(jìn)程插入到下一個(gè)邏輯隊(duì)列的隊(duì)尾。

  (4)是否再插入新的進(jìn)程,若是則把它放到第一邏輯隊(duì)列的列尾。

  (5)重復(fù)步驟(2)、(3)、(4),直到就緒隊(duì)列為空。

  五、流程圖

  六、結(jié)果過(guò)程及截圖 初始化隊(duì)列

  按Y鍵繼續(xù)運(yùn)行進(jìn)程:

  按Y鍵繼續(xù)運(yùn)行進(jìn)程:

  運(yùn)行若干次后的狀態(tài):

  添加新的進(jìn)程:

  七、所遇困難的解決以及心得體會(huì)

  在這個(gè)多級(jí)反饋的實(shí)驗(yàn)中,我采取了用一條實(shí)際上的鏈表隊(duì)列來(lái)模擬多個(gè)邏輯上的隊(duì)列,通過(guò)維護(hù)幾個(gè)鏈表的狀態(tài)信息來(lái)找到每個(gè)進(jìn)程運(yùn)行完后應(yīng)該插入的地方,還有一個(gè)標(biāo)志位Fend用來(lái)表明新插入的隊(duì)列的位置。雖然實(shí)驗(yàn)原理很簡(jiǎn)單,但是在編寫(xiě)代碼的過(guò)程中遇到了不少的問(wèn)題,在兩個(gè)小時(shí)之內(nèi)已經(jīng)完成的大體代碼的編寫(xiě),但是之中存在不少的問(wèn)題,導(dǎo)致了用了差不多四個(gè)小時(shí)的時(shí)間去調(diào)試才把它弄好,這主要?dú)w咎于在開(kāi)始設(shè)計(jì)代碼的不太合理,在后期使得代碼結(jié)構(gòu)有些混亂,使得調(diào)試更加的麻煩,以及對(duì)編程的不熟悉。通過(guò)這個(gè)實(shí)驗(yàn)不僅使我對(duì)進(jìn)程的調(diào)度算法有了更深的認(rèn)識(shí),使得理論知識(shí)得到的實(shí)踐,也使我的編程能力得到了進(jìn)一步提高。

  七、思考題

  分析不同調(diào)度算法的調(diào)度策略,比較不同調(diào)度算法的優(yōu)缺點(diǎn),總結(jié)它們的適用范圍。

  答:動(dòng)態(tài)有限權(quán)算法:動(dòng)態(tài)優(yōu)先權(quán)是指在創(chuàng)建進(jìn)程時(shí)所創(chuàng)建的優(yōu)先權(quán),會(huì)隨進(jìn)程的推進(jìn)或者等待時(shí)間的增加而改變,以便獲得更好的調(diào)度性能。處理機(jī)為每個(gè)進(jìn)程分配一定的時(shí)間片,在就緒隊(duì)列中,優(yōu)先權(quán)高的進(jìn)程將優(yōu)先獲得處理機(jī),進(jìn)程在進(jìn)去運(yùn)行完響應(yīng)的時(shí)間片后,如沒(méi)完成,優(yōu)先權(quán)減1,從新回到就緒隊(duì)列等待分配處理機(jī)。

  時(shí)間片的輪轉(zhuǎn)法:系統(tǒng)將所有進(jìn)程排成一個(gè)隊(duì)列,按照先來(lái)先服務(wù)的原則,對(duì)隊(duì)列首的進(jìn)程進(jìn)行處理,每個(gè)進(jìn)程在用完自己的時(shí)間片后,從新回到隊(duì)尾進(jìn)行排隊(duì)。每運(yùn)行一次,進(jìn)程的需要時(shí)間減1,直到就緒隊(duì)列為空!

  八、源代碼

  #include #include

  #include

  #define getpch(type) (type*)malloc(sizeof(type)) #define NULL 0

  #define TIME 2//時(shí)間片長(zhǎng)度

  typedef struct pcb{//進(jìn)程管理塊 char name[10];//進(jìn)程名字 char state; //進(jìn)程狀態(tài)

  int queue; int ntime; int rtime; int etime;

  //進(jìn)程所在的隊(duì)列

  //進(jìn)程需要運(yùn)行的時(shí)間

  //進(jìn)程已經(jīng)運(yùn)行的時(shí)間

  //進(jìn)程在本隊(duì)列可運(yùn)行的時(shí)間片

  struct pcb *link;

  }PCB;

  PCB *ready = NULL, *p = NULL, *pfend = NULL,*p =NULL; 位置的變量

  int geti() //使用戶僅能輸入整數(shù) {

  char ch; int i = 0; fflush(stdin); ch = get); while(ch == ){

  //就緒隊(duì)列,進(jìn)程插入

  printf(

  fflush(stdin); ch = get); }

  while(ch != ){

  if(ch > 9 || ch

  fflush(stdin); i = 0; ch = get);

  }else{ i = i*10 + (ch - 0); }

  ch = get);

  }

  return i;

  }

  void findpos()//更新?tīng)顟B(tài)量 {

  PCB *ps = pfend;

  if(!ps || !ps -> link || (ps-> link->queue - ps->queue) > 1) p = ps; else{ while (ps->link && ps ->link->queue != (pfend ->queue +2)) }

  ps = ps->link; p = ps;

  }

  void ()//插入進(jìn)程 {

  if(!ready ){

  ready = p;

  pfend = p; p = p;

  }else if(ready ->queue == 1){//第一隊(duì)列存在

  p->link = pfend->link; pfend->link = p; pfend = p; findpos();

  }

  void input()/*建立進(jìn)程控制塊函數(shù)*/ {

  int i,num;

  printf(

  for(i=0; i

  p=getpch(PCB);

  printf(

  printf(

  p->queue =1;

  p->etime = TIME; p->link=NULL;

  ();/*調(diào)用函數(shù)*/ } else{ p->link = ready; ready = p; }

  findpos();

  }

  void disp(PCB *pr)/*建立進(jìn)程現(xiàn)實(shí)函數(shù),用于顯示當(dāng)前進(jìn)程*/ {

  printf(

  }

  void check()/*建立進(jìn)程查看函數(shù)*/

  {

  }

  void sort()//調(diào)整進(jìn)程隊(duì)列

  {

  } if(!ready->link ||ready->queue link->queue) return; p = ready ->link; ready ->link = p ->link; p ->link = ready; p = ready; ready = p; if (ready && ready -> queue == p ->queue){ findpos(); } PCB *pr; printf(

  void addnew()//添加新的進(jìn)程

  {

  if(ready ->queue != 1){ (ready -> queue)++; ready->etime *= 2; ready -> state=w; sort();/*調(diào)用sort函數(shù)*/ input(); } else{ input();

  }

  }

  void destroy()/*建立進(jìn)程撤銷(xiāo)函數(shù)(進(jìn)程運(yùn)行結(jié)束,撤銷(xiāo)進(jìn)程)*/

  {

  }

  void running()/*建立進(jìn)程就緒函數(shù)(進(jìn)程運(yùn)行時(shí)間到,置就緒狀態(tài))*/

  {

  }

  void main()

  {

  char ch; input(); while(ready != NULL) { printf(

  }

  ready ->state = R; check(); running(); printf(

  操作系統(tǒng)實(shí)驗(yàn)報(bào)告 2

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

  本實(shí)驗(yàn)要求學(xué)生模擬作業(yè)調(diào)度的實(shí)現(xiàn),用高級(jí)語(yǔ)言編寫(xiě)和調(diào)試一個(gè)或多個(gè)作業(yè)調(diào)度的模擬程序,了解作業(yè)調(diào)度在操作系統(tǒng)中的作用,以加深對(duì)作業(yè)調(diào)度算法的理解。

  二、實(shí)驗(yàn)內(nèi)容和要求

  1、編寫(xiě)并調(diào)度一個(gè)多道程序系統(tǒng)的作業(yè)調(diào)度模擬程序。

  作業(yè)調(diào)度算法:采用基于先來(lái)先服務(wù)的調(diào)度算法。可以參考課本中的方法進(jìn)行設(shè)計(jì)。 對(duì)于多道程序系統(tǒng),要假定系統(tǒng)中具有的各種資源及數(shù)量、調(diào)度作業(yè)時(shí)必須考慮到每個(gè)作業(yè)的資源要求。

  三、實(shí)驗(yàn)主要儀器設(shè)備和材料

  硬件環(huán)境:IBM-PC或兼容機(jī)

  軟件環(huán)境:C語(yǔ)言編程環(huán)境

  四、實(shí)驗(yàn)原理及設(shè)計(jì)方案

  采用多道程序設(shè)計(jì)方法的操作系統(tǒng),在系統(tǒng)中要經(jīng)常保留多個(gè)運(yùn)行的作業(yè),以提高系統(tǒng)效率。作業(yè)調(diào)度從系統(tǒng)已接納的暫存在輸入井中的一批作業(yè)中挑選出若干個(gè)可運(yùn)行的作業(yè),并為這些被選中的作業(yè)分配所需的系統(tǒng)資源。對(duì)被選中運(yùn)行的作業(yè)必須按照它們各自的作業(yè)說(shuō)明書(shū)規(guī)定的步驟進(jìn)行控制。

  采用先來(lái)先服務(wù)算法算法模擬設(shè)計(jì)作業(yè)調(diào)度程序。

  (1)作業(yè)調(diào)度程序負(fù)責(zé)從輸入井選擇若干個(gè)作業(yè)進(jìn)入主存,為它們分配必要的資源,當(dāng)它們能夠被進(jìn)程調(diào)度選中時(shí),就可占用處理器運(yùn)行。作業(yè)調(diào)度選擇一個(gè)作業(yè)的必要條件是系統(tǒng)中現(xiàn)有的尚未分配的資源可滿足該作業(yè)的資源要求。但有時(shí)系統(tǒng)中現(xiàn)有的尚未分配的資源既可滿足某個(gè)作業(yè)的要求也可滿足其它一些作業(yè)的要求,那么,作業(yè)調(diào)度必須按一定的算法在這些作業(yè)中作出選擇。先來(lái)先服務(wù)算法是按照作業(yè)進(jìn)入輸入井的先后次序來(lái)挑選作業(yè),先進(jìn)入輸入井的作業(yè)優(yōu)先被挑選,當(dāng)系統(tǒng)中現(xiàn)有的尚未分配的資源不能滿足先進(jìn)入輸入井的.作業(yè)時(shí),那么順序挑選后面的作業(yè)。

  (2) 假定某系統(tǒng)可供用戶使用的主存空間共100k,并有5臺(tái)磁帶機(jī)。

  (3)流程圖:

  五、結(jié)果過(guò)程及截圖

  讀取文件jobs.txt來(lái)初始化主存,磁帶機(jī)的個(gè)數(shù),并打印出來(lái)。

  初始時(shí)間是9:00:

  按Y運(yùn)行5分鐘:

  按Y運(yùn)行5分鐘:

  按Y運(yùn)行5分鐘:

  多次運(yùn)行后最后狀態(tài):

  六、所遇困難的解決以及心得體會(huì)

  這個(gè)實(shí)驗(yàn)是花的時(shí)間最多的一個(gè)實(shí)驗(yàn),第一次做的時(shí)候由于理解有些問(wèn)題,所以做錯(cuò)了。之后重新做了一遍,收獲還是很多的,遇到了很多的細(xì)節(jié)問(wèn)題,例如像是時(shí)間化成浮點(diǎn)數(shù)和浮點(diǎn)數(shù)化成時(shí)間等一些問(wèn)題,從中也暴露了自己的編程能力欠缺,之后要多多的寫(xiě)程序。

  七、思考題

  1、 寫(xiě)出每種算法的調(diào)度策略,最后比較各種算法的優(yōu)缺點(diǎn)。

  答:先來(lái)先服務(wù)算法是根據(jù)作業(yè)的進(jìn)入時(shí)間來(lái)排序,到達(dá)時(shí)間短的先運(yùn)行,優(yōu)點(diǎn)是實(shí)現(xiàn)簡(jiǎn)單,缺點(diǎn)是運(yùn)行時(shí)間慢。

  短作業(yè)優(yōu)先算法是根椐作業(yè)的估計(jì)運(yùn)行時(shí)間來(lái)排序,估計(jì)運(yùn)行時(shí)間短的先運(yùn)行,優(yōu)點(diǎn)是運(yùn)行時(shí)間快,缺點(diǎn)是實(shí)現(xiàn)起來(lái)比較復(fù)雜。

  2、 選擇調(diào)度算法的依據(jù)是什么?

  答:如果作業(yè)要求的速度不高,而且作業(yè)比較小型,那就最好用先來(lái)先服務(wù)算法。

  如果作業(yè)要求的速度高,作業(yè)流程復(fù)雜,那就最好用短作業(yè)優(yōu)先算法。

  八、源代碼

  #include

  #include

  #include

  #include

  #define getjcb() (JCB*)malloc(sizeof(JCB))

  typedef struct {//資源的總量

  int memory; int tape;

  }RESOURCE;

  typedef struct JCB {//作業(yè)控制塊

  char username[20];//用戶名

  char jobname[10];//作業(yè)名

  char state;//作業(yè)狀態(tài) char atime[5];//到達(dá)時(shí)間 float rtime;//運(yùn)行時(shí)間 RESOURCE resource;//資源數(shù)量 struct JCB*link; }JCB;

  RESOURCE source = {100,5};

  JCB *pjcb =getjcb();//作業(yè)鏈表頭

  char nowtime[5];//現(xiàn)在時(shí)間,初始時(shí)間為9:00

  FILE* ignore(FILE *fp)//忽略文件中的空白符

  {

  if(feof(fp)) return fp; char ch = fgetc(fp); while (!feof(fp) && (ch == || ch == )){ ch = fgetc(fp); } //if(!feof(fp)) return fp; fseek(fp, -1, SEEK_CUR);

  return fp;

  }

  FILE* findFILE *fp,char c)//在文件中找到一個(gè)字符的位置(讀取文件時(shí)用) {

  if(feof(fp)) return fp; char ch = fgetc(fp); while (!feof(fp) && (ch != c)){ } ch = fgetc(fp); fseek(fp, -1, SEEK_CUR); return fp;

  }

  void destory()//釋放鏈表所占的內(nèi)存

  {

  JCB *p = pjcb->link; while(pjcb){ free(pjcb); pjcb = p; if(p) p = p->link;

  }

  }

  float stof(char *time)//把時(shí)間轉(zhuǎn)化為浮點(diǎn)型數(shù)

  {

  float h = 0, m = 0; int i = 0; while(time[i] != :){ h = h*10 + time[i] - 0; } i++; while(time[i] != ){ m = m*10 + time[i] - 0; } i++; i++;

  return (h + m/60);

  }

  char* ftos(double ftime)//把浮點(diǎn)型數(shù)值轉(zhuǎn)化為時(shí)間

  {

  }

  float timesub(char *time1, char *time2)//兩個(gè)時(shí)間相減,得到時(shí)間差

  {

  }

  void print()//打印輸出

  {

  JCB *p = pjcb->link; printf(

  p->atime, p->rtime, p->resource.memory,p->resource.tape);

  }

  void sendsource()//為作業(yè)分配資源

  {

  JCB *p; p = pjcb->link; while(p){//為到達(dá)的作業(yè)調(diào)度 p = p->link; }

  if(p->state == W && source.memory - p->resource.memory >=0 && source.tape - p->resource.tape >=0){

  } } p = p->link; p->state = R; source.memory -= p->resource.memory; source.tape -= p->resource.tape; printf(

  }

  void init()//初始化,讀取文件中的作業(yè)信息

  {

  FILE *fp; JCB *p= NULL,*q = pjcb ; if((fp = fopen(

  } } fp = ignore(fp); p->rtime = 0;//不初始化則會(huì)發(fā)生錯(cuò)誤,? fscanf(fp,

  int checkend() //檢查是否所有的作業(yè)都已經(jīng)運(yùn)行完了

  {

  JCB *p = pjcb ->link; while(p){ if(p ->state != F){ return 0; } p = p->link; } return 1;

  }

  void run()//運(yùn)行作業(yè)

  {

  if(checkend()){//檢查是否所有的作業(yè)都已經(jīng)運(yùn)行完了 printf(

  }

  } p = p->link; } p = pjcb ->link; while(p){//計(jì)算到達(dá)的作業(yè) if( strcmp(nowtime, p->atime) ==0 && p->state == N){ p->state = W; printf(

  int main()

  {

  char ch;

  double time =9.00;

  }

  double step = float(5)/60+0.00001; ftos(9.0); init(); do{ run(); puts(

  操作系統(tǒng)實(shí)驗(yàn)報(bào)告 3

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

  模擬文件系統(tǒng)實(shí)現(xiàn)的基本功能,了解文件系統(tǒng)的基本結(jié)構(gòu)和文件的各種管理方法,加深理解文件系統(tǒng)的內(nèi)部功能及內(nèi)部實(shí)現(xiàn)。通過(guò)用高級(jí)語(yǔ)言編寫(xiě)和調(diào)試一個(gè)簡(jiǎn)單的文件系統(tǒng),模擬文件管理的工作過(guò)程,從而對(duì)各種文件操作命令的.實(shí)質(zhì)內(nèi)容和執(zhí)行過(guò)程有比較深入的了解。

  二、實(shí)驗(yàn)內(nèi)容和要求

  編程模擬一個(gè)簡(jiǎn)單的文件系統(tǒng),實(shí)現(xiàn)文件系統(tǒng)的管理和控制功能。要求本文件系統(tǒng)采用兩級(jí)目錄,即設(shè)置主文件目錄[MFD]和用戶文件目錄[UED]。另外,為打開(kāi)文件設(shè)置運(yùn)行文件目錄[AFD]。設(shè)計(jì)一個(gè)10個(gè)用戶的文件系統(tǒng),每次用戶可保存10個(gè)文件,一次運(yùn)行用戶可以打開(kāi)5個(gè)文件,并對(duì)文件必須設(shè)置保護(hù)措施。在用戶程序中通過(guò)使用文件系統(tǒng)提供的Create、open、read、write、close、等文件命令,對(duì)文件進(jìn)行操作

  三、實(shí)驗(yàn)主要儀器設(shè)備和材料

  硬件環(huán)境:IBM-PC或兼容機(jī)

  軟件環(huán)境:C語(yǔ)言編程環(huán)境

  四、實(shí)驗(yàn)原理及設(shè)計(jì)方案

  1、實(shí)驗(yàn)原理

  運(yùn)用二級(jí)目錄思想來(lái)模擬文件系統(tǒng)。

  為每個(gè)用戶建立一個(gè)單獨(dú)的用戶文件目錄UFD。這些文件目錄具有相似的結(jié)構(gòu),它由用戶文件的文件塊組成。此外,在系統(tǒng)再建立一個(gè)主文件目錄MFD;在主文件目錄中,每個(gè)用戶目錄都占有一個(gè)目錄項(xiàng),其目錄項(xiàng)中包含文件名和指向該文件目錄文件的指針。

  3、程序流程圖

  五、結(jié)果過(guò)程及截圖

  系統(tǒng)的使用簡(jiǎn)要說(shuō)明:

  登陸:

  create命令新建文件

  file5

  Create失敗

  命令刪除文件

  Delete失敗:

  open打開(kāi)命令,及write命令來(lái)追加文件

  Read命令和close命令關(guān)閉

  對(duì)沒(méi)打開(kāi)的文件讀寫(xiě):

  六、所遇困難的解決以及心得體會(huì)

  本實(shí)驗(yàn)的代碼長(zhǎng)度的最常的,但是原理很簡(jiǎn)單,并且實(shí)驗(yàn)要求的是模擬,所以大大降低了實(shí)驗(yàn)的難度,在操作系統(tǒng)課中我們還有一個(gè)課程設(shè)計(jì),也是文件管理系統(tǒng),但是要比這個(gè)難很多,通過(guò)這個(gè)實(shí)驗(yàn),我對(duì)文件管理系統(tǒng)的運(yùn)行機(jī)制有了深入的了解,因?yàn)橐龊眠@個(gè)實(shí)驗(yàn)必須要懂得文件管理系統(tǒng)的架構(gòu),這也迫使我認(rèn)認(rèn)真真的研究了操作系統(tǒng)中關(guān)于文件管理這一章的內(nèi)容。同時(shí)這個(gè)程序也為以后的課程設(shè)計(jì)奠定了基礎(chǔ),并且很多的代碼也是可以重用的。

  七、思考題

  1、文件系統(tǒng)要解決哪些問(wèn)題?

  答:要解決文件和用戶是否同名,文件創(chuàng)建數(shù)是否超額,所要求文件是否存在等問(wèn)題。

  2、什么是文件目錄?什么是文件目錄中包含哪些信息?目前廣泛采用的目錄結(jié)構(gòu)形式是哪種?

  答:文件目錄就是用來(lái)展示一個(gè)用戶的所有文件的一個(gè)表格,文件目錄應(yīng)包含文件名,保密碼,文件大小,目前廣泛采用的目錄結(jié)構(gòu)形式是多級(jí)目錄形式。

  八、源代碼

  #include

  #include

  #include

  #include

  #define NULL 0

  typedef struct mdf{//MDF結(jié)構(gòu)體

  char username[20];//用戶名 char filename[20];//文件名

  struct mdf *next;

  }MDF;

  typedef struct ufd{//UFD結(jié)構(gòu)體

  char filename[20];//文件名

  int protect;//文件保護(hù)碼 unsigned int length;//文件長(zhǎng)度

  struct ufd *next;

  }UFD;

  typedef struct afd{//AFD結(jié)構(gòu)體

  char filename[20];//文件名 int protect;//文件保護(hù)碼 unsigned int point;//文件讀寫(xiě)指針

  struct afd *next;

  }AFD;

  MDF *pmdf;//全局鏈表頭指針

  UFD *pufd;

  AFD *pafd;

  char UserUFD[20];//已經(jīng)登陸成功的用戶名

  void initM DF()//初始化MDF表

  {

  FILE *fp; pmdf= (MDF*)malloc(sizeof(MDF)); MDF *p = pmdf; if((fp = fopen(

  } exit(1); } while (!feof(fp)){//把MDF文件中的內(nèi)容裝入鏈表 } p->next = (MDF*)malloc(sizeof(MDF)); p = p->next; fscanf(fp,

  void printUFD()//打印MDF表 {

  UFD *p = pufd->next; puts(

  }

  void initUFD(char *name)//初始化UFD表 {

  FILE *fp; pufd= (UFD*)malloc(sizeof(UFD)); UFD *p = pufd; if((fp = fopen(name,

  } p->next = NULL; fclose(fp);

  int checkuser()//檢測(cè)登陸的用戶名 {

  } char username[20]; while(1){ puts(

  void initAFD()//初始化AFD {

  pafd = (AFD*)malloc(sizeof(AFD)); pafd->next = NULL; }

  bool create()//創(chuàng)建文件命令 {

  char filename[20]; UFD *p = pufd->next; AFD *pa = pafd; puts(

  } } if(!p->next) break; p= p->next; p->next = (UFD*)malloc(sizeof(UFD)); p=p->next; strcpy(p->filename, filename); p->protect = 2; p->length = 0; p->next = NULL; while(pa->next){//創(chuàng)建文件后加入到AFD } pa=pa->next; pa->next = (AFD*)malloc(sizeof(AFD)); pa = pa->next; strcpy(pa->filename ,filename); pa->protect = 2; pa->point = 0; pa->next = NULL; return 1;

  }

  bool _()//刪除文件命令 {

  char filename[20]; puts(

  puts(

  return 0;

  }

  bool open()//打開(kāi)文件命令

  {

  char filename[20]; unsigned int protect; puts(

  } } puts(

  void close()//關(guān)閉文件命令

  {

  char filename[20]; UFD *pu = pufd->next; puts(

  int read()//讀文件命令

  {

  char filename[20]; unsigned int length; AFD *p = pafd->next;

  } puts(

  int write()//寫(xiě)文件命令

  {

  }

  char filename[20]; unsigned int length; AFD *p = pafd->next; puts(

  void destroy()//釋放內(nèi)存

  {

  }

  void saveUFD()//保存UFD文件

  {

  }

  void bye()//推出系統(tǒng)

  { FILE *fp; UFD *p = pufd->next; if((fp = fopen(UserUFD,

  UFD *pu = pufd->next; while(pa){ if(pa->protect == 2){ while(pu){ } saveUFD(); printUFD(); destroy(); } } if(strcmp(pa->filename, pu->filename) == 0){ } pu->length = pa->point; break; pu = pu->next; pa =pa->next;

  }

  void operate()//命令識(shí)別

  {

  while(1){ char command[20]; char name[][8] = {

  }

  } return; }else puts(

  void print()

  {

  puts(

  int main()

  {

  }

  print(); initM DF(); checkuser(); initAFD(); operate();)//命令識(shí)別 return 0;

  操作系統(tǒng)實(shí)驗(yàn)報(bào)告 4

  1.實(shí)習(xí)目的

  (一).通過(guò)綜合實(shí)訓(xùn)進(jìn)一步鞏固、深化和擴(kuò)展學(xué)生的專業(yè)技能。

  1.熟練掌握Linux操作系統(tǒng)的安裝及基本配置。

  2.熟練掌握Linux系統(tǒng)管理。

  3.掌握Linux下用戶和組的管理。

  4.掌握Linux下FTP服務(wù)器的管理。

  (二)訓(xùn)練和培養(yǎng)學(xué)生獲取信息和處理信息的能力,充分培養(yǎng)和提高學(xué)生的動(dòng)手能力,學(xué)會(huì)通過(guò)網(wǎng)站、書(shū)籍等方式收集所需的資料。

  (三)培養(yǎng)學(xué)生運(yùn)用所學(xué)的知識(shí)和技能解決Linux使用、管理過(guò)程中所遇到的實(shí)際問(wèn)題的能力及其基本工作素質(zhì)。

  (四)培養(yǎng)學(xué)生理論聯(lián)系實(shí)際的工作作風(fēng)、嚴(yán)肅認(rèn)真的科學(xué)態(tài)度以及獨(dú)立工作的能力,樹(shù)立自信心。

  (五)訓(xùn)練和培養(yǎng)學(xué)上的團(tuán)隊(duì)協(xié)作精神與合作能力。

  2 實(shí)習(xí)概況

  2.1 實(shí)習(xí)要求

  具體來(lái)講,《linux操作系統(tǒng)》課程包括以下實(shí)習(xí)內(nèi)容:

  (一)獨(dú)立完成實(shí)訓(xùn)。

  (二)要求熟練掌握Linux操作系統(tǒng)的安裝與基本配置。

  (三)熟練掌握Linux系統(tǒng)管理基本方法。

  (四)掌握Linux下用戶和組的管理。

  (五)掌握Linux下的FTP服務(wù)器的管理。

  2.2 實(shí)習(xí)時(shí)間

  20XX年12月16日至20XX年12月20日

  2.3 實(shí)習(xí)基本情況

  實(shí)習(xí)地點(diǎn):四教學(xué)樓 4112、4212、4312、4412

  實(shí)習(xí)環(huán)境 :RedHat9軟件

  實(shí)習(xí)內(nèi)容:掌握l(shuí)inux操作系統(tǒng)

  2.4 硬件環(huán)境

  3 實(shí)習(xí)內(nèi)容

  3.1 linux安裝 Linux是一類(lèi)Unix計(jì)算機(jī)操作系統(tǒng)的統(tǒng)稱。Linux 是以Unix 操作系統(tǒng)為原型的多任務(wù)、多用戶的`系統(tǒng)。可運(yùn)行于多種硬件平臺(tái):PC、Alpha、SPARC、

  POWER PC。 今天實(shí)習(xí)的主要內(nèi)容是學(xué)習(xí)了解Linux的安裝過(guò)程;Linux登錄和退出 ,熟悉Linux操作系統(tǒng)的圖形界面

  (一)Linux的安裝過(guò)程

  1)VMware軟件的安裝

  因?yàn)槲矣玫氖菣C(jī)房的電腦,所以不用安裝VMware軟件。如果要安裝,過(guò)程十分簡(jiǎn)單,下載完畢,直接“Next”即可完成安裝。

  2)虛擬機(jī)的安裝。打開(kāi)VMware軟件,單擊“新建虛擬機(jī)”命令根據(jù)提示選擇一種要安裝的操作系統(tǒng),一般選擇典型設(shè)置,然后直接按“下一步”即可。需要注意的就是在分區(qū)的時(shí)候需按要求建立合適的分區(qū),如下圖所示。

  圖3-1-1 選擇分區(qū)

  3)Red Hat Linux 9.0安裝

  首先單擊“編輯虛擬機(jī)設(shè)置”,改寫(xiě)鏡像為“l(fā)inux9cd1”,然后返回初始界面。點(diǎn)擊“啟動(dòng)該虛擬機(jī)”,便進(jìn)入到軟件的安裝過(guò)程。開(kāi)始是“歡迎使Red Hat Linux”界面,然后經(jīng)歷語(yǔ)言選擇、鍵盤(pán)配置、鼠標(biāo)配置、磁盤(pán)分區(qū)設(shè)置、選擇軟件包組、安裝軟件包等操作后,然后是虛擬機(jī)安裝完第一張盤(pán)后要進(jìn)行第二張盤(pán)的安裝,如圖3-2經(jīng)過(guò)老師的指點(diǎn),按住“Ctrl+Alt”,將鼠標(biāo)調(diào)出,雙擊右下方任務(wù)欄第一個(gè)按鈕,依次選擇第二、三鏡像,繼續(xù)安裝,便安裝成功了。

  操作系統(tǒng)實(shí)驗(yàn)報(bào)告 5

  一、課程設(shè)計(jì)任務(wù)劃分

  二、基本原理

  (一)頁(yè)面置換算法定義

  在地址映射過(guò)程中,若在頁(yè)面中發(fā)現(xiàn)所要訪問(wèn)的頁(yè)面不再內(nèi)存中,則產(chǎn)生缺頁(yè)中斷。當(dāng)發(fā)生缺頁(yè)中斷時(shí)操作系統(tǒng)必須在內(nèi)存選擇一個(gè)頁(yè)面將其移出內(nèi) 存,以便為即將調(diào)入的頁(yè)面讓出空間。而用來(lái)選擇淘汰哪一頁(yè)的規(guī)則叫做頁(yè)面置換算法。

  (二)所使用的算法

  1) 最佳置換算法(OPT):將以后永不使用的或許是在最長(zhǎng)(未來(lái))時(shí)間內(nèi) 不再被訪問(wèn)的頁(yè)面換出。

  2) 先進(jìn)先出算法(FIFO):淘汰最先進(jìn)入內(nèi)存的頁(yè)面,即 選擇在內(nèi)存中駐留時(shí)間最久的頁(yè)面予以淘汰。

  3) 最近最久未使用算法(LRU):淘汰最近最久未被使用 的頁(yè)面。

  (三)設(shè)計(jì)思想

  選擇置換算法,先輸入所有頁(yè)面號(hào),為系統(tǒng)分配物理塊,依次進(jìn)行置換:

  OPT基本思想:

  是用一維數(shù)組page[pSIZE]存儲(chǔ)頁(yè)面號(hào)序列,memery[mSIZE]是存儲(chǔ)裝入物理塊中的頁(yè)面。數(shù)組next[mSIZE]記錄物理塊中對(duì)應(yīng)頁(yè)面的最后訪問(wèn)時(shí)間。每當(dāng)發(fā)生缺頁(yè)時(shí),就從物理塊中找出最后訪問(wèn)時(shí)間最大的頁(yè)面,調(diào)出該頁(yè),換入所缺的頁(yè)面。

  FIFO基本思想:

  是用隊(duì)列存儲(chǔ)內(nèi)存中的頁(yè)面,隊(duì)列的特點(diǎn)是先進(jìn)先出,與該算法是一致的,所以每當(dāng)發(fā)生缺頁(yè)時(shí),就從隊(duì)頭刪除一頁(yè),而從隊(duì)尾加入缺頁(yè)。或者借助輔助數(shù)組time[mSIZE]記錄物理塊中對(duì)應(yīng)頁(yè)面的進(jìn)入時(shí)間,每次需要置換時(shí)換出進(jìn)入時(shí)間最小的頁(yè)面。

  LRU基本思想:

  是用一維數(shù)組page[pSIZE]存儲(chǔ)頁(yè)面號(hào)序列,memery[mSIZE]是存儲(chǔ)裝入物理塊中的頁(yè)面。數(shù)組flag[10]標(biāo)記頁(yè)面的訪問(wèn)時(shí)間。每當(dāng)使用頁(yè)面時(shí),刷新訪問(wèn)時(shí)間。發(fā)生缺頁(yè)時(shí),就從物理塊中頁(yè)面標(biāo)記最小的一頁(yè),調(diào)出該頁(yè),換入所缺的頁(yè)面。

  三、基本思路

  實(shí)驗(yàn)環(huán)境:vc++,編程語(yǔ)言:c語(yǔ)言 #include #include /*全局變量*/

  int mSIZE; /*物理塊數(shù)*/

  int pSIZE; /*頁(yè)面號(hào)引用串個(gè)數(shù)*/

  static int memery[10]={0}; /*物理塊中的頁(yè)號(hào)*/ static int page[100]={0}; /*頁(yè)面號(hào)引用串*/ static int temp[100][10]={0}; /*輔助數(shù)組*/ /*置換算法函數(shù)*/ void FIFO(); void LRU(); void OPT(); /*輔助函數(shù)*/

  void print(unsigned int t); void designBy(); void download();

  void mDelay(unsigned int Delay); /*主函數(shù)*/ void main() {

  int i,k,code; system("color 0A"); designBy(); printf("┃請(qǐng)按任意鍵進(jìn)行初始化操作... ┃ "); printf("┗━━━━━━━━━━━━━━━━━━━━━┛ "); printf(" >>>"); getch(); system("cls"); system("color 0B"); printf("請(qǐng)輸入物理塊的個(gè)數(shù)(M<=10):"); scanf("%d",&mSIZE); printf("請(qǐng)輸入頁(yè)面號(hào)引用串的個(gè)數(shù)(P<=100):"); scanf("%d",&pSIZE); puts("請(qǐng)依次輸入頁(yè)面號(hào)引用串(連續(xù)輸入,無(wú)需隔開(kāi)):"); for(i=0;i

  scanf("%1d",&page[i]); download(); system("cls"); system("color 0E"); do{ puts("輸入的頁(yè)面號(hào)引用串為:"); for(k=0;k<=(pSIZE-1)/20;k++)

  { for(i=20*k;(i

  (i==pSIZE-1))) printf("%d ",page[i]); else printf("%d ",page[i]); } } printf("* * * * * * * * * * * * * * * * * * * * * * *"); printf("* 請(qǐng)選擇頁(yè)面置換算法: *"); printf("* ----------------------------------------- *");

  printf("* 1.先進(jìn)先出(FIFO) 2.最近最久未使用(LRU) *"); printf("* 3.最佳(OPT) 4.退出 *"); printf("* * * * * * * * * * * * * * * * * * * * * * *"); printf("請(qǐng)選擇操作:[ ]"); scanf("%d",&code); switch(code) {

  case 1:

  FIFO(); break; case 2:

  LRU(); break; case 3:

  OPT(); break; case 4: system("cls"); system("color 0A"); designBy(); /*顯示設(shè)計(jì)者信息后退出*/ printf("┃謝謝使用頁(yè)面置換算法演示器!

  ┃ "); printf("┗━━━━━━━━━━━━━━━━━━┛ "); exit(0); default: printf("輸入錯(cuò)誤,請(qǐng)重新輸入:"); } printf("按任意鍵重新選擇置換算法:>>>"); getch();

  system("cls"); }while (code!=4); getch(); }

  /*載入數(shù)據(jù)*/ void download() { int i; system("color 0D"); printf("╔════════════╗ "); printf("║正在載入數(shù)據(jù),請(qǐng)稍候 !!!║ "); printf("╚════════════╝ "); printf("Loading... "); printf(" for(i=0;i<51;i++) printf(""); for(i=0;i<50;i++) { mDelay((pSIZE+mSIZE)/2); printf(">"); } printf(" Finish. 載入成功,按任意鍵進(jìn)入置換算法選擇界面:

  >>>"); getch(); }

  /*設(shè)置延遲*/

  void mDelay(unsigned int Delay) {

  unsigned int i;

  for(;Delay>0;Delay--) { for(i=0;i<124;i++) { printf(" "); } } }

  /*顯示設(shè)計(jì)者信息*/ void designBy() { printf("┏━━━━━━━━━━━━━━━━━━━━┓ "); printf("┃ 頁(yè)面置換算法 ┃ "); printf("┃ 12級(jí)1班 ┃ ");

  O");

  printf("┃ 姓名:張海洋,李奔 ┃ "); printf("┣━━━━━━━━━━━━━━━━━━━━┫ "); }

  void print(unsigned int t) { int i,j,k,l; int flag; for(k=0;k<=(pSIZE-1)/20;k++) { for(i=20*k;(i=j) printf(" |%d|",temp[i][j]); else printf(" | |"); } for(i=mSIZE+20*k;(i

  printf("置換次數(shù):%d ",t); printf("訪問(wèn)命中率:%d%% ",(pSIZE-(t+mSIZE))*100/pSIZE); printf("---------------------------------------- "); }

  /*計(jì)算過(guò)程延遲*/ void compute() { int i; printf("正在進(jìn)行相關(guān)計(jì)算,請(qǐng)稍候"); for(i=1;i<20;i++) { mDelay(15); if(i%4==0) printf(" "); else printf("Θ"); } for(i=0;i++<30;printf("")); for(i=0;i++<30;printf(" ")); for(i=0;i++<30;printf("")); }

  /*先進(jìn)先出頁(yè)面置換算法*/ void FIFO() {

  int memery[10]={0};

  int time[10]={0}; /*記錄進(jìn)入物理塊的時(shí)間*/ int i,j,k,m;

  int max=0; /*記錄換出頁(yè)*/ int count=0; /*記錄置換次數(shù)*/ /*前mSIZE個(gè)數(shù)直接放入*/ for(i=0;i

  memery[i]=page[i]; time[i]=i;

  for(j=0;j

  for(i=mSIZE;i

  if(memery[j]!=page[i]) k++;

  }

  if(k==mSIZE) /*如果不在物理塊中*/ {

  count++; /*計(jì)算換出頁(yè)*/

  max=time[0]

  time[max]=i; /*記錄該頁(yè)進(jìn)入物理塊的時(shí)間*/ for(j=0;j

  for(j=0;j

  /*最近最久未使用置換算法*/ void LRU() {

  int memery[10]={0};

  int flag[10]={0}; /*記錄頁(yè)面的訪問(wèn)時(shí)間*/ int i,j,k,m;

  int max=0; /*記錄換出頁(yè)*/ int count=0; /*記錄置換次數(shù)*/ /*前mSIZE個(gè)數(shù)直接放入*/ for(i=0;i

  memery[i]=page[i]; flag[i]=i;

  for(j=0;j

  for(i=mSIZE;i

  if(memery[j]!=page[i]) k++; else flag[j]=i; /*刷新該頁(yè)的訪問(wèn)時(shí)間*/ }

  if(k==mSIZE) /*如果不在物理塊中*/ {

  count++; /*計(jì)算換出頁(yè)*/

  max=flag[0]

  flag[max]=i; /*記錄該頁(yè)的訪問(wèn)時(shí)間*/ for(j=0;j

  for(j=0;j

  /*最佳置換算法*/ void OPT() {

  int memery[10]={0};

  int next[10]={0}; /*記錄下一次訪問(wèn)時(shí)間*/ int i,j,k,l,m;

  int max; /*記錄換出頁(yè)*/

  int count=0; /*記錄置換次數(shù)*/ /*前mSIZE個(gè)數(shù)直接放入*/ for(i=0;i

  memery[i]=page[i]; for(j=0;j

  for(i=mSIZE;i

  /*判斷新頁(yè)面號(hào)是否在物理塊中*/ for(j=0,k=0;j

  if(memery[j]!=page[i]) k++; }

  if(k==mSIZE) /*如果不在物理塊中*/ { count++; /*得到物理快中各頁(yè)下一次訪問(wèn)時(shí)間*/ for(m=0;m=next[1]?0:1; for(m=2;mnext[max]) max=m; /*下一次訪問(wèn)時(shí)間都為pSIZE,則置換物理塊中第一個(gè) */ memery[max]=page[i]; for(j=0;j

  for(j=0;j

  四、調(diào)試及實(shí)驗(yàn)結(jié)果

  第一組數(shù)據(jù):

  1.運(yùn)行結(jié)果

  2. 按任意鍵進(jìn)行初始化:

  3. 載入數(shù)據(jù):

  4. 進(jìn)入置換算法選擇界面:

  5.運(yùn)算中延遲操作:

  6.三種算法演示結(jié)果

  7.退出算法

  第二組數(shù)據(jù):

  1.運(yùn)行結(jié)果

  2.按任意鍵進(jìn)行初始化:

  3.載入數(shù)據(jù):

  4.進(jìn)入置換算法選擇界面:

  5.運(yùn)算中延遲操作:

  6. 三種算法演示結(jié)果

  7.退出算法

  五、個(gè)人體會(huì)

  由于時(shí)間有限,本次設(shè)計(jì)完成的并不是很完美,下面從以下幾點(diǎn)來(lái)說(shuō)明本次課程設(shè)計(jì)的個(gè)人體會(huì):

  1.本次課程設(shè)計(jì)中做的比較好的地方:

  做的好的'地方就是在于對(duì)題目意思的正確理解,以及在此基礎(chǔ)上的模型設(shè)計(jì)。最開(kāi)始一看題目的時(shí)候感覺(jué)很迷茫,有點(diǎn)不知道如何著手,等靜下心來(lái)仔細(xì)分析了程序,明確了目標(biāo),明確了思路,才對(duì)程序有了一個(gè)較為完整的實(shí)現(xiàn)。

  2.做得不太好的地方,以及以后如何改正:

  做得不太好的地方就是不能把自己所學(xué)的C知識(shí)和本次課程設(shè)計(jì)的相關(guān)知識(shí)很好的結(jié)合起來(lái),以至于沒(méi)有很好的表達(dá)出本次課程設(shè)計(jì)的細(xì)節(jié)。在以后的過(guò)程中,我會(huì)運(yùn)用本次課程設(shè)計(jì)中所學(xué)的知識(shí),以及思考問(wèn)題的方式和方法,爭(zhēng)取能夠發(fā)揚(yáng)優(yōu)點(diǎn),盡量克服不細(xì)心,不嚴(yán)謹(jǐn)?shù)热秉c(diǎn)。

  3.從本次設(shè)計(jì)中得到的收獲:

  通過(guò)本次課程設(shè)計(jì),我學(xué)會(huì)了綜合運(yùn)用所學(xué)相關(guān)知識(shí)的能力,動(dòng)手能力以及獨(dú)立思考問(wèn)題的能力。下面具體的收一個(gè)邊學(xué)程序是遇到的困難,首先就是如何把想法變?yōu)樽龇ǖ膯?wèn)題,最開(kāi)始一拿到題目,我就覺(jué)得無(wú)從下手,因?yàn)槲业拈啔v,不知道如何把這樣一個(gè)問(wèn)題變成程序,變成能夠讓人一目了然的東西,于是,我就先寫(xiě)下了p,v操作的實(shí)現(xiàn)過(guò)程,因?yàn)檫@個(gè)對(duì)我來(lái)說(shuō)簡(jiǎn)單一些,然后,在此基礎(chǔ)之上,就好辦了,結(jié)果最后用了2個(gè)函數(shù)就解決問(wèn)題了,所以,我覺(jué)得有時(shí)候思考問(wèn)題不要太死腦筋,換一個(gè)角度的話,也許會(huì)更好,說(shuō)不定就能達(dá)到事半功倍的效果。