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