胥帅4100407操作系统实验报告 - 图文

更新时间:2024-04-15 01:44:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

计算机操作系统 实验报告 学 号: 姓 名: 提交日期: 成 绩: 4100407 胥帅 2012-11-13 东北大学秦皇岛分校 操作系统实验报告

目 录

实验一 进程的创建和控制---------------------------------------3 实验二 使用动态优先权的进程调度算法模拟-----------------------8 实验三 使用动态分区分配方式的模拟-----------------------------17 实验四 请求调页存储管理方式的模拟-----------------------------26 *实验总结-----------------------------------------------------35

- 2 -

操作系统实验报告

【实验名称】实验一 进程的创建和控制

【实验目的】通过进程的创建、撤销和运行加深对进程概念和进程并发执行的理解,明确进程与程序之间的

区别。

【实验内容】

(1)了解系统调用fork()、exec()、exit()、和waitpid()的功能和实现过程。

(2)编写一段程序,使用系统调用fork()来创建两个子进程,并由父进程重复显示字符串“parent:”和自己的标识数,而子进程则重复显示字符串“child:”和自己的标识数。

(3)编写一段程序,使用系统调用fork()来创建一个子进程。紫禁城通过系统调用exec()更换自己的执行代码,显示新的代码“new program.”后,调用exit()结束。而父进程则调用waitpid()等待子进程结束,并在子进程结束后显示子进程的标示符,然后正常结束。 实验代码如下:

(1)#include #include #include

