东北大学操作系统实验报告Word格式.docx

上传人:b****4 文档编号:16568685 上传时间:2022-11-24 格式:DOCX 页数:27 大小:716.36KB
下载 相关 举报
东北大学操作系统实验报告Word格式.docx_第1页
第1页 / 共27页
东北大学操作系统实验报告Word格式.docx_第2页
第2页 / 共27页
东北大学操作系统实验报告Word格式.docx_第3页
第3页 / 共27页
东北大学操作系统实验报告Word格式.docx_第4页
第4页 / 共27页
东北大学操作系统实验报告Word格式.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

东北大学操作系统实验报告Word格式.docx

《东北大学操作系统实验报告Word格式.docx》由会员分享,可在线阅读,更多相关《东北大学操作系统实验报告Word格式.docx(27页珍藏版)》请在冰豆网上搜索。

东北大学操作系统实验报告Word格式.docx

publicvoidproduce(){

synchronized(object){

/*只有list为空时才会去进行生产操作*/

try{

while(!

list.isEmpty()){

System.out.println("

生产者"

+Thread.currentThread().getName()+"

waiting"

);

object.wait();

intvalue=9999;

list.add(value);

Runnable"

object.notifyAll();

//然后去唤醒因object调用wait方法处于阻塞状态的线程

}catch(InterruptedExceptione){

e.printStackTrace();

}

publicclassConsumer{

//用list存放生产之后的数据,最大容量为1

publicConsumer(Objectobject,ArrayList<

publicvoidconsmer(){

/*只有list不为空时才会去进行消费操作*/

while(list.isEmpty()){

消费者"

list.clear();

实验结果:

思考题:

(1)如何控制进程间的相互通信?

答:

主要有:

管道,信号,共享内存,消息队列

(2)什么是进程的同步?

什么是进程的互斥?

分别有哪些实现方式?

进程互斥是进程之间的间接制约关系。

当一个进程进入临界区使用临界资源时,另一个进程必须等待。

只有当使用临界资源的进程退出临界区后,这个进程才会解除阻塞状态。

进程同步也是进程之间直接的制约关系,是为完成某种任务而建立的两个或多个线程,这个线程需要在某些位置上协调他们的工作次序而等待、传递信息所产生的制约关系。

进程间的直接制约关系来源于他们之间的合作。

可以利用信号量来实现进程的同步与互斥。

实验二处理机调度

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

数据结构及符号说明:

typedefstructpb{//每个进程

charpname[5];

//进程的名字

charstatus[8];

//进程的状态

inttime;

//要求运行时间

intpri;

//进程的优先权

intcputime;

//cpu时间

structpb*p;

//队列结构,它的下一个。

}pbc,*pbcp;

流程设计:

voidattemper(pbcppbca){

pbcppItem=pbca->

p;

pbcppIterator=pbca->

while(pIterator!

=NULL){

if(pItem->

pri<

=pIterator->

pri&

&

pIterator->

time!

=0){

pItem=pIterator;

}

pIterator=pIterator->

}

if((pItem->

time-=1)==0){

pItem->

cputime+=1;

pri-=1;

strcpy(pItem->

status,"

finish"

else{

run"

pIterator=pbca->

while(pIterator!

if(pIterator->

cputime!

=0&

pIterator!

=pItem&

time!

=0){

pIterator->

strcpy(pIterator->

ready"

printPbc(pbca);

运行结果:

(1)处理机调度的目的?

主要还是为了优化软件的运行。

(2)你实现优先权调度算法的思想?

遍历一次,取出优先权最高的,判断该进程是否还要运行,要允许就运行它。

实验三存储管理

模拟分页式存储管理中硬件的地址转换和产生缺页中断。

用先进先出(FIFO)页面调度算法处理缺页中断。

intpaper_table[7][5]//7乘5的页表

char*oper_char[12]//每次操作

intoper_table[12][2]//指令序列的单元号和操作存储

intfifo_table[4]//先进先出表,记录那几个在内存中

intstaticcount=0;

//记下哪个先来的

核心代码:

voidscheduler(void)

{

inti,page,page_block,page_move;

for(i=0;

i<

12;

i++)

{

page=**(oper_table+i);

printf("

-----------------%d--------------------\n"

i);

if(*(*(paper_table+page)+1)==1){//在页表中

page_block=*(*(paper_table+page)+2);

page_move=*(*(oper_table+i)+1);

printf("

在内存中,块号:

%d;

偏移量:

%d;

物理地址:

%d\n"

page_block,page_move,page_block*128+page_move);

*(*(paper_table+count)+4)=1;

//修改变为1

fifo_print();

else{

if(*(*(paper_table+fifo_table[count%4])+4)==1){

printf("

缺页中断,被替换的页号为:

页修改存入硬盘\n"

fifo_table[count]);

*(*(paper_table+fifo_table[count%4])+4)=0;

}

else{

页被直接替换\n"

*(*(paper_table+page)+1)=1;

//移入内存,改变在内存中的标志为1

*(*(paper_table+fifo_table[count])+1)=0;

//改变在内存中的标志为0

*(*(paper_table+page)+2)=*(*(paper_table+fifo_table[count])+2);

//重置页表里的主存块号值

*(*(paper_table+fifo_table[count])+2)=0;

fifo_table[count%4]=*(*(oper_table+i)+0);

//更新fifo表

换入内存成功,块号:

\n"

count++;

count=count%4;

思考题:

(1)先进先出页面调度算法的思想?

基本思想:

先进入内存的页面先淘汰,后进入内存的后淘汰

(2)最近最少用(LRU)页面调度算法思想?

最近用的最少的最先淘汰。

(3)比较两种调度算法的效率(哪种调度算法使产生缺页中断的次数少)?

答:

从作业题我感觉最近最少使用优于先进先出。

(4)分析在什么情况下采用哪种调度算法更有利?

如果页访问高度随机的话,不见得LRU好,LRU是根据最近最少使用的来决定哪个页表被替换,但过去很多时候不能代表未来。

实验四文件系统

用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。

structTYPE_UFD//主文件目录

stringFile_Name;

//文件名

boolRead;

//是否可读可写可执行

boolWrite;

boolExecute;

intLength_File;

//文件长度

};

structTYPE_MFD//用户文件目录

stringUser_Name;

//用户名

TYPE_UFD*Pointer;

structTYPE_AFD//打开文件目录,即运行文件目录

intFile_ID;

//文件ID

intPointer;

classTYPE_FILE_SYSTEM//文件系统类

public:

voidInitial(void);

voidStart(void);

private:

int_Number_Users;

//用户数

int_Number_Files;

//文件数

int_MaxNumber_Open_Files;

//最大打开文件数

TYPE_MFD*_MFD;

TYPE_UFD*_UFD;

TYPE_AFD*_AFD;

voidTYPE_FILE_SYSTEM:

:

Start(void)

intUser_ID;

inti,temp_int;

stringtemp;

charchoice;

intNumber_Open_Files;

stringCommand;

TYPE_UFD*UFD;

do

do

{

cout<

<

"

已创建指令有:

createdeleteopendirdiropenwritereadlogoutshutdown\n\n"

;

请输入用户名:

"

cin>

>

User_Name;

for(User_ID=0;

User_ID<

_Number_Users;

User_ID++)

{

if(_MFD[User_ID].User_Name==User_Name)

break;

if(User_ID==_Number_Users)

cout<

用户名错误,请再次输入."

<

endl;

}while(User_ID==_Number_Users);

cout<

欢迎登录,"

User_Name<

!

UFD=_MFD[User_ID].Pointer;

for(i=0;

_MaxNumber_Open_Files;

_AFD[i].File_ID=-1;

Number_Open_Files=0;

C:

\\"

Command;

if(Command=="

dir"

打开用户"

的文件"

\t"

State\t"

Length\t"

Filename"

for(i=0;

_Number_Files;

{

if(UFD[i].Length_File!

=-1)

{

cout<

if(UFD[i].Read==true)

cout<

R"

else

-"

if(UFD[i].Write==true)

W"

if(UFD[i].Execute==true)

E"

UFD[i].Length_File;

UFD[i].File_Name<

}

}

elseif(Command=="

diropen"

OpenFilename"

if(_AFD[i].File_ID!

if(_AFD[i].Read==true)

if(_AFD[i].Write==true)

if(_AFD[i].Execute==true)

UFD[_AFD[i].File_ID].File_Name<

create"

if(UFD[i].Length_File==-1)

break;

if(i==_Number_Files)

cout<

Error:

已有名为"

_Number_Files<

的文件."

else

请输入新文件信息:

文件名:

cin>

temp;

UFD[i].File_Name=temp;

文件权限:

Read(y/n):

do

choice=getch();

}while(choice!

='

y'

&

choice!

n'

if(choice=='

UFD[i].Read=true;

else

UFD[i].Read=false;

Write(y/n):

UFD[i].Write=true;

UFD[i].Write=false;

Execute(y/n):

UFD[i].Execute=true;

UFD[i].Execute=false;

Length:

temp_int;

if(temp_int>

0)

UFD[i].Length_File=temp_int;

新文件"

已建立!

delete"

请输入文件名:

cin>

if((UFD[i].Length_File!

=-1)&

(UFD[i].File_Name==temp))

文件名错误,请再次输入."

UFD[i].Length_File=-1;

文件"

已删除."

open"

if(Number_Open_Files==_MaxNumber_Open_Files)

你已经打开了"

Number_Open_Files<

文件."

请输入文件名:

for(i=0;

if((UFD[i].Length_File!

break;

if(i==_Number_Files)

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 求职职场 > 社交礼仪

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1