操作系统实验报告.docx
- 文档编号:5198171
- 上传时间:2022-12-13
- 格式:DOCX
- 页数:33
- 大小:200.35KB
操作系统实验报告.docx
《操作系统实验报告.docx》由会员分享,可在线阅读,更多相关《操作系统实验报告.docx(33页珍藏版)》请在冰豆网上搜索。
操作系统实验报告
操作系统实验报告
目录
实验一:
进程的创建1
实验二:
进程控制2
实验三:
进程的管道通信3
实验四:
消息通信5
实验五:
进程调度算法7
实验六:
FIFO页面置换算法11
实验七:
LRU页面置换算法14
实验八:
磁盘调度17
实验一:
进程的创建
一:
实验目的:
编写一段程序,使用系统调用FORK()创建两个子进程。
当此程序运行时,在系统中有一个父进程和两个子进程活动。
让每一个进程在屏幕上显示一个字符:
父进程显示字符“A”子进程分别显示字符“B”和“C”。
试观察记录屏幕上的显示结果,并分析原因。
二:
源代码
#include<stdio.h>
Main()
{intp1,p2;
While((p1=fork())==-1);
If(p1==0)
Putchar(ˊbˊ);
else
{
While((p2=fork())==-1);
If(p2==0)
Putchar(ˊcˊ);
elseputchar(ˊaˊ);
}
}
3.实验结果:
4.实验分析:
程序首先调用Fork()函数创建一个子进程1.当创建进程不成功时,循环创建进程,直至进程创建成功。
如果fork()返回值为0,则表示当前进程是子进程1,显示字符“B”;如果fork()返回值大于0,则表示当前进程是父进程。
表示当前的程序代码是待父进程所要执行的。
父进程调用fork()创建子进程2.当创建进程不成功(fork()返回值等于-1)时,循环创建进程,直至进程创建成功。
如果fork返回值为0,则表示当前进程是子进程2,显示字符“C”;如果fork()返回值大于0,则表示当前进程是父进程,输出字符“A”。
因为在创建子进程2的时候,fork的返回值是0还是大于0是不确定。
所以字符“A”和字符“C”的显示顺序不确定。
实验二:
进程控制
一.实验目的:
修改已编写的程序,将每个进程的输出由单个字符改为一个字符串,再观察程序的执行时屏幕上出现的现象,并分析原因。
二.源代码:
#include<stdio.h>
Main()
{intp1,p2,i;
While((p1=fork())==-1);
If(p1==0)
For(i=0;i<500;i++)
Printf("child%d/n",i);
else
{
While((p2=fork())==-1);
if(p2==0)
for(i=0;i<500;i++)
printf("son%d\n",i)
else
for(i=0;i<500;i++)
printf("daughter%d\n",i);
}
return0;
}
3.
实验结果:
四.实验分析:
由于函数Printf()输出的字符串之间不会被中断。
因此,字符串内部的字符顺序输出时不变。
看实验结果可以发现:
child中的各个标号是顺序的。
由于进程并发执行时的调度顺序和父子进程的抢占处理机问题,输出字符串的顺序和先后随着执行的不同而发生变化。
可以发现:
child,daughter,son的顺序是随机的。
实验三:
进程的管道通信
一.实验目的:
编制一段程序,实现进程管道通信。
使用系统调用pipe()建立一条管道。
两个子进程P1和P2分别向管道各写一句话。
再观察程序的执行时屏幕上出现的现象,并分析原因。
二.源代码:
#include<stdio.h>
#include<unistd.h>
#include<signal.h>
intpid1,pid2;
main()
{intfd[2];
CharOutPipe[100],InPipe[100]
Pipe(fd);//创建管道
while(pip1=fork())==-1);
if(pip1==0)
Lock(fd[1],1,0);//锁定管道
sprintf(OutPipe,“child1processissendingmessage!
”);
Write(fd[1],OutPipe,50);//向管道写入数据
Sleep(5);//等待5秒
Lockf(fd[1],0,0);//解除管道锁定
Exit(0);
}
else
{
While((pip2=fork())==-1);
if(pip2==0)
{Lock(fd[1],1,0);
sprintf(OutPipe,“child2processissendingmessage!
”);
Write(fd[1],OutPipe,50);
Sleep(5);等待5秒
Lockf(fd[1],0,0);
Exit(0);
}
Else
{wait(0);
Read(fd[0],inpipe,50);
Printf(“%s\n”,inpipe)
Wait(0);
Read(fd[0],inpipe,50);
Exit(0);
}
}
}
3.实验结果:
四.实验分析:
Pipe()函数用于创建一个管道,正确返回0,调用成功;错误返回-1,调用失败。
首先使用系统调用pipe()建立一条管道,调用Fork()函数创建一个子进程p1.当创建进程不成功时,循环创建进程,直至进程创建成功。
如果fork()返回值为0,则表示当前进程是子进程,向管道写一句话“child1processissedingmessage!
”;如果fork()返回值大于0,则表示当前进程是父进程。
表示当前的程序代码是待父进程所要执行的。
父进程调用fork()创建子进程P2。
当创建进程不成功时,循环创建进程,直至进程创建成功。
向管道写“child2processissendingmessage!
”。
如果fork()返回值大于0,则表示当前进程是父进程。
由父进程读取管道内的内容,将子进程输入到管道内的内容输出到控制台上。
实验四:
消息通信
1.实验内容:
编写一段程序,同时父进程创建两个子进程p1和p2;并使子进程p1与子进程p2通过消息队列相互发送消息(512字节)。
二.实验目的:
系统了解linux系统的通信机构IPC,掌握IPC中消息通信机制,理解消息通信的方法及特征。
三.实验要求:
(1)掌握系统调用msgget()、msgsnd()、msgrev()、msgctl()的使用方法及其功能,理解消息通信原理;
(2)系统理解linux的三种通信机制。
四.源代码:
#include
#include
#include
#include
#defineMSGKEY35
structmsgform
{longmtype;charmtext[512];};
main()
{structmsgformmsg1,msg2;
intmsgqid,pid,*pint,p=0,p1,p2,pp=0;
while((p1=fork())==-1);
if(p1==0)
{msgqid=msgget(MSGKEY,0777|IPC_CREAT);
pid=getpid();
//printf("111%d\n",pid);
pint=(int*)msg1.mtext;
*pint=pid;
msg1.mtype=1;
msgsnd(msgqid,&msg1,512,0);
sleep
(1);
msgrcv(msgqid,&msg1,512,2,0);
pint=(int*)msg1.mtext;
pp=*pint;
printf("receivefromp2%d\n",pp);
//sleep
(1);
}
else
{while((p2=fork())==-1);
if(p2==0){msgqid=msgget(MSGKEY,0777|IPC_CREAT);
msgrcv(msgqid,&msg2,256,1,0);
pint=(int*)msg2.mtext;
p=*pint;
printf("receivefromp1%d\n",p);
msg2.mtype=2;
*pint=getpid();
//printf("222%d\n",getpid());
msgsnd(msgqid,&msg2,256,0);
}
}
sleep
(1);
msgctl(msgqid,IPC_RMID,0);
}
5.实验结果:
6.实验分析:
Linux系统的进程通信机构(IPC)允许在任意间大批量地交换数据。
程序中由父进程创建两个子进程p1和p2通过系统调用msgget(),msgrev(),及msgct1()以使进程p1与子进程p2通过消息队列相互发送和接受消息。
实验五:
进程调度算法
1.实验目的:
安装VC++6.0软件。
用VC+6.0创建一个控制台应用程序。
编程创建一系列的进程并放
入就绪队列中(使用链表实现),来模拟进程创建。
把创建的进程的信息在屏幕上显示出来。
设计进程调度程序模拟两种以上调度算法(时间片调度、优先级调度)。
进程调度程序从活动就绪队列中挑选进程,若队列为空,应显示相应提示信息。
必须有出错处理
2.进程调度算法思想:
1)时间片轮转调度(RR)
将处于就绪队列的进程按到达的时间来排序。
进程调度总是选择队列中的第一个进程(即按先来先服务)占有CPU,但每个进程占有相同的时间片。
2)优先级调度(priority)
按照进程的优先级大小来调度,使高优先级的进程优先得到处理的调度策略。
(进程的优先级大小可由系统自动地按照一定的原则赋给它。
3.实验要求:
1)由键盘输入要创建的进程数,每个进程的名称和优先数(优先数越大,优先级越高)和每个进程需要使用的CPU时间。
2)把创建的进程的信息在屏幕上显示出来。
3)由键盘输入时间片的大小。
4)在屏幕上输出两种调度算法的调度结果
4.源代码:
#include
#include"string.h"
voidmain(){
inti,j,k,m,max,flag,s;
intcount[100];//RR算法循环显示次数
intt;//时间片
intnum;//进程数
intno[10];//进程ID
charname[100][100];//进程名称
charc[100];
inttime[100];//使用CPU时间
inttim[100];
intpriority[100];//优先数
intpri[100];
printf("请输入你要创建的进程数:
");
scanf("%d",&num);
printf("\n\n");
for(i=0;i { printf("请输入进程的名称: "); scanf("%s",c); strcpy(name[i],c); printf("请输入进程使用的CPU的时间(s): "); scanf("%d",&k); time[i]=k; printf("请输入进程的优先数(优先数越大,优先级越高): "); scanf("%d",&k); priority[i]=k; printf("\n"); } for(i=0;i no[i]=i; printf("进程ID号\t进程名称\t需要CPU时间按\t优先数\n"); for(i=0;i { printf("%d\t\t",no[i]); printf("%s\t\t",name[i]); printf("%d\t\t",time[i]); printf("%d\n",priority[i]); } flag=1; while(flag==1) { printf("请选择进程调度算法: (1时间片轮转;2优先级)\n"); scanf("%d",&s); switch(s) { case1: printf("\n请输入时间片(单位s): "); scanf("%d",&t); printf("\n\n"); printf("时间片轮转算法RR,调度结果如下: \n"); for(i=0;i { count[i]=time[i]/t; } for(i=0;i { if(time[i]%t! =0) count[i]++; } max=count[0]; for(i=1;i { if(max max=count[i]; } for(i=0;i tim[i]=time[i]; for(m=0;m { for(i=0;i { if(tim[i]>0) { if(tim[i]/t! =0) printf("\t%d\t\t\t%s: \t%d",no[i],name[i],t); else printf("\t%d\t\t\t%s: \t%d",no[i],name[i],tim[i]); tim[i]=tim[i]-t; printf("\n"); } } printf("\n"); } break; case2: { printf("优先级调度算法,结果如下: \n"); for(i=0;i pri[i]=priority[i]; for(i=0;i { max=pri[0]; m=no[0]; for(j=0;j { if(pri[j]>max) { max=pri[j]; m=no[j]; } } printf("\t%d\t\t\t%s: \t%d\n",no[m],name[m],time[m]); pri[m]=0; } break; } default: printf("Pleaseinput1or2.\n"); } printf("要继续么? (1继续;0停止)\n"); scanf("%d",&flag); } } 5.实验结果: 实验六: FIFO页面置换算法 一.实验目的: 例如: 进程P有5个页,进程访问页的顺序为: 1,2,3,4,1,2,5,1,2,3,4,5;如果在内存中分配给该进程3个页面,则缺页情况如下: 1 2 3 4 1 2 5 1 2 3 4 5 1 2 3 4 1 2 5 5 5 3 4 4 1 2 3 4 1 2 2 2 5 3 3 1 2 3 4 1 1 1 2 5 45 × × × × × × × √ √ × × √ 页面淘汰顺序: 1,2,3,4,1,2 2.源代码: #include"stdafx.h" voidmain() {inti,j; intk=0; inta[12]={1,2,3,4,1,2,5,1,2,3,4,5};//页的调度顺序 intb[3][13],c[13],p=0; b[0][0]=9;//C语言定义数组,其初值是不确定的 b[1][0]=9; b[2][0]=9; printf(""); for(i=0;i<12;i++) printf("%6d",a[i]); printf("\n=========================================================================\n"); for(i=0;i<12;i++) { if(a[i]==b[0][i]||a[i]==b[1][i]||a[i]==b[2][i]) {b[0][i+1]=b[0][i]; b[1][i+1]=b[1][i]; b[2][i+1]=b[2][i]; } else {if(i>2) {c[p]=b[2][i]; p++; } b[0][i+1]=a[i]; b[1][i+1]=b[0][i]; b[2][i+1]=b[1][i]; k=k+1; } } for(j=0;j<13;j++) printf("%6d",b[0][j]); printf("\n-------------------------------------------------------------------------\n"); for(j=0;j<13;j++) printf("%6d",b[1][j]); printf("\n-------------------------------------------------------------------------\n"); for(j=0;j<13;j++) printf("%6d",b[2][j]); printf("\n-------------------------------------------------------------------------\n"); printf("\n缺页中断次数: %6d\n",k); printf("\n页面淘汰顺序: "); for(j=0;j printf("%6d",c[j]); printf("\n\n"); } 3. 实验结果: 实验七: LRU页面置换算法 1.实验目的: 、 例如: 进程P有5个页,进程访问页的顺序为: 4,3,2,1,4,3,5,4,3,2,1,5;如果在内存中分配给该进程3个页面,则缺页情况如下: 页面 4 3 2 1 4 3 5 4 3 2 1 5 页面1 4 3 2 1 4 3 5 4 3 2 1 5 页面2 4 3 2 1 4 3 5 4 3 2 1 页面3 4 3 2 1 4 3 5 4 3 2 缺页 × × × × × × × √ √ × × × 页面淘汰顺序: 4,3,2,1,5,4,3 二.源代码: #include"stdio.h" #include"string.h" voidmax_value(intx,intcc[][2]);//函数声明,页表处理 intr_algorithm(intcc[][2]);//函数声明,选择页面淘汰算法 voidpage_table(intpage1,intc[5][2]);//打印页表 voidmain() {inti,j,page,row=0,col=1;//b[row]][col],行/列指针 intk=0;//记录缺页中断次数 inta[12]={4,3,2,1,4,3,5,4,3,2,1,5};//存放页的调度顺序 intb[3][13];//模拟内存(三个页面) intc[5][2]={{1,0},{2,0},{3,0},{4,0},{5,0}};//定义页表并赋初值 intd[13],p=0;//存放页面淘汰顺序,p页面淘汰数组d的指针 b[0][0]=0;//数组的初值不确定,0表示页面为空 b[1][0]=0; b[2][0]=0; //****************************页面调度处理**************************** for(i=0;i<12;i++) { if(a[i]==b[0][i]||a[i]==b[1][i]||a[i]==b[2][i]) {b[0][i+1]=b[0][i];//将前一列数据复制到下一列 b[1][i+1]=b[1][i]; b[2][i+1]=b[2][i]; max_value(a[i],c);//处理页表,a[i]页面是刚被访问的页面 page_table(a[i],c);//打印页表 col++;//col指向下一列 } else//页面不在内存 {if(row>2)//row>2表示内存已没有空闲页面 {page=r_algorithm(c);//返回淘汰的页面page d[p]=page;//d[]存放被淘汰的页面 p++; k++;//缺页中断次数 b[0][i+1]=b[0][i];//将前一列数据复制到下一列 b[1][i+1]=b[1][i]; b[2][i+1]=b[2][i]; if(b[0][i+1]==page)b[0][i+1]=a[i]; if(b[1][i+1]==page)b[1][i+1]=a[i]; if(b[2][i+1]==page)b[2][i+1]=a[i]; max_value(a[i],c);//访问a[i]页面,i页面是刚被访问的页面 page_table(a[i],c);//打印页表 } else {b[0][i+1]=b[0][i];//将前一列数据复制到下一列 b[1][i+1]=b[1][i]; b[2][i+1]=b[2][i]; b[row][col]=a[i];//a[i]页面进入内存 max_value(a[i],c);//访问a[i]页面,i页面是刚被访问的页面 col++; k++;//缺页中断次数 row++; page_ta
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 实验 报告