int main() {

int pid1, pid2;

if((pid1=fork())==-1) {

printf(\ exit(1); } else {

if(pid1==0)

printf(\ else {

if((pid2=fork())==-1) {

printf(\ exit(1); } else {

if(pid2==0)

printf(\ else

printf(\ } } }

- 3 -

操作系统实验报告 return 0; } 在linux Redhat9.0中编译: - 4 - 操作系统实验报告

运行结果为:

(2)#include

#include #include #include #include

int main() {

pid_t pid; pid=fork();

if(pid<0)

printf(\ else if(pid==0)//子进程

{

if(execl(\ perror(\ exit(1); }

else//父进程

{

sleep(10);

- 5 -

操作系统实验报告 pid=waitpid(-1,NULL,0); printf(\ } return 0; } 在linux Redhat中编译链接: 运行结果为: - 6 - 操作系统实验报告 实验一到此结束 - 7 - 操作系统实验报告 【实验名称】实验二 使用动态优先权的进程调度算法模拟 【实验目的】通过动态优先权算法的模拟加深对进程概念进程调度过程的理解。 【实验内容】 (1) 用C语言来实现对N个进程采用动态优先权优先算法的进程调度。 (2) 每个用来标识进程的进程控制块PCB用结构来描述,包括以下字段: ???? 进程标识数 ID。 ???? 进程优先数 PRIORITY,并规定优先数越大的进程,其优先权越高。 ???? 进程已占用的CPU时间CPUTIME。 ???? 进程还需占用的CPU时间ALLTIME。当进程运行完毕时,ALLTIME变为0。???? 进程的阻塞时间STARTBLOCK,表示当进程再运行STARTBLOCK个时间片后,将进入阻塞状态。 ???? 进程被阻塞的时间BLOCKTIME,表示已足赛的进程再等待BLOCKTIME个时间片后,将转换成就绪状态。 ???? 进程状态START。 ???? 队列指针NEXT,用来将PCB排成队列。 (3) 优先数改变的原则: ???进程在就绪队列中呆一个时间片,优先数加1。 ???进程每运行一个时间片,优先数减3。 (4) 假设在调度前,系统中有5个进程,它们的初始状态如下: ID 0 1 2 3 4 PRIORITY 9 38 30 29 0 CPUTIME 0 0 0 0 0 ALLTIME 3 3 6 3 4 STARTBLO2 -1 -1 -1 -1 CK BLOCKTIM3 0 0 0 0 E STATE READY READY READY READY READY (5) 为了清楚的观察各进程的调度过程,程序应将每个时间片内的情况显示出来,参照的具体格式如下: RUNNING PROG:i READY-QUEUE:-〉id1-〉id2 BLOCK-QUEUE:-〉id3-〉id4 = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = == = = ID 0 1 2 3 4 PRIORITY P0 P1 P2 P3 P4 CUPTIME C0 C1 C2 C3 C4 ALLTIME A0 A1 A2 A3 A4 STARTBLOCK T0 T1 T2 T3 T4 BLOCKTIME B0 B1 B2 B3 B4 STATE S0 S1 S2 S3 S4 实验代码如下: #include - 8 - 操作系统实验报告 #include void main() { int ID[5]={0,1,2,3,4}; int PRIORITY[5]={9,38,30,29,0}; int CPUTIME[5]={0,0,0,0,0}; int ALLTIME[5]={3,3,6,3,4}; int STARTBLOCK[5]={2,-1,-1,-1,-1}; int BLOCKTIME[5]={3,0,0,0,0}; int str[5];//1=READY,0=BLOCK,-1=END int max5(int PRIORITY50,int PRIORITY51,int PRIORITY52,int PRIORITY53,int PRIORITY54); int max4(int PRIORITY40,int PRIORITY41,int PRIORITY42,int PRIORITY43); int max3(int PRIORITY30,int PRIORITY31,int PRIORITY32); int max2(int PRIORITY20,int PRIORITY21); int i=1,a,b0,b1,b2,b3,b4,c0,c1,c2,c3,c4; //=================================================================== if(max5(ALLTIME[0],ALLTIME[1],ALLTIME[2],ALLTIME[3],ALLTIME[4])>0) { for(;max5(ALLTIME[0],ALLTIME[1],ALLTIME[2],ALLTIME[3],ALLTIME[4])>0;) { if(ALLTIME[0]>0||ALLTIME[1]>0||ALLTIME[2]>0||ALLTIME[3]>0||ALLTIME[4]>0) a=max5(PRIORITY[0],PRIORITY[1],PRIORITY[2],PRIORITY[3],PRIORITY[4]); else if(ALLTIME[0]==0||ALLTIME[1]>0||ALLTIME[2]>0||ALLTIME[3]>0||ALLTIME[4]>0) a=max4(PRIORITY[1],PRIORITY[2],PRIORITY[3],PRIORITY[4]); else if(ALLTIME[0]>0||ALLTIME[1]==0||ALLTIME[2]>0||ALLTIME[3]>0||ALLTIME[4]>0) a=max4(PRIORITY[0],PRIORITY[2],PRIORITY[3],PRIORITY[4]); else if(ALLTIME[0]>0||ALLTIME[1]>0||ALLTIME[2]==0||ALLTIME[3]>0||ALLTIME[4]>0) a=max4(PRIORITY[0],PRIORITY[1],PRIORITY[3],PRIORITY[4]); else if(ALLTIME[0]>0||ALLTIME[1]>0||ALLTIME[2]>0||ALLTIME[3]==0||ALLTIME[4]>0) a=max4(PRIORITY[0],PRIORITY[1],PRIORITY[2],PRIORITY[4]); else if(ALLTIME[0]>0||ALLTIME[1]>0||ALLTIME[2]>0||ALLTIME[3]>0||ALLTIME[4]==0) a=max4(PRIORITY[0],PRIORITY[1],PRIORITY[2],PRIORITY[3]); //=================================================================== else if(ALLTIME[0]==0||ALLTIME[1]==0||ALLTIME[2]>0||ALLTIME[3]>0||ALLTIME[4]>0) a=max3(PRIORITY[2],PRIORITY[3],PRIORITY[4]); else if(ALLTIME[0]==0||ALLTIME[1]>0||ALLTIME[2]==0||ALLTIME[3]>0||ALLTIME[4]>0) a=max3(PRIORITY[1],PRIORITY[3],PRIORITY[4]); else if(ALLTIME[0]==0||ALLTIME[1]>0||ALLTIME[2]>0||ALLTIME[3]==0||ALLTIME[4]>0) a=max3(PRIORITY[1],PRIORITY[2],PRIORITY[4]); else if(ALLTIME[0]==0||ALLTIME[1]>0||ALLTIME[2]>0||ALLTIME[3]>0||ALLTIME[4]==0) a=max3(PRIORITY[1],PRIORITY[2],PRIORITY[3]); else if(ALLTIME[0]>0||ALLTIME[1]==0||ALLTIME[2]==0||ALLTIME[3]>0||ALLTIME[4]>0) a=max3(PRIORITY[0],PRIORITY[3],PRIORITY[4]); else if(ALLTIME[0]>0||ALLTIME[1]==0||ALLTIME[2]>0||ALLTIME[3]==0||ALLTIME[4]>0) a=max3(PRIORITY[0],PRIORITY[2],PRIORITY[4]); else if(ALLTIME[0]>0||ALLTIME[1]==0||ALLTIME[2]>0||ALLTIME[3]>0||ALLTIME[4]==0) - 9 - 操作系统实验报告 a=max3(PRIORITY[0],PRIORITY[2],PRIORITY[3]); else if(ALLTIME[0]>0||ALLTIME[1]>0||ALLTIME[2]==0||ALLTIME[3]==0||ALLTIME[4]>0) a=max3(PRIORITY[0],PRIORITY[1],PRIORITY[4]); else if(ALLTIME[0]>0||ALLTIME[1]>0||ALLTIME[2]==0||ALLTIME[3]>0||ALLTIME[4]==0) a=max3(PRIORITY[0],PRIORITY[1],PRIORITY[3]); else if(ALLTIME[0]>0||ALLTIME[1]>0||ALLTIME[2]>0||ALLTIME[3]==0||ALLTIME[4]==0) a=max3(PRIORITY[0],PRIORITY[1],PRIORITY[2]); //==================================================================== else if(ALLTIME[0]==0||ALLTIME[1]==0||ALLTIME[2]==0||ALLTIME[3]>0||ALLTIME[4]>0) a=max2(PRIORITY[3],PRIORITY[4]); else if(ALLTIME[0]==0||ALLTIME[1]==0||ALLTIME[2]>0||ALLTIME[3]==0||ALLTIME[4]>0) a=max2(PRIORITY[2],PRIORITY[4]); else if(ALLTIME[0]==0||ALLTIME[1]==0||ALLTIME[2]>0||ALLTIME[3]>0||ALLTIME[4]==0) a=max2(PRIORITY[2],PRIORITY[3]); else if(ALLTIME[0]==0||ALLTIME[1]>0||ALLTIME[2]==0||ALLTIME[3]==0||ALLTIME[4]>0) a=max2(PRIORITY[1],PRIORITY[4]); else if(ALLTIME[0]==0||ALLTIME[1]>0||ALLTIME[2]==0||ALLTIME[3]>0||ALLTIME[4]==0) a=max2(PRIORITY[1],PRIORITY[3]); else if(ALLTIME[0]>0||ALLTIME[1]==0||ALLTIME[2]==0||ALLTIME[3]==0||ALLTIME[4]>0) a=max2(PRIORITY[0],PRIORITY[4]); else if(ALLTIME[0]>0||ALLTIME[1]==0||ALLTIME[2]==0||ALLTIME[3]>0||ALLTIME[4]==0) a=max2(PRIORITY[0],PRIORITY[3]); else if(ALLTIME[0]==0||ALLTIME[1]>0||ALLTIME[2]>0||ALLTIME[3]==0||ALLTIME[4]==0) a=max2(PRIORITY[1],PRIORITY[2]); else if(ALLTIME[0]>0||ALLTIME[1]==0||ALLTIME[2]>0||ALLTIME[3]==0||ALLTIME[4]==0) a=max2(PRIORITY[0],PRIORITY[2]); else if(ALLTIME[0]>0||ALLTIME[1]>0||ALLTIME[2]==0||ALLTIME[3]==0||ALLTIME[4]==0) a=max2(PRIORITY[0],PRIORITY[1]); //==================================================================== else if(ALLTIME[0]>0||ALLTIME[1]==0||ALLTIME[2]==0||ALLTIME[3]==0||ALLTIME[4]==0) a=PRIORITY[0]; else if(ALLTIME[0]==0||ALLTIME[1]>0||ALLTIME[2]==0||ALLTIME[3]==0||ALLTIME[4]==0) a=PRIORITY[1]; else if(ALLTIME[0]==0||ALLTIME[1]==0||ALLTIME[2]>0||ALLTIME[3]==0||ALLTIME[4]==0) a=PRIORITY[2]; else if(ALLTIME[0]==0||ALLTIME[1]==0||ALLTIME[2]==0||ALLTIME[3]>0||ALLTIME[4]==0) a=PRIORITY[3]; else if(ALLTIME[0]==0||ALLTIME[1]==0||ALLTIME[2]==0||ALLTIME[3]==0||ALLTIME[4]>0) a=PRIORITY[4]; //=================================================================== if(a==PRIORITY[0]) { i=0; PRIORITY[0]-=3; - 10 -

操作系统实验报告 PRIORITY[3]+=1;PRIORITY[1]+=1;PRIORITY[2]+=1;PRIORITY[4]+=1; CPUTIME[0]+=1; ALLTIME[0]-=1; STARTBLOCK[0]-=1; STARTBLOCK[3]-=1;STARTBLOCK[1]-=1;STARTBLOCK[2]-=1;STARTBLOCK[4]-=1; BLOCKTIME[3]-=1;BLOCKTIME[1]-=1;BLOCKTIME[2]-=1;BLOCKTIME[4]-=1; } else if(a==PRIORITY[1]) { i=1; PRIORITY[1]-=3; PRIORITY[0]+=1;PRIORITY[2]+=1;PRIORITY[3]+=1;PRIORITY[4]+=1; CPUTIME[1]+=1; ALLTIME[1]-=1; STARTBLOCK[1]-=1; STARTBLOCK[0]-=1;STARTBLOCK[3]-=1;STARTBLOCK[2]-=1;STARTBLOCK[4]-=1; BLOCKTIME[0]-=1;BLOCKTIME[3]-=1;BLOCKTIME[2]-=1;BLOCKTIME[4]-=1; } else if(a==PRIORITY[2]) { i=2; PRIORITY[2]-=3; PRIORITY[0]+=1;PRIORITY[1]+=1;PRIORITY[3]+=1;PRIORITY[4]+=1; CPUTIME[2]+=1; ALLTIME[2]-=1; STARTBLOCK[2]-=1; STARTBLOCK[0]-=1;STARTBLOCK[1]-=1;STARTBLOCK[3]-=1;STARTBLOCK[4]-=1; BLOCKTIME[0]-=1;BLOCKTIME[1]-=1;BLOCKTIME[3]-=1;BLOCKTIME[4]-=1; } else if(a==PRIORITY[3]) { i=3; PRIORITY[3]-=3; PRIORITY[0]+=1;PRIORITY[1]+=1;PRIORITY[2]+=1;PRIORITY[4]+=1; CPUTIME[3]+=1; ALLTIME[3]-=1; STARTBLOCK[3]-=1; STARTBLOCK[0]-=1;STARTBLOCK[1]-=1;STARTBLOCK[2]-=1;STARTBLOCK[4]-=1; BLOCKTIME[0]-=1;BLOCKTIME[1]-=1;BLOCKTIME[2]-=1;BLOCKTIME[4]-=1; } else if(a==PRIORITY[4]) { i=4; PRIORITY[4]-=3; PRIORITY[0]+=1;PRIORITY[1]+=1;PRIORITY[2]+=1;PRIORITY[3]+=1; CPUTIME[4]+=1; - 11 - 操作系统实验报告 ALLTIME[4]-=1; STARTBLOCK[4]-=1; STARTBLOCK[0]-=1;STARTBLOCK[1]-=1;STARTBLOCK[2]-=1;STARTBLOCK[3]-=1; BLOCKTIME[0]-=1;BLOCKTIME[1]-=1;BLOCKTIME[2]-=1;BLOCKTIME[3]-=1; } if(BLOCKTIME[0]==-1) BLOCKTIME[0]=0; if(BLOCKTIME[1]==-1) BLOCKTIME[1]=0; if(BLOCKTIME[2]==-1) BLOCKTIME[2]=0; if(BLOCKTIME[3]==-1) BLOCKTIME[3]=0; if(BLOCKTIME[4]==-1) BLOCKTIME[4]=0; if(BLOCKTIME[0]>0) str[0]=0; else if(BLOCKTIME[0]<=0) str[0]=1; else if(ALLTIME[0]<=0) str[0]=-1; if(BLOCKTIME[1]>0) str[1]=0; else if(BLOCKTIME[1]<=0) str[1]=1; else if(ALLTIME[1]<=0) str[1]=-1; if(BLOCKTIME[2]>0) str[2]=0; else if(BLOCKTIME[2]<=0) str[2]=1; else if(ALLTIME[2]<=0) str[2]=-1; if(BLOCKTIME[3]>0) str[3]=0; else if(BLOCKTIME[3]<=0) str[3]=1; else if(ALLTIME[3]<=0) - 12 - 操作系统实验报告 str[3]=-1; if(BLOCKTIME[4]>0) str[4]=0; else if(BLOCKTIME[4]<=0) str[4]=1; else if(ALLTIME[4]<=0) str[4]=-1; //==================================================================== if(ALLTIME[0]<=0) { PRIORITY[0]=0; ALLTIME[0]=0; STARTBLOCK[0]=-1; BLOCKTIME[0]=0; } if(ALLTIME[1]<=0) { PRIORITY[1]=0; ALLTIME[1]=0; STARTBLOCK[1]=-1; BLOCKTIME[1]=0; } if(ALLTIME[2]<=0) { PRIORITY[2]=0; ALLTIME[2]=0; STARTBLOCK[2]=-1; BLOCKTIME[2]=0; } if(ALLTIME[3]<=0) { PRIORITY[3]=0; ALLTIME[3]=0; STARTBLOCK[3]=-1; BLOCKTIME[3]=0; } if(ALLTIME[4]<=0) { PRIORITY[4]=0; ALLTIME[4]=0; STARTBLOCK[4]=-1; BLOCKTIME[4]=0; } //==================================================================== - 13 - 操作系统实验报告 if(STARTBLOCK[0]==-2) STARTBLOCK[0]=-1; if(STARTBLOCK[1]==-2) STARTBLOCK[1]=-1; if(STARTBLOCK[2]==-2) STARTBLOCK[2]=-1; if(STARTBLOCK[3]==-2) STARTBLOCK[3]=-1; if(STARTBLOCK[4]==-2) STARTBLOCK[4]=-1; //=================================================================== //=================================================================== printf(\//printf(\//printf(\printf(\printf(\printf(\4]); printf(\; printf(\printf(\LOCK[3],STARTBLOCK[4]); printf(\3],BLOCKTIME[4]); printf(\printf(\} } else printf(\} //=================================================================== int max5(int PRIORITY50,int PRIORITY51,int PRIORITY52,int PRIORITY53,int PRIORITY54) { int PRIORITY_max; if(PRIORITY50>PRIORITY51) PRIORITY_max=PRIORITY50; else PRIORITY_max=PRIORITY51; if(PRIORITY52>PRIORITY_max) PRIORITY_max=PRIORITY52; else if(PRIORITY53>PRIORITY_max) PRIORITY_max=PRIORITY53; - 14 - 操作系统实验报告 else if(PRIORITY54>PRIORITY_max) PRIORITY_max=PRIORITY54; else PRIORITY_max=PRIORITY_max; return(PRIORITY_max); } int max4(int PRIORITY40,int PRIORITY41,int PRIORITY42,int PRIORITY43) { int PRIORITY_max; if(PRIORITY40>PRIORITY41) PRIORITY_max=PRIORITY40; else PRIORITY_max=PRIORITY41; if(PRIORITY42>PRIORITY_max) PRIORITY_max=PRIORITY42; else if(PRIORITY43>PRIORITY_max) PRIORITY_max=PRIORITY43; else PRIORITY_max=PRIORITY_max; return(PRIORITY_max); } int max3(int PRIORITY30,int PRIORITY31,int PRIORITY32) { int PRIORITY_max; if(PRIORITY30>PRIORITY31) PRIORITY_max=PRIORITY30; else PRIORITY_max=PRIORITY31; if(PRIORITY32>PRIORITY_max) PRIORITY_max=PRIORITY32; else PRIORITY_max=PRIORITY_max; return(PRIORITY_max); } int max2(int PRIORITY20,int PRIORITY21) { int PRIORITY_max; if(PRIORITY20>PRIORITY21) PRIORITY_max=PRIORITY20; else PRIORITY_max=PRIORITY21; return(PRIORITY_max); }// 将代码用VC++6.0编译链接: - 15 -

操作系统实验报告 运行结果如下: 实验二到此结束 - 16 - 操作系统实验报告 【实验名称】实验三 使用动态分区分配方式的模拟 【实验目的】了解动态分区分配方式中使用的数据结构和分配算法,并进一步加深对动态分区存储管理方式及其实现过程的理解。 【实验内容】 (1) 用C语言分别实现采用首次适应算法和最佳适应算法的动态分区分配过程alloc( )和回收过程free( )。其中,空闲分区通过空闲分区链来管理:在进行内存分配时,系统优先使用空闲区低端的空间。 (2) 假设初始状态下,可用的内存空间为640KB,并有下列的请求序列: ?作业1申请130KB。 ?作业2申请60KB。 ?作业3申请100KB。 ?作业2释放60KB。 ?作业4申请200KB。 ?作业3释放100KB。 ?作业1释放130KB。 ?作业5申请140KB。 ?作业6申请60KB。 ?作业7申请50KB。 ?作业6释放60KB。 请分别采用首次适应算法和最佳适应算法,对内存块进行分配和回收,要求每次分配和回收后显示出空闲分区链的情况。 实验代码如下: #include #include #define Free 0 //空闲状态 #define Busy 1 //已用状态 #define OK 1 //完成 #define ERROR 0 //出错 #define MAX_length 640 //最大内存空间为640KB typedef int Status; int flag; typedef struct freearea//定义一个空闲区说明表结构 { int ID; long size; //分区大小 long address; //分区地址 int state; //状态 }ElemType; // 线性表的双向链表存储结构 typedef struct DuLNode { ElemType data; - 17 - 操作系统实验报告 struct DuLNode *prior; //前趋指针 struct DuLNode *next; //后继指针 } DuLNode,*DuLinkList; DuLinkList block_first; //头结点 DuLinkList block_last; //尾结点 Status alloc(int);//内存分配 Status free(int); //内存回收 Status First_fit(int);//首次适应算法 Status Best_fit(int); //最佳适应算法 void show();//查看分配 Status Initblock();//开创空间表 Status Initblock()//开创带头结点的内存空间链表 { block_first=(DuLinkList)malloc(sizeof(DuLNode)); block_last=(DuLinkList)malloc(sizeof(DuLNode)); block_first->prior=NULL; block_first->next=block_last; block_last->prior=block_first; block_last->next=NULL; block_last->data.address=0; block_last->data.size=MAX_length; block_last->data.state=Free; return OK; } //分配主存 Status alloc(int ch) { int request = 0; cout<<\请输入需要分配的主存大小(单位:KB):\ cin>>request; if(request<0 ||request==0) { cout<<\分配大小不合适,请重试!\ return ERROR; } if(ch==2) //选择最佳适应算法 { if(Best_fit(request)==OK) cout<<\分配成功!\ else cout<<\内存不足,分配失败!\ return OK; } - 18 - 操作系统实验报告 else //默认首次适应算法 { if(First_fit(request)==OK) cout<<\分配成功!\ else cout<<\内存不足,分配失败!\ return OK; } } //首次适应算法 Status First_fit(int request) { //为申请作业开辟新空间且初始化 DuLinkList temp=(DuLinkList)malloc(sizeof(DuLNode)); temp->data.size=request; temp->data.state=Busy; DuLNode *p=block_first->next; while(p) { if(p->data.state==Free && p->data.size==request) {//有大小恰好合适的空闲块 p->data.state=Busy; return OK; break; } if(p->data.state==Free && p->data.size>request) {//有空闲块能满足需求且有剩余 temp->prior=p->prior; temp->next=p; temp->data.address=p->data.address; p->prior->next=temp; p->prior=temp; p->data.address=temp->data.address+temp->data.size; p->data.size-=request; return OK; break; } p=p->next; } return ERROR; } //交换节点 void swap(DuLNode*p,DuLNode*q){ DuLNode*temp=(DuLNode*)malloc(sizeof(DuLNode)); temp->data.address=p->data.address; temp->data.size=p->data.size; - 19 - 操作系统实验报告 temp->data.state=p->data.state; temp->data.ID=p->data.ID; temp->prior=p->prior; temp->next=p->next; p->data.address=q->data.address; p->data.size=q->data.size; p->data.state=q->data.state; p->data.ID=q->data.ID; p->prior=q->prior; p->next=q->next; q->data.address=temp->data.address; q->data.size=temp->data.size; q->data.state=temp->data.state; q->data.ID=temp->data.ID; q->prior=temp->prior; q->next=temp->next; } //按照每个区块的大小排序 void sortDuLnode(DuLNode* p){ DuLNode*temp=(DuLNode*)malloc(sizeof(DuLNode)); p=p->next; //从第一个节点开始按照每个区块从小到大排序 while(p&&p->next){ temp=p->next; //temp从第p的下个节点开始 while(temp){ if(temp->data.sizedata.size){ //swap swap(temp,p); } temp=temp->next; } p=p->next; } } //最佳适应算法 Status Best_fit(int request) { int ch; //记录最小剩余空间 DuLinkList temp=(DuLinkList)malloc(sizeof(DuLNode)); temp->data.size=request; temp->data.state=Busy; DuLNode *p=block_first->next; - 20 -

操作系统实验报告 DuLNode *q=NULL; //记录最佳插入位置 while(p) //初始化最小空间和最佳位置 { if(p->data.state==Free && (p->data.size>=request) ) { if(q==NULL) { q=p; ch=p->data.size-request; } else if(q->data.size > p->data.size) { q=p; ch=p->data.size-request; } } p=p->next; } if(q==NULL) return ERROR;//没有找到空闲块 else if(q->data.size==request) { q->data.state=Busy; return OK; } else { temp->prior=q->prior; temp->next=q; temp->data.address=q->data.address; q->prior->next=temp; q->prior=temp; q->data.address+=request; q->data.size=ch; return OK; } return OK; } //主存回收 Status free(int flag) { DuLNode *p=block_first; for(int i= 0; i <= flag; i++) - 21 - 操作系统实验报告 if(p!=NULL) p=p->next; else return ERROR; p->data.state=Free; if(p->prior!=block_first && p->prior->data.state==Free)//与前面的空闲块相连 { p->prior->data.size+=p->data.size; p->prior->next=p->next; p->next->prior=p->prior; p=p->prior; } if(p->next!=block_last && p->next->data.state==Free)//与后面的空闲块相连 { p->data.size+=p->next->data.size; p->next->next->prior=p; p->next=p->next->next; } if(p->next==block_last && p->next->data.state==Free)//与最后的空闲块相连 { p->data.size+=p->next->data.size; p->next=NULL; } return OK; } //显示主存分配情况 void show() { int flag = 0; cout<<\主存分配情况:\\n\ cout<<\ DuLNode *p=block_first->next; cout<<\分区号\\t起始地址\\t分区大小\\t状态\\n\\n\ while(p) { cout<<\ \ cout<<\ \ cout<<\ if(p->data.state==Free) cout<<\空闲\\n\\n\ else cout<<\已分配\\n\\n\ p=p->next; } cout<<\ - 22 - 操作系统实验报告 } //主函数 void main() { int ch;//算法选择标记 cout<<\请输入所使用的内存分配算法:\\n\ cout<<\首次适应算法\\n(2)最佳适应算法\\n\ cin>>ch; while(ch<1||ch>3) { cout<<\输入错误,请重新输入所使用的内存分配算法:\\n\ cin>>ch; } Initblock(); //开创空间表 int choice; //操作选择标记 while(1) { show(); cout<<\请输入您的操作:\ cout<<\分配内存\\n2: 回收内存\\n0: 退出\\n\ cin>>choice; if(choice==1) alloc(ch); // 分配内存 else if(choice==2) // 内存回收 { int flag; cout<<\请输入您要释放的分区号:\ cin>>flag; free(flag); } else if(choice==0) break; //退出 else //输入操作有误 { cout<<\输入有误,请重试!\ continue; } } } 用VC++6.0编译连接: - 23 - 操作系统实验报告 运行结果如图: ①选择使用的分配算法 ②分配内存的情况 - 24 - 操作系统实验报告 ③回收内存的情况 实验三到此结束 - 25 -

操作系统实验报告 【实验名称】实验四 请求调页存储管理方式的模拟 【实验目的】通过对页面、页表、地址转换和页面置换过程的模拟,加深对请求调页系统的原理和实现过程的理解。 【实验内容】 (1) 假设每个页面中可存放10条指令,分配给一作业的内存块数为4。 (2) 用C语言模拟一作业的执行过程。该作业共有320条指令,即它的地址空间为32页,目前它的所有页都还未调入内存。在模拟过程中,如果所访问的指令已经在内存中,则显示其物理地址,并转下一条指令。如果所访问的指令还未装入内存,则发生缺页,此时需记录缺页的次数,并将相应页调入内存。如果4个内存块中均已装入该作业,则需进行页面置换。最后显示其物理地址,并转下一条指令。在所有320条指令执行完毕后,请计算并显示作业运行过程中发生的缺页率。 (3) 置换算法:请分别考虑OPT、FIFO和LRU算法。 (4) 作业中指令的访问次序按下述原则生成: ?50%的指令是顺序执行的。 ?25%的指令是均匀分布在前地址部分。 ?25%的指令时均匀分布在后地址部分。 具体的实施办法是: ① 在[0,319]之间随机选取一条起始执行指令,其序号为m; ② 顺序执行下一条指令,即序号为m+1的指令; ③ 通过随机数,跳转到前地址部分[0,m-1]中的某条指令处,其序号为m1; ④ 顺序执行下一条指令,即序号为m1+1的指令; ⑤ 通过随机数,跳转到后地址部分[m1+2,319]中的某条指令处,其序号为m2; ⑥ 顺序执行下一条指令,即序号为m2+1的指令; ⑦ 重复跳转到前地址部分、顺序执行、跳转到后地址部分、顺序执行的过程,直至执行320条指令。 实验代码如下: 头文件一: #define TRUE 1 #define FALSE 0 using namespace std; struct Block{ int ID; //页号 int visit; //访问字段,供选择换出页面时参考 }block[4]; int ins[320]; int ins_page[320]; //记录每条指令对应的页号 void Random(); void block_inital(); int block_exist(int a); int block_full(); - 26 - 操作系统实验报告 int block_add(int a); int find_max(); int block_replace(int a); int block_replace_OPT(int i); void show_state(int page_num); void FIFO(); void LRU(); void OPT(); 主函数: #include #include #include%using namespace std; int main(){ //首先生成320条指令 Random(); //转换成页号 cout<<\转换成为页号:\ for(int i=0;i<320;i++){ ins_page[i]=ins[i]/10; printf(\ if((i+1)==0) cout<>n; if(n==1) OPT(); else if(n==2) FIFO(); else if(n==3) LRU(); else if(n==4) break; else { cout<<\输入有误,请重新输入!\ continue; } } return 0; } 源代码: - 27 - 操作系统实验报告 #include\#include void Random() { srand(time(NULL)); int flag=0; int order=rand()20; cout<<\随机产生的320个随机数:\ for(int i=0;i<320;i++) { ins[i]=order; if(flag==0||flag==2)order=++order20;//50%,顺序指令 else if(flag==1) order=rand( )% (order-1); //25%,前地址部分指令 else if(flag==3) order=order+1+(rand( )%(320-(order+1))); //25%,后地址部分指令 flag=++flag%4; printf(\ if((i+1)==0) cout<max){ max=block[i].visit; max_flag=i; } return max_flag; } int block_replace(int a){ int flag=find_max(); block[flag].ID=a; block[flag].visit=0; return a; } int block_replace_OPT(int i){ for(int num=0;num<4;num++) { block[num].visit=0; for(int j=i;j<320;j++){ if(block[num].ID!=ins_page[j]) block[num].visit++; else break; } } int flag=find_max(); block[flag].ID=ins_page[i]; return i; } void show_state(int page_num){ for(int j=0;j<4;j++) if(block[j].ID!=-1) printf(\ else printf(\ cout<<\ - 29 - 操作系统实验报告 if(page_num !=-1){//如果页号存在,输出物理块的物理地址 cout<<&block[page_num]; } cout<

操作系统实验报告 block[num].visit=0; } } else block[page_num].visit=0; //与FIFO不同,这里每次如果存在就将visit置为0,visit越小代表最近访问的次数越多 show_state(page_num); } cout<<\缺页:\次\ cout<<\缺页率:\} void OPT(){ block_inital(); int cont=0; for(int i=0;i<320;i++){ int page_num=block_exist(ins_page[i]); //存在返回页号,不存在返回-1 if(page_num==-1){ //如果页号不存在 cont++; if(block_full()) block_replace_OPT(i); //如果四个内存块已经满了,将ins[i]与block中某个数替换 else block_add(ins_page[i]);//如果四个内存块未满,将ins[i]加到block } show_state(page_num); } cout<<\缺页:\次\ cout<<\缺页率:\} 用VC++6.0编译链接: - 31 - 操作系统实验报告 运行结果如图: - 32 - 操作系统实验报告 - 33 - 操作系统实验报告 实验四到此结束 - 34 - 操作系统实验报告 实验总结: 本学期的操作系统课程已学完,实验也已经做完了,通过课程学习,我初步了解了操作系统的工作原理,逐渐明确了操作系统在处理不同类型事务时所用的不同方法。但是仅仅从书面上理解操作系统的内涵还是太肤浅了,必须辅以实验的练习以加强理解。通过这8周的操作系统实验,我逐渐学会了如何用C语言模拟实现操作系统的功能,实现进程控制与内存分配、回收以及请求调页等。当然,操作系统并不仅仅是以上区区四个实验所能涵盖,它还包括设备管理,文件管理等重要功能,这些内容也还得多加深理解。此外,以上四个实验还涉及到linux操作系统,这是我们并不经常接触的一类操作系统,但是作为应用最广泛的OS之一 ,它也值得我们去深入探究。 除了加深对OS工作原理之外,这些实验还加强了我们与同学与老师沟通的能力。通过分组编程练习以及答辩,我也懂得了团结协作以及语言表达的重要性。而这些也不应因实验课的结束而改变。 - 35 -

本文来源:https://www.bwwdw.com/article/2zqp.html

Top