程序操作系统实验大纲(三个实验)学生版

程序操作系统实验大纲(三个实验)学生版
程序操作系统实验大纲(三个实验)学生版

《计算机操作系统》实验

教学大纲

课程编码:509311 课程类别:专业核心课

适用专业:计算机科学与技术专业主要教学内容:操作系统基本原理

课程总学时:78 实验学时:14

【实验目标要求】

操作系统是计算机教学中最重要的环节之一,也是计算机专业学生的一门重要的专业课程。操作系统课程主要内容包括:进程管理、处理机调度与死锁、存储管理、设备管理、文件系统、操作系统接口、网络操作系统、操作系统安全性以及Unix系统内核结构。由于操作系统涉及计算机系统中各种软硬件资源的管理,内容比较繁琐,具有很强的实践性。要学好这门课程,必须把理论与实践紧密结合,才能取得较好的学习效果。

培养计算机专业的学生的系统程序设计能力,是操作系统课程的一个非常重要的环节。通过操作系统上机实验,可以培养学生程序设计的方法和技巧,提高学生编制清晰、合理、可读性好的系统程序的能力,加深对操作系统课程的理解。使学生更好地掌握操作系统的基本概念、基本原理、及基本功能,具有分析实际操作系统、设计、构造和开发现代操作系统的基本能力。

【实验学习要求】

认真学习教学过程中讲授的与实验相关的内容,提前做好实验预习。按实验指导书要求事先编好程序;准备好需要输入的中间数据;估计可能出现的问题;预计可能得到的运行结果。做到在每个实验前明确实验目的、掌握实验的基本内容及操作方法;在实验中正确使用实验设备,认真观察、分析实验结果;实验后要根据要求做好总结,上交实验报告。

【实验计划】

【实验教材及主要参考资料】

教材:

《计算机操作系统》,汤子赢等编著,西安电子科技大学出版社,2002

《操作系统教程题解与实验指导》,孟静编著,高等教育出版社,2003

参考资料:

《操作系统实验指导书》,傅秀芬编著,广东工业大学出版科

中山大学OSCAI :https://www.360docs.net/doc/aa15419925.html,/os/

《操作系统教程》,陈向群等编著,北京大学出版社,2001

《Windows操作系统原理》,尤晋元等编著,机械工业出版社,2001

《计算机操作系统教程》,周长林等编著,高等教育出版社,2002

【实验任务】

实验一、单处理器系统的进程调度

一、实验目的

通过模拟进程控制方法及单处理机系统的进程调度,了解进程的结构,进程的创建与撤消,进程的组织及进程的状态及其转换,掌握进程调度策略。

二、实验学时

4学时

三、实验内容

本实验为单机模拟进程调度算法,在程序设计时不需真正地建立线程或者进程。实验模拟创建若干进程(人为输入或随机数产生),选择一种或几种单处理机的进程调度算法,如FCFS(先来先服务),SPF(短进程优先),RR(时间片轮转法),优先级算法等,模拟进行进程调度。每进行一次调度,都打印一次运行进程、就绪队列、以及各个进程的PCB,并能在进程完成后及时撤消该进程。

四、算法描述

设计一个按优先数调度算法实现处理器调度的程序。

(1) 假定系统有五个进程,每一个进程用一个进程控制块PCB来代表,进程控制块的格式为:

其中,进程名——作为进程的标识,假设五个进程的进程名分别为P1,P2,P3,P4,P5。

指针——按优先数的大小把五个进程连成队列,用指针指出下一个进程的进程控制块的首地址,最后一个进程中的指针为“0”。

要求运行时间——假设进程需要运行的单位时间数。

优先数——赋予进程的优先数,调度时总是选取优先数大的进程先执行。

状态——可假设有两种状态,“就绪”状态和“结束”状态。五个进程的初始状态都为“就绪”,用“R”表示,当一个进程运行结束后,它的状态为“结束”,用“E”表示。

(2) 在每次运行你所设计的处理器调度程序之前,为每个进程任意确定它的“优先数”和“要求运行时间”。

(3) 为了调度方便,把五个进程按给定的优先数从大到小连成队列。用一单元指出队首进程,用指针指出队列的连接情况。例:

队首标志

K2K3K4K5

(4) 处理器调度总是选队首进程运行。采用动态改变优先数的办法,进程每运行一次优先数就减“1”。由于本实验是模拟处理器调度,所以,对被选中的进程并不实际的启动运行,而是执行:

优先数-1

要求运行时间-1

来模拟进程的一次运行。

提醒注意的是:在实际的系统中,当一个进程被选中运行时,必须恢复进程的现场,让它占有处理器运行,直到出现等待事件或运行结束。在这里省去了这些工作。

(5) 进程运行一次后,若要求运行时间 0,则再将它加入队列(按优先数大小插入,且置队首标志);若要求运行时间=0,则把它的状态修改成“结束”(E),且退出队列。

(6) 若“就绪”状态的进程队列不为空,则重复上面(4)和(5)的步骤,直到所有进程都成为“结束”状态。

(7) 在所设计的程序中应有显示或打印语句,能显示或打印每次被选中进程的进程名以及运行一次后进程队列的变化。

(8) 为五个进程任意确定一组“优先数”和“要求运行时间”,启动所设计的处理器调度程序,显示或打印逐次被选中进程的进程名以及进程控制块的动态变化过程。

图1-1 流程图

五、参考程序

#include "stdio.h"

#include

#include

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

#define NULL 0

struct pcb { /* 定义进程控制块PCB */

char name[10];

char state;

int super;

int ntime;

int rtime;

struct pcb* link;

}*ready=NULL,*p;

typedef struct pcb PCB;

void sort() /* 建立对进程进行优先级排列函数*/

{

}

void input() /* 建立进程控制块函数*/

