《太原理工大學(xué)操作系統(tǒng)實(shí)驗(yàn)報(bào)告.doc》由會員分享,可在線閱讀,更多相關(guān)《太原理工大學(xué)操作系統(tǒng)實(shí)驗(yàn)報(bào)告.doc(21頁珍藏版)》請?jiān)谘b配圖網(wǎng)上搜索。
課程名稱: 操作系統(tǒng)B
實(shí)驗(yàn)項(xiàng)目: 操作系統(tǒng)實(shí)驗(yàn)
實(shí)驗(yàn)地點(diǎn): 實(shí)驗(yàn)樓209
專業(yè)班級: 軟件
學(xué)生姓名: 學(xué)號:
指導(dǎo)教師: 方昀
2015 年 11 月 30
目 錄
實(shí)驗(yàn)一 幾種操作系統(tǒng)的界面 1
一、目的和要求 1
二、內(nèi)容 1
實(shí)驗(yàn)二 進(jìn)程調(diào)度程序設(shè)計(jì) 2
一、目的和要求 2
二、示例 2
實(shí)驗(yàn)三 存儲管理程序設(shè)計(jì) 9
一、目的和要求 9
二、提示 9
實(shí)驗(yàn)一 幾種操作系統(tǒng)的界面
一、目的和要求
(一) 目的
本實(shí)驗(yàn)的目的是使學(xué)生熟悉1—2種操作系統(tǒng)的界面,在熟練使用機(jī)器的基礎(chǔ)上,能了解各種操作命令和系統(tǒng)調(diào)用在系統(tǒng)中的大致工作過程。也就是通過操作系統(tǒng)的外部特征,逐步深入到操作系統(tǒng)的內(nèi)部實(shí)質(zhì)內(nèi)容中去。
(二) 要求
1. 能熟練的在1—2種操作系統(tǒng)的環(huán)境下工作,學(xué)會使用各種命令,熟悉系統(tǒng)提供的各種功能,主動而有效地使用計(jì)算機(jī)。
2. 熟悉系統(tǒng)實(shí)用程序的調(diào)用方法和各種系統(tǒng)調(diào)用模塊的功能和作用
二、內(nèi)容
在某種操作系統(tǒng)的環(huán)境下建立、修改、運(yùn)行、打印源程序和結(jié)果,最后撤消一個(gè)完整的程序。
提示:可按下述步驟進(jìn)行
1. 編寫一個(gè)完整的源程序,通過編輯命令送入機(jī)器,建立源程序文件;
2. 編譯該源文件,建立相應(yīng)的目標(biāo)文件;
3. 編譯有錯(cuò)時(shí),再用編輯命令修改源文件,消除全部詞法和語法錯(cuò)誤;
4. 連接目標(biāo)文件,形成可執(zhí)行文件;
5. 執(zhí)行該文件,得到結(jié)果;
6. 打印輸出源程序和運(yùn)行結(jié)果;
7. 撤消本次實(shí)驗(yàn)中形成的所有文件。
三、實(shí)驗(yàn)步驟及程序流程圖
1)Dos命令行。
1. 按住Windows鍵+R輸入notepad回車調(diào)出記事本。
2. 編輯一個(gè)java程序選擇另存為d:。
3. 按住Windows鍵+R輸入cmd回車。
4. 進(jìn)入Dos界面鍵入d:。
5. 輸入dir查看java文件,使用javac命令進(jìn)行編輯
四、程序清單(據(jù)情況而定)
class demo
{
public static void main(String [] args)
{
System.out.print("這是一個(gè)java例子");
}
}
五、討論、心得
本次實(shí)驗(yàn)是在Windows10系統(tǒng)下進(jìn)行的,通過對一個(gè)Java小程序的編譯連接熟悉對Win10的操作以及DOS命令的使用。
試驗(yàn)中使用到的DOS工具:
查看目錄:dir
編輯:javac
通過本次實(shí)驗(yàn),進(jìn)一步熟悉了對操作系統(tǒng)尤其是DOS 命令的使用,初步了解了部分操作命令和系統(tǒng)調(diào)用在系統(tǒng)中的大致工作過程,通過實(shí)踐也加深了對老師課堂一些所講知識的理解。
實(shí)驗(yàn)二 進(jìn)程調(diào)度程序設(shè)計(jì)
一、目的和要求
(一) 目的
進(jìn)程是操作系統(tǒng)最重要的概念之一,進(jìn)程調(diào)度是操作系統(tǒng)的主要內(nèi)容,本實(shí)驗(yàn)要求學(xué)生獨(dú)立地用高級語言編寫一個(gè)進(jìn)程調(diào)度程序,調(diào)度算法可任意選擇或自行設(shè)計(jì),本實(shí)驗(yàn)可使學(xué)生加深對進(jìn)程調(diào)度和各種調(diào)度算法的理解。
(二) 要求
1. 設(shè)計(jì)一個(gè)有幾個(gè)進(jìn)程并發(fā)執(zhí)行的進(jìn)程調(diào)度程序,每個(gè)進(jìn)程由一個(gè)進(jìn)程控制塊(PCB)表示,進(jìn)程控制塊通常應(yīng)包括下述信息:進(jìn)程名,進(jìn)程優(yōu)先數(shù),進(jìn)程需要運(yùn)行的時(shí)間,占用CPU的時(shí)間以及進(jìn)程的狀態(tài)等,且可按照調(diào)度算法的不同而增刪。
2. 調(diào)度程序應(yīng)包含2—3種不同的調(diào)度算法,運(yùn)行時(shí)可以任選一種,以利于各種方法的分析和比較。
3. 系統(tǒng)應(yīng)能顯示或打印各進(jìn)程狀態(tài)和參數(shù)的變化情況,便于觀察。
二、示例
1. 題目 本程序可選用優(yōu)先數(shù)法或簡單輪轉(zhuǎn)法對五個(gè)進(jìn)程進(jìn)行調(diào)度。每個(gè)進(jìn)程處于運(yùn)行R(run)、就緒W(wait)和完成F(finish)三種狀態(tài)之一,并假定起始狀態(tài)都是就緒狀態(tài)W。
為了便于處理,程序中進(jìn)程的運(yùn)行時(shí)間以時(shí)間片為單位計(jì)算。各進(jìn)程的優(yōu)先數(shù)或輪轉(zhuǎn)時(shí)間片數(shù)、以及進(jìn)程需要運(yùn)行的時(shí)間片數(shù),均由偽隨機(jī)數(shù)發(fā)生器產(chǎn)生。
進(jìn)程控制塊結(jié)構(gòu)如表2-1所示:
表2-1 PCB
進(jìn)程標(biāo)識符
鏈指針
優(yōu)先數(shù)/輪轉(zhuǎn)時(shí)間片數(shù)
占用CPU時(shí)間片數(shù)
進(jìn)程所需時(shí)間片數(shù)
進(jìn)程狀態(tài)
進(jìn)程控制塊鏈結(jié)構(gòu)如圖2-1所示:
RUN HEAD TAIL
…
圖2-1 進(jìn)程控制塊鏈結(jié)構(gòu)
其中:RUN—當(dāng)前運(yùn)行進(jìn)程指針;
HEAD—進(jìn)程就緒鏈鏈?zhǔn)字羔槪?
TAIL—進(jìn)程就緒鏈鏈尾指針。
2. 算法與框圖 程序框圖如圖2-2所示。
圖2-2 進(jìn)程調(diào)度框圖
(1)優(yōu)先數(shù)法。 進(jìn)程就緒鏈按優(yōu)先數(shù)大小從大到小排列,鏈?zhǔn)走M(jìn)程首先投入運(yùn)行。每過一個(gè)時(shí)間片,運(yùn)行進(jìn)程所需運(yùn)行的時(shí)間片數(shù)減1,說明它已運(yùn)行了一個(gè)時(shí)間片,優(yōu)先數(shù)也減3。理由是該進(jìn)程如果在一個(gè)時(shí)間片中完成不了,優(yōu)先級應(yīng)降低一級。接著比較現(xiàn)行進(jìn)程和就緒鏈鏈?zhǔn)走M(jìn)程的優(yōu)先數(shù),如果仍是現(xiàn)行進(jìn)程高或者相同,就讓現(xiàn)行進(jìn)程繼續(xù)運(yùn)行,否則,調(diào)度就緒鏈鏈?zhǔn)走M(jìn)程投入運(yùn)行。原運(yùn)行進(jìn)程再按其優(yōu)先數(shù)大小插入就緒鏈,且改變它們對應(yīng)的進(jìn)程狀態(tài),直至所有進(jìn)程都運(yùn)行完各自的時(shí)間片數(shù)。
(2)簡單輪轉(zhuǎn)法。 進(jìn)程就緒鏈按各進(jìn)程進(jìn)入的先后次序排列,鏈?zhǔn)走M(jìn)程首先投入運(yùn)行。進(jìn)程每次占用處理機(jī)的輪轉(zhuǎn)時(shí)間按其重要程度登入進(jìn)程控制塊中的輪轉(zhuǎn)時(shí)間片數(shù)記錄項(xiàng)(相應(yīng)于優(yōu)先數(shù)法的優(yōu)先數(shù)記錄項(xiàng)位置)。每過一個(gè)時(shí)間片,運(yùn)行進(jìn)程占用處理機(jī)的時(shí)間片數(shù)加1,然后比較占用處理機(jī)的時(shí)間片數(shù)是否與該進(jìn)程的輪轉(zhuǎn)時(shí)間片數(shù)相等,若相等說明已到達(dá)輪轉(zhuǎn)時(shí)間,應(yīng)將現(xiàn)運(yùn)行進(jìn)程排到就緒鏈末尾,調(diào)度鏈?zhǔn)走M(jìn)程占用處理機(jī),且改變它們的進(jìn)程狀態(tài),直至所有進(jìn)程完成各自的時(shí)間片。
三、代碼:
#include
#include
#define furthest 5
struct process /*PCB STRUCTURE*/
{
int id;
int priority;
int cputime;
int alltime;
char state;
int next;
}prochain[furthest - 1];
int procnum;
int rand();
int algo;
int run, head, tail, j;
void print();
void insert(int q);
void insert2();
void timesch();
void init();
void prisch();
int main() /*MAIN PROGRAM*/
{
agan: printf("type the algorithm is (1:RR,2:PRIO):");
scanf("%d", &algo);
if (algo == 2)
{
printf("output of priority.\n");
init();
prisch();
}
else
{
if (algo == 1)
{
printf("output of round robin.\n");
init();
timesch();
}
else
{
printf("try again,please\n");
goto agan;
}
}
for (j = 1; j <= 40; j++)
{
printf("=");
}
printf("\n\n");
for (j = 1; j <= 40; j++)
{
printf("=");
}
printf("\n\n");
printf("system finished\n");
getchar();
}
void print() /*PRINT THE RUNNING PROCESS,WAITING
QUEUE AND PCB SEQUENCE LIST*/
{
int k, p;
for (k = 1; k <= 40; k++)
printf("=");
printf("\nrunning proc. ");
printf("waiting queue.");
printf("\n %d ", prochain[run].id);
p = head;
while (p != 0)
{
printf("%5d", p);
p = prochain[p].next;
}
printf("\n");
for (k = 1; k <= 40; k++)
printf("=");
printf("\n");
printf(" id ");
for (k = 1; k
#include
#include
using namespace std;
struct pageTable//定義頁表
{
int address;//地址
int page;//頁號
int block;//塊號
struct pageTable *next;
};
typedef struct pageTable PAGETABLE;
PAGETABLE *pt;
const int first_memory = 1000;//內(nèi)存首地址
int work[320];//作業(yè)
int index, offset;//index是作業(yè)的頁號,offset為頁內(nèi)偏移地址
PAGETABLE*oldPtr;//minPtr指向駐留時(shí)間最久的頁
int count1;//記數(shù)器,用于記錄發(fā)生的缺頁數(shù)
bool is_LRU = false;//是否是LRU算法
void init();
void insertPage();
void pushback_Page(PAGETABLE *, PAGETABLE *);
void print(PAGETABLE *);
void run(int);
void find_FIFO();
void find_LRU();
void main(void)
{
int i = 0;
while (1)
{
cout << "\nPlease select a number(1,2,0)" << endl;
cout << " 1--先進(jìn)先出算法(FIFO)" << endl;
cout << " 2--最久未使用算法(LRU)" << endl;
cout << " 0--程序結(jié)束" << endl;
cin >> i;
if (i == 1)
{
cout << "\nThis is a example for FIFO:" << endl;
is_LRU = false;
init();//構(gòu)造頁表和內(nèi)存
}
else if (i == 2)
{
cout << "\nThis is a example for LRU:" << endl;
is_LRU = true;
init();//構(gòu)造頁表和內(nèi)存
}
else if (i == 0)
{
exit(1);
}
}
}
void init()
{
double rate;
int count = 0;//記數(shù)器初值為0
srand(time(NULL));
pt = new PAGETABLE;
pt->next = NULL;
for (int i = 0; i<4; i++)
{
insertPage();
}
oldPtr = pt->next;//初始化最久的頁面
cout << "頁表初始狀態(tài)為:" << endl;
print(pt);
for (int k = 0; k<320; k++)//初始化作業(yè)
{
work[k] = k;
}
for (int f = 0; f<53; f++)//作業(yè)運(yùn)行
{
int m, m1, m2;
m = rand() % 320;
if (m == 319)
m = 318;
run(m);
print(pt);
run(m + 1);
print(pt);
if (m == 0)
m1 = 0;
else
m1 = rand() % m;
run(m1);
print(pt);
run(m1 + 1);
print(pt);
m2 = rand() % (320 - m) + m - 1;
if (m2<0)
m2 = 318;
if (m2 == 319)
m2 = 318;
run(m2);
print(pt);
run(m2 + 1);
print(pt);
}
rate = (double)count / 318 * 100;
cout << "\n\n 缺頁率為:" << rate << "%" << endl;
}
/* 構(gòu)建頁表*/
void insertPage()
{
PAGETABLE *newPage;
static int id = 99;
static int blockId = -1;
id++;
blockId++;
if (blockId == 4)
blockId = 0;
newPage = (PAGETABLE *)malloc(sizeof(PAGETABLE));
if (newPage != NULL)
{
newPage->address = id;
newPage->page = -1;
newPage->block = blockId;
newPage->next = NULL;
pushback_Page(pt, newPage);
}
else
cout << "沒有內(nèi)存足夠的空間為頁表分配!" << endl;
}
void pushback_Page(PAGETABLE *queue, PAGETABLE *item)
{
PAGETABLE *previous, *current;
previous = queue;
current = queue->next;
while (current != NULL)
{
previous = current;
current = current->next;
}
previous->next = item;
}
void print(PAGETABLE *ptr)
{
PAGETABLE *temp;
temp = ptr->next;
cout << " 頁號 " << " 塊號 " << endl;
while (temp != NULL)
{
cout << " " << temp->page << " " << temp->block << endl;
temp = temp->next;
}
}
void run(int num)
{
int universal;
PAGETABLE *previous, *current;
index = work[num] / 10;//程序所在的頁號
offset = work[num] % 10;//頁內(nèi)的位移量
previous = pt;
current = previous->next;
while (current != NULL && current->page != index)
{
previous = current;
current = current->next;
}
if (current == NULL)
{
cout << "\n作業(yè)" << num << "沒有在內(nèi)存,發(fā)生缺頁中斷" << endl;
count1++;
if (is_LRU == false)//FIFO算法
{
find_FIFO();
}
else//LRU算法
{
find_LRU();
}
}
else
{
if (is_LRU == false)//FIFO算法
{
universal = first_memory + (current->block) * 10 + offset;
cout << "\n作業(yè)" << num << "所在內(nèi)存的物理地址為 " << universal << endl;
}
else
{
if (current->next == NULL)
{
universal = first_memory + (current->block) * 10 + offset;
cout << "\n作業(yè)" << num << "所在內(nèi)存的物理地址為 " << universal << endl;
}
else
{
PAGETABLE *temp, *ptr;
temp = current;
previous->next = current->next;
ptr = pt->next;
while (ptr->next != NULL)
{
ptr = ptr->next;
}
ptr->next = temp;
temp->next = NULL;
universal = first_memory + (temp->block) * 10 + offset;
cout << "\n作業(yè)" << num << "所在內(nèi)存的物理地址為 " << universal << endl;
}
}
}
}
void find_FIFO()//先進(jìn)先出頁面置換算法
{
PAGETABLE *pos;
int universal;
pos = pt->next;
if (oldPtr == NULL)
{
oldPtr = pt->next;
}
while (pos != NULL && pos->page != -1)
{
pos = pos->next;
}
if (pos == NULL)//出現(xiàn)缺頁中斷
{
cout << "******頁面開始置換******" << endl;
oldPtr->page = index;
universal = first_memory + (oldPtr->block) * 10 + offset;
cout << "置換后作業(yè)在內(nèi)存的物理地址為 " << universal << endl;
oldPtr = oldPtr->next;
}
else//頁面還未裝完
{
pos->page = index;
universal = first_memory + (pos->block) * 10 + offset;
cout << "作業(yè)在內(nèi)存的物理地址為 " << universal << endl;
}
}
void find_LRU()//最久置換算法
{
PAGETABLE *pos;
int universal;
pos = pt->next;
while (pos != NULL && pos->page != -1)
{
pos = pos->next;
}
if (pos == NULL)//出現(xiàn)缺頁中斷
{
cout << "******頁面開始置換******" << endl;
PAGETABLE *temp;
temp = pt->next;
temp->page = index;
universal = first_memory + (temp->block) * 10 + offset;
cout << "置換后作業(yè)在內(nèi)存的物理地址為 " << universal << endl;
}
else//頁面還未裝完
{
pos->page = index;
universal = first_memory + (pos->block) * 10 + offset;
cout << "作業(yè)在內(nèi)存的物理地址為 " << universal << endl;
}
}
四、結(jié)果:
五、心得
本次試驗(yàn)的目的是通過請求頁式存儲管理中頁面置換算法的模擬設(shè)計(jì),來了解虛擬存儲技術(shù)的特點(diǎn),掌握請求頁式存儲管理的頁面置換算法。試驗(yàn)中主要使用了FIFO算法,即總是先淘汰最先進(jìn)入內(nèi)存的頁面(駐留最久的頁面),實(shí)現(xiàn)時(shí)只需要把一個(gè)進(jìn)程也調(diào)入內(nèi)存的頁面按先后次序鏈接成一個(gè)隊(duì)列,并設(shè)置一個(gè)指針,總是指向最老的頁面。
FIFO的主要的缺點(diǎn)是沒有考慮到有的頁面會經(jīng)常被訪問,因此并沒有辦法保證這種頁面能夠保留在內(nèi)存中,可能使得利用率較低。
通過本次試驗(yàn)加深了對相應(yīng)算法的理解,鞏固了相關(guān)的知識和使用的方法。
鏈接地址:http://m.appdesigncorp.com/p-6523448.html