{

int i,num;

printf("\n 请输入进程数量?");

scanf("%d",&num);

for(i=0;i

{

printf("\n 进程号No.%d:\n",i);

p=getpch(PCB);

printf("\n 输入进程名:");

scanf("%s",p->name);

printf("\n 输入进程优先数:");

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

printf("\n 输入进程运行时间:");

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

printf("\n");

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

p->link=NULL;

sort(); /* 调用sort函数*/

}

}

int space()

{

int l=0; PCB* pr=ready;

while(pr!=NULL)

{

l++;

pr=pr->link;

}

return(l);

}

void disp(PCB * pr) /*建立进程显示函数,用于显示当前进程*/

{

printf("\n qname \t state \t super \t ndtime \t runtime \n");

printf("|%s\t",pr->name);

printf("|%c\t",pr->state);

printf("|%d\t",pr->super);

printf("|%d\t",pr->ntime);

printf("|%d\t",pr->rtime);

printf("\n");

}

void check() /* 建立进程查看函数*/

{

PCB* pr;

printf("\n **** 当前正在运行的进程是:%s",p->name); /*显示当前运行进程*/ disp(p);

pr=ready;

printf("\n ****当前就绪队列状态为:\n"); /*显示就绪队列状态*/

while(pr!=NULL)

{

disp(pr);

pr=pr->link;

}

}

void destroy() /*建立进程撤消函数(进程运行结束,撤消进程)*/

{

printf("\n 进程[%s] 已完成.\n",p->name);

free(p);

}

void running() /* 建立进程就绪函数(进程运行时间到,置就绪状态*/

{

(p->rtime)++;

if(p->rtime==p->ntime)

destroy(); /* 调用destroy函数*/

else

{

(p->super)--;

p->state='w';

sort(); /*调用sort函数*/

}

}

void main() /*主函数*/

{

int len,h=0;

char ch;

input();

len=space();

while((len!=0)&&(ready!=NULL))

{

ch=getchar();

h++;

printf("\n The execute number:%d \n",h);

p=ready;

ready=p->link;

p->link=NULL;

p->state='R';

check();

running();

printf("\n 按任一键继续......");

ch=getchar();

}

printf("\n\n 进程已经完成.\n");

ch=getchar();

}

要求:

1、完成上述实验示例程序,按照优先级算法补充出sort()子程序的内容。

2、若修改优先数时增加下列原则:进程等待的时间超过某一时限时增加其优先数,参考上述例程,写出程序。

六、选做题

完成FCFS或SPF算法。

七、思考题

编写一个多道程序系统的作业调度模拟程序,可采用任一调度算法。对于多道程序系统,要假定系统中具有的各种资源及数量、调度作业时必须考虑到每个作业的资源要求。

实验二、资源分配

一、实验目的

本实习要求学生编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并采用适当的算法,有效地防止和避免死锁的发生。

二、实验学时

4学时

三、实验内容

利用银行家算法实现进程的动态资源分配。对进程运行过程中提出的资源请求进行检查,若分配后系统处于安全状态,则满足请求,否则拒绝申请。

四、算法描述

1.银行家算法基本思想

先对用户提出的请求进行合法性检查,即检查请求的是不大于需要的,是否不大于可利用的。若请求合法,则进行试分配。最后对试分配后的状态调用安全性检查算法进行安全性检查。若安全,则分配,否则,不分配,恢复原来状态,拒绝申请。

2.银行家算法中用到的主要数据结构

可利用资源向量int Available[j] j为资源的种类。

最大需求矩阵int Max[i][j] i为进程的数量。

分配矩阵int Allocation[i][j]

需求矩阵int need[i][j]= Max[i][j]- Allocation[i][j]

申请各类资源数量int Request i[j] i进程申请j资源的数量

工作向量int Work[x] int Finish[y]

3.银行家算法bank()

进程i发出请求申请k个j资源,Request i[j]=k

(1) 检查申请量是否不大于需求量:Request i[j]<=need[i,j],若条件不符重新输入,不允许申请大于需求量。

(2) 检查申请量是否小于系统中的可利用资源数量:Request i[j]<=available[i,j],若条件不符就申请失败,阻塞该进程,用goto语句跳转到重新申请资源。

(3) 若以上两个条件都满足,则系统试探着将资源分配给申请的进程,并修改下面数据结构中的数值:

Available[i,j]= Available[i,j]- Request i[j];

Allocation[i][j]= Allocation[i][j]+ Request i[j];

need[i][j]= need[i][j]- Request i[j];

(4) 试分配后,执行安全性检查,调用safe()函数检查此次资源分配后系统是否处于安全状态。若安全,才正式将资源分配给进程;否则本次试探分配作废,恢复原来的资源分配状态,让该进程等待。

(5) 用do{…}while 循环语句实现输入字符y/n判断是否继续进行资源申请。

4.安全性检查算法(safe()函数)

(1) 设置两个向量:

工作向量Work,它表示系统可提供给进程继续运行所需的各类资源数目,在执行安全性算法开始时,Work= Available。

Finish,它表示系统是否有足够的资源分配给进程,使之运行完成。开始时先做Finish[i]=0;当有足够的资源分配给进程时,再令Finish[i]=1。

(2) 在进程中查找符合以下条件的进程:

条件1:Finish[i]=0;

条件2:need[i][j]<=Work[j]

若找到,则执行步骤(3)否则,执行步骤(4)

(3) 当进程获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:

Work[j]= Work[j]+ Allocation[i][j];

Finish[i]=1;

goto step 2;

(4) 如果所有的Finish[i]=1都满足,则表示系统处于安全状态,否则,处于不安全状态。5.算法流程图

图2 银行算法模拟流程

五、实验主要步骤

1.启动C/C++语言环境,新建文件。

2.设计一个3个并发进程共享10个同类资源的系统,进程可动态地申请资源和释放资源,系统按各进程的申请动态地分配资源。

3.设计用银行家算法,实现资源分配的两个资源分配程序,应具有显示或打印各进程依次要求申请的资源数以及依次分配资源的情况。

4.确定一组各进程依次申请资源数的序列,在相同的情况下分别运行上述两种资源分配程序,观察运行结果。

5.打印资源申请情况:

六、参考程序

#include

#include

#include

#include

//定义全局变量

const int x=10,y=10; //常量,便于修改

int Available[x]; //各资源可利用的数量

int Allocation[y][y]; //各进程当前已分配的资源数量

int Max[y][y]; //各进程对各类资源的最大需求数

int Need[y][y]; //尚需多少资源

int Request[x]; //申请多少资源

int Work[x]; //工作向量,表示系统可提供给进程继续运行所需的各类资源数量

int Finish[y]; //表示系统是否有足够的资源分配给进程,1为是

int p[y]; //存储安全序列

int i,j; //i表示进程,j表示资源

int n,m; //n为进程i的数量,m为资源j种类数

int l=0; //l用来记录有几个进程是Finish[i]=1的,当l=n是说明系统状态是安全的

int counter=0;

//函数声明

void chushihua(); //初始化函数

void safe(); //安全性算法

void show(); //函数show,输出当前状态

void bank(); //银行家算法

void jieshu(); //结束函数

void chushihua()

cout<<"输入进程的数量: ";//从此开始输入有关数据

cin>>n;

cout<<"输入资源种类数: ";

cin>>m;

cout<

for (j=0; j

{

cout<<"输入资源"<

cin>>Available[j]; //输入数字的过程...

Work[j]=Available[j]; //初始化Work[j],它的初始值就是当前可用的资源数}

cout<

for (i=0; i

{

for (j=0; j

{

cout<<" 输入进程"<

cin>>Allocation[i][j];

}

cout<

Finish[i]=0;//初始化Finish[i]

}

cout<

for (i=0; i

{

for (j=0; j

{

cout<<" 输入进程"<

cin>>Max[i][j];

if(Max[i][j]>=Allocation[i][j]) //若最大需求大于已分配,则计算需求量

Need[i][j] = Max[i][j]-Allocation[i][j];

else

Need[i][j]=0;//Max小于已分配的时候,此类资源已足够不需再申请

}

cout<

}

cout<

}

//安全性算法函数

void safe()

{

}

//显示当前状态函数

void show() //函数show,输出当前资源分配情况

{

int i,j; //局部变量

int All[y]; //各种资源的总数量

int L1; //局部变量L1

cout<<"当前的状态为:"<

cout<<"各种资源的总数量:"<

for (j=0;j

{

cout<<" 资源"<

All[j]=Available[j]; //总数量=可用的+已分配的

for (i=0;i

cout<

}

cout<

for (j=0;j

cout<<" 资源"<

cout<

for(i=0;i<=m;i++)

{

for (j=i;j

cout<

for(L1=0;L1

{

cout<<"进程"<

for (j=i;j

cout<

}

}

cout<

for(i=0;i<=m;i++)

{

for (j=i;j

cout<

for(L1=0;L1

{

cout<<"进程"<

for (j=i;j

cout<

}

}

//银行家算法函数

void bank()

{

cout<

int k=0; //用于输入进程编号

bool r=false; // 初值为假,输入Y继续申请则置为真

do{//输入请求

cout<<"输入申请资源的进程(0-"<

cin>>k;

cout<

while(k>n-1) //输入错误处理

{

cout<

cout<

cin>>k;

cout<

}

cout<

for (j=0; j

{

do{ //do……while 循环判断申请输入的情况

cout<<"进程"<

cin>>Request[j];

cout<

if(Request[j]>Need[k][j]){ //申请大于需求量时出错,提示重新输入(贷款数目不允许超过需求数目)

cout<<"申请大于需要量!"<

cout<<"申请的资源"<

cout<<"重新输入!"<

}

else //先判断是否申请大于需求量,再判断是否申请大于可利用量

if(Request[j]>Available[j]){ //申请大于可利用量,应该阻塞等待?…… ???

cout<<"\n没有那么多资源,目前可利用资源"<

Finish[k]=0; //该进程等待

goto ppp; //goto语句跳转,结束本次申请

}

}while(Request[j]>Need[k][j]); //Request[j]>Available[j]||

}

//改变Avilable、Allocation、Need的值

for (j=0; j

Available[j] = Available[j]-Request[j];

Allocation[k][j] = Allocation[k][j]+Request[j];

Need[k][j] = Need[k][j]-Request[j];

Work[j] = Available[j];

}

//判断当前状态的安全性

safe(); //调用安全性算法函数

if (l

{

l=0;

cout<<"\n试分配后,状态不安全,所以不予分配!恢复原状态"<

//恢复数据

for (j=0; j

{

Available[j] = Available[j]+Request[j];

Allocation[k][j] = Allocation[k][j]-Request[j];

Need[k][j] = Need[k][j]+Request[j];

Work[j] = Available[j];

}

for (i=0; i

Finish[i]=0; //进程置为未分配状态

}

else

{

l=0;

cout<<"\n申请资源成功!!!"<

for(j=0;j

{

if(Need[k][j]==0);

else { //有一种资源还没全部申请到,则该进程不可执行,不能释放拥有的资源l=1; //置l为1,作为判断标志

break;

}

}

if(l!=1){ //进程可以执行,则释放该进程的所有资源

for (j=0;j

Available[j]=Available[j]+Allocation[k][j];

Allocation[k][j]=0;

}

cout<<"该进程已得到所有需求资源,执行后将释放其所有拥有资源!"<

}

l=0; //归零

cout<<"\n安全的状态!"<

cout<<"安全序列为: ";

cout<

for (i=1; i

cout<<"==>>"<<"进程"<<"("<

Finish[i]=0; //所有进程置为未分配状态

}

cout<

}

show(); //显示当前状态

ppp: //申请大于可利用量,应该阻塞等待,结束本次资源申请,GOTO 语句跳转至此cout<

char* b=new char; //输入y/n,判断是否继续申请<

cin>>b;

cout<

cout<<"-------------------------------------------"<

cout<

if(*b=='y'||*b=='Y')

r=true;

else{

r=false; //输入非Y 则令R =false

jieshu(); //调用结束函数

}

} while (r==true);

}

//结束函数

void jieshu()

{

cout<

cout<<"\t\t 演示计算完毕"<

cout<

}

//主函数

int main()

{

cout<

chushihua(); //初始化函数调用

cout<

show(); //输出当前状态

safe(); //判断当前状态的安全性

if (l

{

cout<<"\n当前状态不安全,拒绝申请!"<

cout<

return 0;

}

else

{

int i; //局部变量

l=0;

cout<

cout<<"进程"<<"("<

for (i=1; i>"<<"进程"<<"("<

for (i=0; i

cout<

}

bank(); //调用银行家算法函数

cout<<"\t\t 演示计算完毕"<

return 0;

}

要求:

1、完成上述实验示例程序,按照银行家算法流程补充出safe()函数即安全性检测算法的内容。

2、分析各子程序的功能及实现过程,并简要说明。

七、思考题:

1、银行家算法实现死锁避免的缺陷在哪里?

2、如何实现并发执行的进程对资源的动态申请和动态分配?

实验三、请求页式存储管理

实验目的:

用C/C++编写和调试虚拟内存管理的模拟程序,通过虚存管理的地址转换过程和各种页面淘汰算法的编程实现,加深对存储管理方案的理解。

实验内容:

(1)设计页表。

分页式虚拟存储系统是把作业的副本存放在磁盘上,当作业被选中时,可把作业的开始几页先装入主存且启动执行。为此,在为作业建立页表时,应说明哪些页已在主存,哪些页尚未装入主存,页表的格式为:

页号标志主存块号在磁盘上的位置

(2)地址计算。

作业执行时,指令中的逻辑地址指出了参加运算的操作数存放的页号和单元号,硬件的地址转换机构按页号查页表,若该页对应标志为“1”,则表示该页已在主存,这时根据关系式:

绝对地址=块号*块长+单元号

计算出欲访问的主存单元地址。按计算出的绝对地址可以取到操作数,完成一条指令的执行。若访问的页标志为“0”,则表示该页不在主存,这时硬件发“缺页中断”信号,由OS按该页在磁盘

上的位置,把该页信息从磁盘读出装入主存后再重新执行这条指令。

(3)设计“地址转换”程序模拟硬件的地址转换工作。

当访问的页在主存时,则形成绝对地址,但不去模拟指令的执行,而用输出转换后的地址来代替一条指令的执行。当访问的页不在主存时,则输出“*该页页号”,表示产生了一次缺页中断,执行缺页中断程序。该模拟程序的算法如图3.1所示。

图 3.1 地址转换模拟流程图

(4) 缺页中断模拟。

如果访问页不在主存且页表未满,则调入一页并打印页表情况;如果该页不在主存且页表已满,则产生缺页中断,模拟算法如图3.2所示。

实验中采用FIFO算法进行页面淘汰。把在主存的页的页号按进入主存的先后次序排成队列,每次总是调出队首页。用数组存放页号的队列。若分配给该作业的物理块数为m,则数组由m 个元素组成,p[0],p[1]……p[m-1],队首指针head,队尾指针tail。当装入新页时,将其页号装入数组。

实验主要步骤:

1. 启动C语言环境,新建文件。

2. 假定主存的每块长度为128个字节;现有一个共七页的作业,其中的第0页至第3页已经

装入主存,其余三页未装入主存,主存;该作业的页表为:

如果作业依次执行的指令序列(操作,页号,单元号)为:

(+, 0, 070)、(+, 1, 050)、(*, 2, 015) 、(存, 3, 021)、(取, 0, 056)、(—, 6, 040)、(移位, 4, 053)、(+, 5, 023)、(存, 1, 037)、(取, 2, 078)、(+, 0, 070)、(+, 4, 001)、(存, 6, 084)。

运行设计的地址转换程序,显示或打印运行结果。因仅模拟地址转换,并不模拟指令的执行,故可不考虑上述指令序列中的操作。

3. 编写程序运行。

思考题:

请采用合适的方法编写程序完成主存空间的分配和回收

#include "stdio.h"

#include "string.h"

#define SizeOfBlock 128

#define M 4

struct info /*页表*/

{

int flag;

long block;

long disk;

}pagelist[SizeOfPage];

long po;

long P[M];

void init_ex ()

{

po=0;

P[0]=0;P[1]=1;P[2]=2;P[3]=3;

memset(pagelist,0,sizeof(pagelist));

pagelist[0].flag=1;

pagelist[0].block=5;

pagelist[0].disk=011;

pagelist[1].flag=1;

pagelist[1].block=8;

pagelist[1].disk=012;

pagelist[2].flag=1;

pagelist[2].block=9;

pagelist[2].disk=013;

pagelist[3].flag=1;

pagelist[3].block=1;

pagelist[3].disk=021;

}

void work_ex()

{

long p,q,i;

char s[100];

int stop=0;

do

{

printf("请输入指令的页号、单元号:\n");

if (scanf("%ld%ld",&p,&q)!=2)

{

scanf("%s",s);

if (strcmp(s,"exit")==0)

{

stop=1;

}

}

else

{

if (pagelist[p].flag)

printf("绝对地址=%ld\n",pagelist[p].block*SizeOfBlock+q); else

{ printf("* %ld\n",p);

pagelist[P[po]].flag=0;

printf("out %ld\n",P[po]);

printf("in %ld\n",p);

pagelist[p].block=pagelist[P[po]].block;

pagelist[p].flag=1;

P[po]=p;

po=(po+1)%M;

}

}

}while (!stop);

printf("数组P 的值为:\n");

for (i=0;i

{

printf("P[%ld]=%ld\n",i,P[i]);

}

}

int main()

{

init_ex();

work_ex();

return 0;

}

计算机操作系统教学大纲

《计算机操作系统》课程教学大纲 一. 课程名称 操作系统原理 二. 学时与学分 学时共64学时(52+12+8) 其中,52为理论课学时,12为实验学时,8为课外实验学时 学分 4 三. 先修课程 《计算机组成原理》、《C语言程序设计》、 《IBM—PC宏汇编程序设计语言》、《数据结构》 四. 课程教学目标 通过本课程的学习,要达到如下目标: 1.掌握操作系统的基本原理与实现技术,包括现代操作系统对计算机系统资源的管理策略与方法、操作系统进程管理机制、现代操作系统的用户界面。 2.了解操作系统的结构与设计。 3.具备系统软件开发技能,为以后从事各种研究、开发工作(如:设计、分析或改进各种系统软件和应用软件) 提供必要的软件基础和基本技能。 4.为进一步学习数据库系统、计算机网络、分布式系统等课程打下基础。 五. 适用学科专业 信息大类各专业

六. 基本教学内容与学时安排 主要内容: 本课程全面系统地阐述计算机操作系统的基本原理、主要功能及实现技术,重点论述多用户、多任务操作系统的运行机制;系统资源管理的策略和方法;操作系统提供的用户界面。讨论现代操作系统采用的并行处理技术和虚拟技术。本书以Linux系统为实例,剖析了其特点和具体的实现技术。 理论课学时:52学时 (48学时,课堂讨论2学时,考试2学时) ?绪论4学时 ?操作系统的结构和硬件支持4学时 ?操作系统的用户界面4学时 ?进程及进程管理8学时 ?资源分配与调度4学时 ?存储管理6学时 ?设备管理4学时 ?文件系统6学时 ?Linux系统8学时 七、教材 《计算机操作系统》(第2版),庞丽萍阳富民人民邮电出版社,2014年2月 八、考核方式 闭卷考试

操作系统实验三

计算机操作系统实验报告 实验内容: P、V原语的模拟实现 实验类型:验证型 指导教师:毕国堂 专业班级: 姓名: 学号: 实验地点:东6E507 实验时间:2017/10/23

一、实验目的 1.理解信号量相关理论 2.掌握记录型信号量结构 3.掌握P、V原语实现机制 二、实验内容 1.输入给定的代码 2.进行功能测试并得出证正确结果 三、实验要求 1.分析signal和wait函数功能模块 ●Signal函数 在进行资源增加时,首先判断增加的资源是否存在,如果不存在则报错 并结束函数;如果存在则将需要增加的资源数量加一,然后再判断增加 后的资源数是否大于0,如果大于0则表示之前等待队列为空,没有需 要分配的进程;如果增加后的资源不大于0,表示之前等待队列中存在 进程,则将队首的进程取出并将资源分给该进程。 ●Wait 函数 在执行wait函数时,先判断请求的资源和进程是否存在,如果不存在则 报错提示;如果存在则将对应资源的资源数减一,然后判断减少后的资 源数是否小于0,如果小于0,表示该资源等待队列为空,可直接将资源 分配给请求的进程;如果不小于0则表示之前资源的等待队列不为空, 则将请求的进程插在等待队列最后。 2.画出signal和wait函数流程图

3.撰写实验报告 四、实验设备 1.PC机1台安装visual c++ 6.0 五、测试

1.首先将所有的资源分配完 2.这时再请求资源时就会出现等待现象 3.此时增加一个资源s0,则进程1对s0的等待结束直接获取资源s0 4.当再增加资源s0、s1时则进程1也结束对资源s1的等待,并且s0资源 为有空闲状态 六、实验思考 1.如何修改wait操作,使之能一次申请多个信号量? wait函数传入一个进程号和多个资源名,在wait函数中使用循环依

操作系统实验报告三

课程实验报告 课程名称姓名实验名称实验目的及要求 实验3进程并发与同步 1、加深对进程概念的理解,区分进程并发执行与串行执行; 2、掌握进程并发执行的原理,理解进程并发执行的特点; 3、了解fork()系统调用的返回值,掌握用fork()创建进程的方法;熟悉wait、exit等系统调用; 4、能利用相应的系统调用实现进程树与进程间的同 步。 实 验操作系统:linux Un bu ntu 11.10 环 境实验工具:Vmware 实验内容 1、编写一C语言程序,实现在程序运行时通过系统调用fork()创建两个子进程,使父、子三进程并发执行,父亲进程执行时屏幕显示“I am father ”,儿子进 程执行时屏幕显示“ I am son ",女儿进程执行时屏幕显示“ I am daughter ”。 要求多次连续反复运行这个程序,观察屏幕显示结果的顺序,直至出现不一样的情况为止。要求有运行结果截图与结果分析 2、连续4个fork()的进程家族树,family1-1.c 程序清单如下: #in clude main () { fork(); fork(); fork(); fork(); printf( A\n ”); } 请根据程序运行结果,画出进程家族树,并分析原 因。

3、 修改程序1,在父、子进程中分别使用 wait 、exit 等系统调用“实现”其同 步推进,父进程必须等待儿子进程与女儿进程结束, 才可以输出消息。 写出相应的同 步控制,并分析运行结果。 4、 创建一个子进程,并给它加载程序,其功能是调用键盘命令“ ls -I ”,已知 该键盘命令的路径与文件名为: /bin/ls 。父进程创建子进程, 并加载./child2 程序。 写出相应的程序代码并分析程序运行结果。 1、编写一 C 语言程序,实现在程序运行时通过系统调用 fork()创建两个子进 程,使父、子三进程并发执行,父亲进程执行时屏幕显示“ I am father ”, 儿子进程执行时屏幕显示“ I am son ”,女儿进程执行时屏幕显示“ I am daughter "。并且反复的测试,观察每一次的执行的顺序有什么不同 2、修改程序1,在父、子进程中分别使用 wait 、exit 等系统调用“实现”其同 步推进,父进程必须等待儿子进程与女儿进程结束,才可以输出消息。 4、创建一个子进程,并给它加载程序,其功能是调用键盘命令“ ls -I ”,已知 该键盘命令的路径与文件名为: /bin/ls 。父进程创建子进程, 并加载./child2 程序。 法 描 述 及 实 验 步 骤 调 试过 程及实 验结果

操作系统原理-进程调度实验报告

一、实验目的 通过对进程调度算法的设计,深入理解进程调度的原理。 进程是程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位。 进程调度分配处理机,是控制协调进程对CPU的竞争,即按一定的调度算法从就绪队列中选中一个进程,把CPU的使用权交给被选中的进程。 进程通过定义一个进程控制块的数据结构(PCB)来表示;每个进程需要赋予进程ID、进程到达时间、进程需要运行的总时间的属性;在RR中,以1为时间片单位;运行时,输入若干个进程序列,按照时间片输出其执行序列。 二、实验环境 VC++6.0 三、实验内容 实现短进程优先调度算法(SPF)和时间片轮转调度算法(RR) [提示]: (1) 先来先服务(FCFS)调度算法 原理:每次调度是从就绪队列中,选择一个最先进入就绪队列的进程,把处理器分配给该进程,使之得到执行。该进程一旦占有了处理器,它就一直运行下去,直到该进程完成或因发生事件而阻塞,才退出处理器。 将用户作业和就绪进程按提交顺序或变为就绪状态的先后排成队列,并按照先来先服务的方式进行调度处理,是一种最普遍和最简单的方法。它优先考虑在系统中等待时间最长的作业,而不管要求运行时间的长短。 按照就绪进程进入就绪队列的先后次序进行调度,简单易实现,利于长进程,CPU繁忙型作业,不利于短进程,排队时间相对过长。 (2) 时间片轮转调度算法RR

原理:时间片轮转法主要用于进程调度。采用此算法的系统,其程序就绪队列往往按进程到达的时间来排序。进程调度按一定时间片(q)轮番运行各个进程. 进程按到达时间在就绪队列中排队,调度程序每次把CPU分配给就绪队列首进程使用一个时间片,运行完一个时间片释放CPU,排到就绪队列末尾参加下一轮调度,CPU分配给就绪队列的首进程。 固定时间片轮转法: 1 所有就绪进程按 FCFS 规则排队。 2 处理机总是分配给就绪队列的队首进程。 3 如果运行的进程用完时间片,则系统就把该进程送回就绪队列的队尾,重新排队。 4 因等待某事件而阻塞的进程送到阻塞队列。 5 系统把被唤醒的进程送到就绪队列的队尾。 可变时间片轮转法: 1 进程状态的转换方法同固定时间片轮转法。 2 响应时间固定,时间片的长短依据进程数量的多少由T = N × ( q + t )给出的关系调整。 3 根据进程优先级的高低进一步调整时间片,优先级越高的进程,分配的时间片越长。 多就绪队列轮转法: (3) 算法类型 (4)模拟程序可由两部分组成,先来先服务(FCFS)调度算法,时间片轮转。流程图如下:

操作系统实验实验1

广州大学学生实验报告 1、实验目的 1.1、掌握进程的概念,明确进程的含义 1.2、认识并了解并发执行的实质 2.1、掌握进程另外的创建方法 2.2、熟悉进程的睡眠、同步、撤消等进程控制方法 3.1、进一步认识并发执行的实质 3.2、分析进程竞争资源的现象,学习解决进程互斥的方法 4.1、了解守护进程 5.1、了解什么是信号 5.2、INUX系统中进程之间软中断通信的基本原理 6.1、了解什么是管道 6.2、熟悉UNIX/LINUX支持的管道通信方式 7.1、了解什么是消息 7.2、熟悉消息传送的机理 8.1、了解和熟悉共享存储机制 二、实验内容 1.1、编写一段程序,使用系统调用fork( )创建两个子进程。当此程序运行时,在系统 中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示'a',子进程分别显示字符'b'和字符'c'。试观察记录屏幕上的显示结果,并分析原因。 1.2、修改上述程序,每一个进程循环显示一句话。子进程显示'daughter …'及 'son ……',父进程显示'parent ……',观察结果,分析原因。 2.1、用fork( )创建一个进程,再调用exec( )用新的程序替换该子进程的内容 2.2、利用wait( )来控制进程执行顺序 3.1、修改实验(一)中的程序2,用lockf( )来给每一个进程加锁,以实现进程之间的互斥 3.2、观察并分析出现的现象 4.1、写一个使用守护进程(daemon)的程序,来实现: 创建一个日志文件/var/log/Mydaemon.log ; 每分钟都向其中写入一个时间戳(使用time_t的格式) ; 5.1、用fork( )创建两个子进程,再用系统调用signal( )让父进程捕捉键盘上来的中断信号(即按^c键);捕捉到中断信号后,父进程用系统调用kill( )向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止: Child process1 is killed by parent! Child process2 is killed by parent! 父进程等待两个子进程终止后,输出如下的信息后终止: Parent process is killed! 5.2、用软中断通信实现进程同步的机理

操作系统课程教学大纲

GDOU-B-11-213 《操作系统》课程教学大纲 课程简介 课程简介: 本课程主要讲述操作系统的原理,使学生不仅能够从系统内部了解操作系统的工作原理,而且可以学到软件设计的思想方法和技术方法。主要内容 包括:操作系统的概论;操作系统的作业管理;操作系统的文件管理原理; 操作系统的进程概念、进程调度和控制、进程互斥和同步等;操作系统的各 种存储管理方式以及存储保护和共享;操作系统的设备管理一般原理。其次 在实验环节介绍实例操作系统的若干实现技术,如:Windows操作系统、Linux 操作系统等。 课程大纲 一、课程的性质与任务: 本课程计算机学科的软件工程专业中是一门专业方向课,也可以面向计算机类的其它专业。其任务是讲授操作系统的原理,从系统内部了解操作系统的工作原理以级软件设计的思想方法和技术方法;同时介绍实例操作系统的若干实现技术。 二、课程的目的与基本要求: 通过本课程的教学使学生能够从操作系统内部获知操作系统的工作原理,理解操作系统几大管理模块的分工和管理思想,学习设计系统软件的思想方法,通过实验环节掌握操作系统实例的若干实现技术,如:Windows操作系统、Linux操作系统等。 三、面向专业: 软件工程、计算机类 四、先修课程: 计算系统基础,C/C++语言程序设计,计算机组成结构,数据结构。 五、本课程与其它课程的联系:

本课程以计算系统基础,C/C++语言程序设计,计算机组成结构,数据结构等为先修课程,在学习本课程之前要求学生掌握先修课程的知识,在学习本课程的过程中能将数据结构、计算机组成结构等课程的知识融入到本课程之中。 六、教学内容安排、要求、学时分配及作业: 第一章:操作系统概论(2学时) 第一节:操作系统的地位及作用 操作系统的地位(A);操作系统的作用(A)。 第二节:操作系统的功能 单道系统与多道系统(B);操作系统的功能(A)。 第三节:操作系统的分类 批处理操作系统(B);分时操作系统(B);实时操作系统(B)。 第二章:作业管理(2学时) 第一节:作业的组织 作业与作业步(B);作业的分类(B);作业的状态(B);作业控制块(B)。 第二节:操作系统的用户接口 程序级接口(A);作业控制级接口(A)。 第三节:作业调度 作业调度程序的功能(B);作业调度策略(B);作业调度算法(B)。 第四节:作业控制 脱机控制方式(A);联机控制方式(A)。 第三章:文件管理(8学时) 第一节:文件与文件系统(1学时) 文件(B);文件的种类(B);文件系统及其功能(A)。 第二节:文件的组织结构(1学时) 文件的逻辑结构(A);文件的物理结构(A)。 第三节:文件目录结构(1学时) 文件说明(B);文件目录的结构(A);当前目录和目录文件(B)。 第四节:文件存取与操作(1学时) 文件的存取方法(A);文件存储设备(C);活动文件(B);文件操作(A)。 第五节:文件存储空间的管理(2学时) 空闲块表(A);空闲区表(A);空闲块链(A);位示图(A)。 第六节:文件的共享和保护(2学时)

操作系统原理实验-系统内存使用统计5

上海电力学院 计算机操作系统原理 实验报告 题目:动态链接库的建立与调用 院系:计算机科学与技术学院 专业年级:信息安全2010级 学生姓名:李鑫学号:20103277 同组姓名:无 2012年11 月28 日上海电力学院

实验报告 课程名称计算机操作系统原理实验项目线程的同步 姓名李鑫学号20103277 班级2010251班专业信息安全 同组人姓名无指导教师姓名徐曼实验日期2012/11/28 实验目的和要求: (l)了解Windows内存管理机制,理解页式存储管理技术。 (2)熟悉Windows内存管理基本数据结构。 (3)掌握Windows内存管理基本API的使用。 实验原理与内容 使用Windows系统提供的函数和数据结构显示系统存储空间的使用情况,当内存和虚拟存储空间变化时,观察系统显示变化情况。 实验平台与要求 能正确使用系统函数GlobalMemoryStatus()和数据结构MEMORYSTATUS了解系统内存和虚拟空间使用情况,会使用VirtualAlloc()函数和VirtualFree()函数分配和释放虚拟存储空间。 操作系统:Windows 2000或Windows XP 实验平台:Visual Studio C++ 6.0 实验步骤与记录 1、启动安装好的Visual C++ 6.0。 2、选择File->New,新建Win32 Console Application程序, 由于内存分配、释放及系统存储 空间使用情况均是Microsoft Windows操作系统的系统调用,因此选择An application that support MFC。单击确定按钮,完成本次创建。 3、创建一个支持MFC的工程,单击完成。

操作系统-实验三

操作系统-实验三 文件系统的用户界面 一、实验目的 进一步理解、使用和掌握文件的系统调用、文件的标准子例程,能利用和选择这些基本的文件操作完成复杂的文件处理工作。 二、实验题目 1.编写一个文件复制的C语言程序:分别使用文件的系统调用read(fd, buf, nbytes), write(fd, buf, nbytes)和文件的库函数fread(buf, size, nitems, fp), fwrite(buf, size, nitems, fp),编写一个文件的复制程序(文件大小>1M ),文件可以编一个C 程序来生成,或使用/usr/bin下的二进制执行文件。 调用格式例如: copy file1 file2 #include main(int argc, char*argv[]) { … fd1=open(argv[1], O_RDONLY); //系统调用 creat (argv[2], 0660); fd2=open(argv[2], O_WRONL Y); while((n=read(fd1, buf, BUFSIZE))>0) write(fd2, buf, n); … main带参的调用方法例(含测试时间): time ./mycp infile outfile 流文件的实验程序请参考该程序完成。

上述函数中nbytes, size和nitems都取值为1时(即一次读写一个字节),比较系统调用和流文件两种程序的执行效率。当nbytes取4096字节,size取1字节且nitems取4096时(即一次读写4096字节),再次比较这两种程序的执行效率(文件大小>1M)。如: 创建大文件的方法之一,比如用creat 创建一个新文件,用open写打开该文件,用lseek将写指针移到很远处,写入随便一个字符。比如移动0x100000,用write写个“1”,就会得到一个1M大小的文件。也可到Linux的/usr/bin找一个1~3M左右的大的执行文件。 对于单独使用的速度较快的计算机,文件要10M~100M。 2.编写一个父子进程之间用无名管道进行数据传送的C程序。父进程逐一读出一个文件的内容,并通过管道发送给子进程。子进程从管道中读出信息,再将其写入一个新的文件。程序结束后,对原文件和新文件的内容进行比较。 3.在两个用户的独立程序之间,使用有名管道,重新编写一个C程序,实现题2的功能。 三、源代码 1.编写一个文件复制的C语言程序:分别使用文件的系统调用read(fd, buf, nbytes), write(fd, buf, nbytes)和文件的库函数fread(buf, size, nitems, fp), fwrite(buf, size, nitems, fp),编写一个文件的复制程序。 程序一 #define BUFSIZE 4096 #include #include #include #include int main(int argc, char *argv[]) { printf("这个是一次4096个字节的运行结果:\n");

Windows操作系统实验三实验报告

Windows操作系统C/C++ 程序实验 姓名:___________________ 学号:___________________ 班级:___________________ 院系:___________________ ______________年_____月_____日

实验三Windows 2000/xp线程同步 一、背景知识 二、实验目的 在本实验中,通过对事件和互斥体对象的了解,来加深对Windows 2000/xp线程同步的理解。 1) 回顾系统进程、线程的有关概念,加深对Windows 2000/xp线程的理解。 2) 了解事件和互斥体对象。 3) 通过分析实验程序,了解管理事件对象的API。 4) 了解在进程中如何使用事件对象。 5) 了解在进程中如何使用互斥体对象。 6) 了解父进程创建子进程的程序设计方法。 三、工具/准备工作 在开始本实验之前,请回顾教科书的相关内容。 您需要做以下准备: 1) 一台运行Windows 2000/xp Professional操作系统的计算机。 2) 计算机中需安装V isual C++ 6.0专业版或企业版。 四、实验内容与步骤 1. 事件对象 清单4-1程序展示了如何在进程间使用事件。父进程启动时,利用CreateEvent() API创建一个命名的、可共享的事件和子进程,然后等待子进程向事件发出信号并终止父进程。在创建时,子进程通过OpenEvent() API打开事件对象,调用SetEvent() API使其转化为已接受信号状态。两个进程在发出信号之后几乎立即终止。 步骤1:登录进入Windows 2000/xp Professional。 步骤2:在“开始”菜单中单击“程序”-“Microsoft V isual Studio 6.0”–“Microsoft V isual C++ 6.0”命令,进入V isual C++窗口。 步骤3:在工具栏单击“打开”按钮,在“打开”对话框中找到并打开实验源程序3-1.cpp。 步骤4:单击“Build”菜单中的“Compile 3-1.cpp”命令,并单击“是”按钮确认。系统

操作系统课程设计2014教学大纲

《操作系统课程设计》大纲 一、设计目的和要求 目的:本课程设计是为配合计算机相关专业的重要专业课《操作系统》而开设的,其主要内容是让学生实际进行操作系统功能模块的设计和编程实现。通过本课程设计的实施,使学生能将操作系统的概念具体化,并从整体和动态的角度去理解和把握操作系统,以巩固和补充操作系统的原理教学,提高学生解决操作系统设计及实现过程中的具体问题的能力。 要求:通过本课程设计的实施,要求培养学生以下能力: (1)培养学生在模拟条件下与实际环境中实现功能模块和系统的能力:课程设计要求学生实际进行操作系统功能模块的设计和编程实现,具体包括:基于线程的多任务调度系统的设计与实现;一个简单文件系统的设计与实现。 (2)培养学生设计和实施工程实验的能力,合理分析试验结果的能力:学生在完成项目的过程中,需要进行实验设计、程序调试、错误分析,从而熟悉实验设计方法及实验结果的分析方法。 (3)培养学生综合运用理论和技术手段设计系统和过程的能力:学生需根据设计项目的功能要求及操作系统原理的相关理论提出自己的解决方案,需考虑项目实现的软硬件环境,设计相关数据结构及算法,在实现过程中发现解决方案的问题并进行分析改进。 (4)培养学生分析并清楚阐述设计合理性的能力:要求学生在项目上机验收和实验报告中分析阐述设计思路的合理性和正确性。 (5)培养学生的组织管理能力、人际交往能力、团队协作能力:课程设计分小组进行,每个小组有一个组长,负责组织本组成员的分工及合作。 二、设计学时和学分 学时:32 ;学分:1 三、设计的主要内容 以下三个题目中:1、2中选做一题,第3题必做。 1、基于线程的多任务调度系统的设计与实现 (1)线程的创建、撤消和CPU切换。 掌握线程的定义和特征,线程的基本状态,线程的私有堆栈,线程控制块TCB,理解线程与进程的区别,实现线程的创建、撤消和CPU切换。 (2)时间片轮转调度 理解各种调度算法、调度的原因,完成时钟中断的截取,具体实现调度程序。 (3)最高优先权优先调度 理解优先权的概念,并实现最高优先权优先调度策略。 (4)利用记录型信号量实现线程的同步

操作系统课程设计实验大纲

《操作系统课程设计》实验指导手册 苏州大学计算机科学与技术学院 2009年9月

《操作系统课程设计》实验指导手册目录 目录 一、实验环境 二、实验内容 三、准备知识 四、实验步骤 实验一安装Red Hat Linux 实验二编译Linux内核 实验三观察Linux行为 实验四系统调用

一、实验环境 硬件平台:普通PC机硬件环境。 操作系统:Linux环境,Red Hat Linux 9.0以上版本,启动管理器使用LILO。 编译环境:伴随着操作系统的默认gcc环境。 工作源码环境:一个调试的内核源码,版本不低于2.4.18。 二、实验内容 本实验侧重于Linux操作系统的认识、应用,并对Linux内核进行初步探索。实验分为四个部分,每个部分大约2次实验。所有实验完成后,将在计算机上安装一个可用的Linux操作系统,并完成至少一个的可调试内核。 1.安装Red Hat Linux 2.编译Linux内核 3.观察Linux行为 4.系统调用

三、准备知识 1.Linux的内核 Unix操作系统家族将功能分为两类。首先,内核执行时CPU处于管态;其次,所有其他操作系统部件执行时CPU处于用户态。内核负责抽象与管理一台机器的硬件资源以及这些资源在执行程序之间的共享。因为Linux实现的是一种UNIX方式的接口,资源抽象和共享模型的通用定义已经被确定了。 资源抽象(Resource abstraction)是指编写软件(通常情况)来简化必须应用于硬件的操作以使该硬件能恰当的工作。Linux将计算机部件抽象为进程和资源。一个进程是执行一个目标程序的CPU操作的一个抽象。进程抽象使得操作系统能够控制一个程序中的每个实例的执行。操作系统中的所有执行进程抽象的所有方面称为进程管理。资源管理是创建资源抽象以及在进程执行时为它们分配和回收系统资源的过程。RAM是一种系统资源。另一种系统资源是CPU。内核的其他资源包括系统的所有设备,它们具有各自的抽象模型。UNIX 试图将除CPU和可执行内存之外的每一种资源视为一个文件。 Linux中,一个进程使用资源时,通常需要对该资源的独占使用。资源管理有两个关键的方面:对获得资源的竞争和对独占使用的确保。对资源的竞争由资源管理程序控制。操作系统必须包含一个部件来负责接收使用每个资源的请求、为一个进程分配资源,以及当一个进程释放资源时进行回收。如不能满足进程的资源请求,则阻塞该进程。Linux和其他现代操作系统用模式位来确保对系统资源,包括CPU、内存和设备的独占使用。模式位使系统可以工作在管态(supervisor mode)或用户态(user mode)。在一些情况下,两个或更多进程需要共享一个资源,Linux采用有控制的共享策略。 2.内核的组织结构 Linux内核被设计和实现为单内核。硬件设备日益发展,不断包括更新的设备,完全在一个设备驱动程序中提供适当的内核支持变得日益困难。Linux通过一个新的“容器”,称为模块(module),来解决这个问题,在模块中执行内核主要部分的扩展。 2.1 Linux的中断机制 同i386体系结构中的中断机制,使用cli()和sti()两个内核函数来清除和设置中断启用标志。 2.2 使用Linux的内核服务 用户将内核看作一个大的抽象数据类型(ADT),它保持状态并在其公共接口——系统调用接口上提供大量函数。在Linux中,系统调用接口名义上由POSIX.1规范定义。一个系统调用发生时,用户进程执行内核代码。存在一个问题,如何由用户进程(处在用户态)切换到内核代码(处在管态)? 具有模式位的CPU通常也具有硬件陷阱指令。陷阱指令(trap instruction)是一条用于将CPU转移到一个预定地址(有时作为一个指令操作数的函数)并将其自身切换为管态的指令。陷阱指令并不是一条特权指令,因此任何程序都可以执行一条陷阱指令。对于系统调用F,stub过程用于调用F。stub被链接到用户空间正调用的程序。一个进程在运行期间执行对F的调用,控制被转换到stub过程而不是直接转换到内核。利用陷阱指令和stub过程可以实现由用户空间向内核空间的安全转换。 2.3 串行执行 Linux的内核函数执行时处在一个临界区,即,一旦进程调用一个系统函数,该函数通

操作系统原理实验四

实验4 进程控制 1、实验目的 (1)通过对WindowsXP进行编程,来熟悉和了解系统。 (2)通过分析程序,来了解进程的创建、终止。 2、实验工具 (1)一台WindowsXP操作系统的计算机。 (2)计算机装有Microsoft Visual Studio C++6.0专业版或企业版。 3、预备知识 (3)·CreateProcess()调用:创建一个进程。 (4)·ExitProcess()调用:终止一个进程。 4、实验编程 (1)编程一利用CreateProcess()函数创建一个子进程并且装入画图程序(mspaint.exe)。阅读该程序,完成实验任务。源程序如下: # include < stdio.h > # include < windows.h > int main(VOID) ﹛STARTUPINFO si; PROCESS INFORMA TION pi; ZeroMemory(&si,sizeof(si)); Si.cb=sizeof(si); ZeroMemory(&pi,sizeof(pi)); if(!CreateProcess(NULL, “c: \ WINDOWS\system32\ mspaint.exe”, NULL, NULL, FALSE, 0, NULL, NULL, &si,&pi)) ﹛fprintf(stderr,”Creat Process Failed”); return—1; ﹜ WaitForSingleObject(pi.hProcess,INFINITE); Printf(“child Complete”); CloseHandle(pi.hProcess); CloseHandle(pi hThread); ﹜

操作系统实验

操作系统实验报告

实验一进程控制与描述 一、实验目的 通过对Windows 2000编程,进一步熟悉操作系统的基本概念,较好地理解Windows 2000的结构。通过创建进程、观察正在运行的进程和终止进程的程序设计和调试操作,进一步熟悉操作系统的进程概念,理解Windows 2000中进程的“一生”。 二、实验环境 硬件环境:计算机一台,局域网环境; 软件环境:Windows 2000 Professional、Visual C++ 6.0企业版。 三、实验内容和步骤 第一部分(共三个程序): Windows 2000 Professional下的GUI应用程序,使用Visual C++编译器创建一个GUI 应用程序,代码中包括了WinMain()方法,该方法GUI类型的应用程序的标准入口点。 程序1-1 # include # pragma comment(lib, “user32.lib” ) int APIENTRY WinMain(HINSTANCE /* hInstance */ , HINSTANCE /* hPrevInstance */, LPSTR /* lpCmdLine */, int /* nCmdShow */ ) { :: MessageBox( NULL, “Hello, Windows 2000” , “Greetings”, MB_OK) ; return(0) ; } 实验结果 然后改变参数,运行结果如下:

1-2显示了当前进程的优先级: 1-3进一步显示进程的具体情况: 第二部分:进程的“一生”(共三个程序) 1、创建进程 本程序展示的是一个简单的使用CreateProcess() API函数的例子。首先形成简单的命令行,提供当前的EXE文件的指定文件名和代表生成克隆进程的号码。大多数参数都可取缺省值,但是创建标志参数使用了:BOOL bCreateOK标志,指示新进程分配它自己的控制台,这使得运行示例程序时,在任务栏上产生许多活动标记。然后该克隆进程的创建方法关闭传

操作系统课内实验大纲(2014)

操作系统原理课内实验大纲(2014版) 实验一:用户接口实验 实验目的 1)理解面向操作命令的接口Shell。 2)学会简单的shell编码。 3)理解操作系统调用的运行机制。 4)掌握创建系统调用的方法。 操作系统给用户提供了命令接口和程序接口(系统调用)两种操作方式。用户接口实验也因此而分为两大部分。首先要熟悉Linux的基本操作命令,并在此基础上学会简单的shell 编程方法。然后通过想Linux内核添加一个自己设计的系统调用,来理解系统调用的实现方法和运行机制。在本次实验中,最具有吸引力的地方是:通过内核编译,将一组源代码变成操作系统的内核,并由此重新引导系统,这对我们初步了解操作系统的生成过程极为有利。 实验内容 1)控制台命令接口实验 该实验是通过“几种操作系统的控制台命令”、“终端处理程序”、“命令解释程序”和“Linux操作系统的bash”来让实验者理解面向操作命令的接口shell和进行简单的shell 编程。 查看bash版本。 编写bash脚本,统计/my目录下c语言文件的个数 2)系统调用实验 该实验是通过实验者对“Linux操作系统的系统调用机制”的进一步了解来理解操作系统调用的运行机制;同时通过“自己创建一个系统调用mycall()”和“编程调用自己创建的系统调用”进一步掌握创建和调用系统调用的方法。 编程调用一个系统调用fork(),观察结果。

编程调用创建的系统调用foo(),观察结果。 自己创建一个系统调用mycall(),实现功能:显示字符串到屏幕上。 编程调用自己创建的系统调用。 实验要求 1)按照实验内容,认真完成各项实验,并完成实验报告。 2)实验报告必须包括:程序清单(含注释)、实验结果、实验中出现的问题、观察到 的现象的解释和说明,以及实验体会。

操作系统实验报告

操作系统教程实验报告 专业班级 学号 姓名 指导教师

实验一WINDOWS进程初识 1、实验目的 (1)学会使用VC编写基本的Win32 Consol Application(控制台应用程序)。 (2)掌握WINDOWS API的使用方法。 (3)编写测试程序,理解用户态运行和核心态运行。 2、实验内容和步骤 (1)编写基本的Win32 Consol Application 步骤1:登录进入Windows,启动VC++ 6.0。 步骤2:在“FILE”菜单中单击“NEW”子菜单,在“projects”选项卡中选择“Win32 Consol Application”,然后在“Project name”处输入工程名,在“Location”处输入工程目录。创建一个新的控制台应用程序工程。 步骤3:在“FILE”菜单中单击“NEW”子菜单,在“Files”选项卡中选择“C++ Source File”, 然后在“File”处输入C/C++源程序的文件名。 步骤4:将清单1-1所示的程序清单复制到新创建的C/C++源程序中。编译成可执行文件。 步骤5:在“开始”菜单中单击“程序”-“附件”-“命令提示符”命令,进入Windows “命令提示符”窗口,然后进入工程目录中的debug子目录,执行编译好的可执行程序:E:\课程\os课\os实验\程序\os11\debug>hello.exe 运行结果 (如果运行不成功,则可能的原因是什么?) : (2)计算进程在核心态运行和用户态运行的时间 步骤1:按照(1)中的步骤创建一个新的“Win32 Consol Application”工程,然后将清单1-2中的程序拷贝过来,编译成可执行文件。 步骤2:在创建一个新的“Win32 Consol Application”工程,程序的参考程序如清单1-3所示,编译成可执行文件并执行。 步骤3:在“命令提示符”窗口中运行步骤1中生成的可执行文件,测试步骤2中可执行文件在核心态运行和用户态运行的时间。 E:\课程\os课\os实验\程序\os12\debug>time TEST.exe 步骤4:运行结果 (如果运行不成功,则可能的原因是什么?) : 步骤5:分别屏蔽While循环中的两个for循环,或调整两个for循环的次数,写出运行结果。 屏蔽i循环:

《操作系统大型实验》课程教学大纲

《操作系统大型实验》课程教学大纲 一、课程的性质和教学目标 课程性质: 本大型实验是“操作系统原理”课程的实践课程,旨在培养学生操作系统综合设计能力。 教学目标: 通过本课程,提高学生对于操作系统的认识,并从系统的可扩展性、可移植性和服务与对象的协调性方面着手,培养学生实际动手能力和解决实际问题的能力,提高学生运用工程化思想进行软/硬件系统解决方案构建和开发的能力。 1. 巩固和加深对操作系统原理的理解,提高综合运用本课程所学知识的能力。 2. 培养学生选用参考书,查阅手册及文献资料的能力。培养独立思考,深入研究,分析问题、解决问题的能力。 3. 通过实际操作系统的分析设计、编程调试,掌握系统软件的分析方法和工程设计方法。 4. 能够按要求编写课程设计报告书,能正确阐述设计和实验结果、正确绘制系统和程序框图。 二、课程支撑的毕业要求及其指标点 该课程支撑以下毕业要求和具体细分指标点: 【毕业要求3】设计/开发解决方案:能够设计针对复杂工程问题的解决方案,设计满足特定需求的系统、单元(部件)或工艺流程,并能够在设计环节中体现创新意识,考虑社会、健康、安全、法律、文化以及环境等因素。 支撑指标点3.1:能够针对复杂工程问题中的软件单个特定环节进行分析、设计,能发现问题、提出问题并就改进的可能性提出初步分析。 三、课程教学内容及学时分配 1.理论教学安排 以小组讨论、自主完成为主,不单独安排集中授课时间。 2.实践教学安排 实验要求一开发工具:word,visio等 1 / 3

阅读和分析Linux下的ROMFS文件系统代码(inode.c),说明其功能和实现的思路,给代码写出注释。 画出流程图。 实验要求二开发工具:word,vc,win32api 设计和实现一个模拟文件系统,要求包括目录、普通文件和文件的存储。必须有自定义的数据结构,不能直接调用windows 的API函数,即不能只实现一个壳。 文件系统的目录结构采用类似Linux的树状结构。 要求模拟的操作包括: 目录的添加、删除、重命名; 目录的显示(列表) 文件的添加、删除、重命名 文件和目录的拷贝 文件的读写操作 用户进入时显示可用命令列表;用户输入help时显示所有命令的帮助文档;输入某个命令+?时显示该条命令的使用说明。 用户输入exit时退出该系统。 实验实现基于windows平台。 实验开发语言必须选用C/C++,不能选用JA V A。 实验要求三开发工具:linux ,vim ,kdevelop 设计和实现一个模拟文件系统,要求包括目录、普通文件和文件的存储。。 文件系统的目录结构采用类似Linux的树状结构。 要求模拟的操作包括: 目录的添加、删除、重命名; 目录的显示(列表) 文件的添加、删除、重命名 文件和目录的拷贝 文件的读写操作 用户进入时显示可用命令列表;用户输入help时显示所有命令的帮助文档;输入某个命令+?时显示该条命令的使用说明。 用户输入exit时退出该系统。 实验实现基于LINUX平台。 实验开发语言必须选用C/C++,不能选用JA V A。 实验报告模板 该实验报告不采用统一的模板,但要求必须包含以下内容: 实验者身份信息,如班级姓名等 实验设计说明,如流程图,类图等; 2 / 3

操作系统原理实验五

实验五线程的同步 1、实验目的 (1)进一步掌握Windows系统环境下线程的创建与撤销。 (2)熟悉Windows系统提供的线程同步API。 (3)使用Windows系统提供的线程同步API解决实际问题。 2、实验准备知识:相关API函数介绍 ①等待对象 等待对象(wait functions)函数包括等待一个对象(WaitForSingleObject ())和等待多个对象(WaitForMultipleObject())两个API函数。 1)等待一个对象 WaitForSingleObject()用于等待一个对象。它等待的对象可以为以下对象 之一。 ·Change ontification:变化通知。 ·Console input: 控制台输入。 ·Event:事件。 ·Job:作业。 ·Mutex:互斥信号量。 ·Process:进程。 ·Semaphore:计数信号量。 ·Thread:线程。 ·Waitable timer:定时器。 原型: DWORD WaitForSingleObject( HANDLE hHandle, // 对象句柄 DWORD dwMilliseconds // 等待时间 ); 参数说明: (1)hHandle:等待对象的对象句柄。该对象句柄必须为SYNCHRONIZE访问。 (2)dwMilliseconds:等待时间,单位为ms。若该值为0,函数在测试对象的状态后立即返回,若为INFINITE,函数一直等待下去,直到接收到 一个信号将其唤醒,如表2-1所示。 返回值: 如果成功返回,其返回值说明是何种事件导致函数返回。

Static HANDLE hHandlel = NULL; DWORD dRes; dRes = WaitForSingleObject(hHandlel,10); //等待对象的句柄为hHandlel,等待时间为10ms 2)等待对个对象 WaitForMultiple()bject()在指定时间内等待多个对象,它等待的对象与 WaitForSingleObject()相同。 原型: DWORD WaitForMultipleObjects( DWORD nCount, //句柄数组中的句柄数 CONST HANDLE * lpHandles, //指向对象句柄数组的指针 BOOL fWaitAll, //等待类型 DWORD dwMilliseconds //等待时间 ); 参数说明: (1)nCount:由指针 * lpHandles指定的句柄数组中的句柄数,最大数是MAXIMUM WAIT OBJECTS。 (2)* lpHandles:指向对象句柄数组的指针。 (3)fWaitAll:等待类型。若为TRUE,当由lpHandles数组指定的所有对象被唤醒时函数返回;若为FALSE,当由lpHandles数组指定的某一个 对象被唤醒时函数返回,且由返回值说明是由于哪个对象引起的函数 返回。 (4)dwMilliseconds:等待时间,单位为ms。若该值为0,函数测试对象的状态后立即返回;若为INFINITE,函数一直等待下去,直到接收到 一个信号将其唤醒。 返回值:、 如果成功返回,其返回值说明是何种事件导致函数返回。 各参数的描述如表2-2所示。

操作系统实验三 进程的创建#(精选.)

操作系统 实验报告 哈尔滨工程大学 软件学院

第一讲实验环境的使用 一、实验概述 1. 实验名称 进程的创建 2. 实验目的 练习使用EOS API函数CreateProcess创建一个进程,掌握创建进程的方法,理解进程和程序的区别。 调试跟踪CreateProcess函数的执行过程,了解进程的创建过程,理解进程是资源分配的单位。 3. 实验类型(验证、设计) 验证 4. 实验内容

二、实验环境 操作系统:windows xp 编译环境:OS Lab 语言:汇编语言、C语言 三、实验过程(每次实验不一定下面6条都写,根据实际情况定) 1.设计思路和流程图

main函数流程图 2. 需要解决的问题及解答 (1)在源代码文件NewTwoProc.c提供的源代码基础上进行修改,要求使用hello.exe同时创建10个进程。提示:可以使用PROCESS_INFORMATION类型定义一个有10个元素的数组,每一个元素对应一个进程。使用一个循环创建10个子进程,然后再使用一个循环等待10个子进程结束,得到退出码后关闭句柄。 答:后文中,有此题解决方案。 尝试根据之前对PsCreateProcess函数和PspCreateProcessEnvironment函数执行过程的跟踪调试,绘制一幅进程创建过程的流程图。

PspCreateThread创建 了进程的主线程 结束 (3)在PsCreateProcess函数中调用了PspCreateProcessEnvironment函数后又先后调用了PspLoadProcessImage和PspCreateThread函数,学习这些函数的主要功能。能够交换这些函数被调用的顺序吗?思考其中的原因。 答:PspCreateProcessEnvironment 的主要功能是创建进程控制块并且为进程创建了地址空间和分配了句柄表。PspLoadProcessImage是将进程的可执行映像加载到了进程的地址空间中。PspCreateThread创建了进程的主线程。这三个函数被调用的顺序是不能够改变的就向上面描述的加载可执行映像之前必须已经为进程创建了地址空间这样才能够确定可执行映像可以被加载到内存的什么位置在创建主线程之前必须已经加载了可执行映像这样主线程才能够知道自己要从哪里开始执行,执行哪些指令。因此不能交换他们的顺序。 3.主要数据结构、实现代码及其说明 主要定义一个有10个元素的数组,每一个元素对应一个进程。使用一个循环创建10个子进程,然后再使用一个循环等待10个子进程结束,得到退出码后关闭句柄 4.源程序并附上注释 #include "EOSApp.h" // // main 函数参数的意义: // argc - argv 数组的长度,大小至少为1,argc - 1 为命令行参数的数量。 // argv - 字符串指针数组,数组长度为命令行参数个数+ 1。其中argv[0] 固定指向当前 // 进程所执行的可执行文件的路径字符串,argv[1] 及其后面的指针指向各个命令行 // 参数。

相关文档
最新文档