OS实验报告格式4000字.docx
- 文档编号:9677667
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:26
- 大小:24.25KB
OS实验报告格式4000字.docx
《OS实验报告格式4000字.docx》由会员分享,可在线阅读,更多相关《OS实验报告格式4000字.docx(26页珍藏版)》请在冰豆网上搜索。
OS实验报告格式4000字
2012-2013学年第一学期
计算机操作系统实验报告实验一windows多线程
【开发语言及实现平台或实验环境】
c++/c#
microsoftvisualstudio6.0/microsoftvisualstudio.net
【实验目的】
(1)进一步理解操作系统的并发性;
(2)了解windows线程创建方法,并通过查阅资料理解各参数的含义;
(3)了解多线程程序设计方法,并进行简单应用。
【实验要求】
(1)逐程序进行简要分析、运行各程序并仔细阅读注释;
(2)查阅msdn或其他资料,掌握相关系统调用使用方法和参数含义;
(3)完成实验报告。
【实验结果与分析】
1
sleep是阻塞线程函数。
它会在当前语句阻塞一段时间,参数是以1/1000秒为单位的,线程1和主线程并发执行,sleep(10)使当前线程放弃目前的时间片,并且在10ms内不会被再次调度。
会使主进程和分进程同时被调度,进程也有父子关系。
父进程退出后子进程也会退出,而加入sleep后主进程先停止10后子进程就有时间进行了。
加入循环,使得俩个进程交替执行,出现俩个1,俩个6是因为不可再现性,即俩个进程同时迈出同一部步,俩个进程中存在共享变量。
因为加入while所以不需要sleep,父子进程也能同时进行。
2
加入sleep(1000)后父进程有足够的时间运行子进程
3
加入俩个sleep
(1)后,有可能到thread1isselltickets:
时间片就停了,tickets没--,还可以运行thread2isselltickets:
<<tickets—也就是说tickets变为0,返回再运行thread1isselltickets时就卖0号票了
【实验思考及总结】
………………………
加入循环,使得俩个进程交替执行
sleep是阻塞线程函数。
它会在当前语句阻塞一段时间,参数是以1/1000秒为单位的线程也有父子关系。
父进程退出后子进程也会退出
不可再现性,即俩个进程同时迈出同一部步,俩个进程中存在共享变量
4实验二windows线程同步机制
【开发语言及实现平台或实验环境】
c++/c#
microsoftvisualstudio6.0/microsoftvisualstudio.net
【实验目的】
(1)了解windows线程同步机制;
(2)了解互斥体,并通过查阅资料理解互斥体对象的使用方法;
(3)了解事件,并通过查阅资料理解事件对象的使用方法;
(4)了解关键区,并通过查阅资料理解关键区对象的使用方法;
(5)了解信号量,并通过查阅资料理解信号量对象的使用方法;
(6)利用windows线程同步机制,模拟生产者消费者问题。
【实验要求】
(1)逐程序进行简要分析、运行各程序并仔细阅读注释;
(2)查阅msdn或其他资料,掌握相关系统调用使用方法和参数含义;
(3)完成实验报告。
【实验结果与分析】
5
2-1到2-3加入俩个sleep
(1)后,有可能到thread1isselltickets:
时间片就停了,tickets没--,还可以运行thread2isselltickets:
<<tickets—也就是说tickets变为0,返回再运行thread1isselltickets时就卖0号票了
6
7
【实验思考及总结】
sleep(10)使当前线程放弃目前的时间片,并且在10ms内不会被再次调度进程也有父子关系。
父进程退出后子进程也会退出,线程之间的同步使用一些核心对象:
如thread,process,evnet,mutex,semaphore.在线程之间使用等待函数如
waitforsingleobjects,waitformultipleobjects.等待函数使用核心对象的handle作为参数,如果handle被激发,则执行下一步。
handle被激发的条件:
(handle是一段内存指针,为了掩藏内部实现而作的一个类型转化指针)激发:
---我的理解是资源未被战胜。
未激发:
---资源正在被占用。
eg:
1)thread,process被终止,则激发。
2)event:
要通过它的api来手动激发,是最灵活的激发方式,可被所有线程使用。
3)mutex:
没被任何线程所拥有,则激发。
1)临界区:
critical_section适用范围:
单一进程的各线程之间用来排它性占有特性:
局部性对象;快速而有效.无法监测是否被线程放弃函数:
entercriticalsection
leavecriticalsection
2)mutex:
适用范围:
不同线程之间用来排它性占有特性:
核心对象,可以使用wait进行等待,只能被拥有线程所释放函数:
createmutexreleasemutex
3)semaphore:
信号量适用范围:
用来限制资源占用特性:
核心对象,没有拥有者,任何线程都可释放函数:
createsemaphoreopensemaphorereleasesemaphore
84)event:
适用范围:
同来控制对象信号的接收,常与信号系统结合起来特性:
核心对象函数:
createeventopeneventpulseeventseteventresetevent5)interlocked简单的原子操作,如写文件中对文件中字节范围的锁定_locking
note:
线程同步中很重要的可归纳为锁系统lock和信号系统signallock包
括:
critical_section,mutex,waitfunction:
waitformultipleobjects
示例1:
event//事件机制:
设置一个全局event对象,这个只能等待最多64个对象,而且要用waitformultipleobjects来监视线
createevent(null,//defaultsecurityattributestrue,//manual-reseteventfalse,//initialstateis
nonsignaledtext(writeevent)//objectname);//
(2)产生一堆线程,设置事件响应信号signal,if(!
setevent(ghwriteevent)){printf(seteventfailed(%d)/n,getlasterror());return;}//(3)设置线程等待事件,所有线程都接到这个事件,,这里对线程进行了同步,只有所有线程都执行了,才执行下一步dwwaitresult=waitformultipleobjects(threadcount,//numberofhandlesin
arrayghthreads,//arrayofthreadhandlestrue,//waituntilallaresignaledinfinite);{//(3.1)其中每个线程函数都在等待事件对象,这里也对线程进行了同步,只有得到signal的线程才执行下一步dwwaitresult=
waitforsingleobject(ghwriteevent,//eventhandleinfinite);//indefinitewait
}//(4)关闭了这个全局事件==closehandle(ghwriteevent)closeevents();
createthread--(workerthread)--
9实验三windows线程通信
【开发语言及实现平台或实验环境】
c++/c#
microsoftvisualstudio6.0/microsoftvisualstudio.net
【实验目的】
(1)了解window线程通信方法;
(2)了解匿名管道,并通过查阅资料理解匿名管道的使用方法;
(3)了解命名管道,并通过查阅资料理解命名管道的使用方法;
【实验要求】
(1)逐程序进行简要分析、运行各程序并仔细阅读注释;
(2)查阅msdn或其他资料,掌握相关系统调用使用方法和参数含义;
(3)完成实验报告。
【实验结果与分析】
【实验思考及总结】
学会了在vc6.0中open已经编译好的程序,选择所有文件,线程之间通信的两个基本问题是互斥和同步。
线程同步是指线程之间所具有的一种制约关系,一个线程的执行依赖另一个线程的消息,当它没有得到另一个线程的消息时应等待,直到消息到达时才被唤醒。
线程互斥是指对于共享的操作系统资源(指的是广义的资源,而不是windows的.res文件,譬如全局变量就是一种共享资源),在各线程访问时的排它性。
当有若干个线程都要使用某一共享资源时,任何时刻最多只允许一个线程去使用,其它要使用该资源的线程必须等待,直到占用资源者释放该资源。
线程互斥是一种特殊的线程同步。
实际上,互斥和同步对应着线程间通信发生的两种情况:
(1)当有多个线程访问共享资源而不使资源被破坏时;
(2)当一个线程需要将某个任务已经完成的情况通知另外一个或多个线程时。
在win32中,同步机制主要有以下几种:
(1)事件(event);
(2)信号量(semaphore);
(3)互斥量(mutex);
(4)临界区(criticalsection)。
全局变量
因为进程中的所有线程均可以访问所有的全局变量,因而全局变量成为win32多线程通信的最简单方式。
例如:
实验四银行家算法模拟
【开发语言及实现平台或实验环境】
c++/c#
microsoftvisualstudio6.0/microsoftvisualstudio.net2003
【实验目的】
(1)进一步理解利用银行家算法避免死锁的问题;
(2)在了解和掌握银行家算法。
(3)理解和掌握安全序列、安全性算法
【实验内容】
(1)编写安全性算法;
(2)编写银行家算法,并编制银行家算法通用程序,将调试结果显示在计算机屏幕上,再检测和笔算的一致性。
【源代码】
#include<iostream>
usingnamespacestd;
#include<string.h>
#include<stdio.h>
#definefalse0
#definetrue1
intmax[100][100]={0};//各进程所需各类资源的最大需求
intavaliable[100]={0};//系统可用资源
charname[100]={0};//资源的名称
intallocation[100][100]={0};//系统已分配资源
intneed[100][100]={0};//还需要资源
intrequest[100]={0};//请求资源向量
inttemp[100]={0};//存放安全序列
intwork[100]={0};//存放系统可提供资源
intm=100;//作业的最大数为100
intn=100;//资源的最大数为100
voidshowdata()//显示资源矩阵
{
inti,j;
cout<<系统目前可用的资源[avaliable]:
<<endl;
for(i=0;i<n;i++)cout<<name[i]<<;
cout<<endl;
for(j=0;j<n;j++)cout<<avaliable[j]<<;//输出分配资源
cout<<endl;
cout<<maxallocationneed<<endl;
cout<<进程名;
15for(j=0;j<3;j++){
for(i=0;i<n;i++)cout<<name[i]<<;
cout<<;
}
cout<<endl;
for(i=0;i<m;i++){
cout<<<<i<<;
for(j=0;j<n;j++)cout<<max[i][j]<<;
cout<<;
for(j=0;j<n;j++)cout<<allocation[i][j]<<;
cout<<;
for(j=0;j<n;j++)cout<<need[i][j]<<;
cout<<endl;
}
}
intchangdata(inti)//进行资源分配
{
intj;
for(j=0;j<m;j++){
avaliable[j]=avaliable[j]-request[j];
allocation[i][j]=allocation[i][j]+request[j];
need[i][j]=need[i][j]-request[j];
}
return1;
}
intsafe()//安全性算法
{
inti,k=0,m,apply,finish[100]={0};
intj;
intflag=0;
for(i=0;i<n;i++)
{
work[i]=avaliable[i];
}
for(i=0;i<m;i++){
apply=0;
for(j=0;j<n;j++){
if(finish[i]==false&&need[i][j]<=work[j]){
apply++;
if(apply==n){
for(m=0;m<n;m++)work[m]=work[m]+allocation[i][m];//变分配数
finish[i]=true;
temp[k]=i;i=-1;
k++;flag++;
16}
}
}
}
for(i=0;i<m;i++){
if(finish[i]==false){
cout<<系统不安全<<endl;//不成功系统不安全
return-1;
}
}
cout<<系统是安全的!
<<endl;//如果安全,输出成功
cout<<分配的序列:
;
for(i=0;i<m;i++){//输出运行进程数组
cout<<temp[i];
if(i<m-1)cout<<->;
}
cout<<endl;
return0;
}
voidshare()//利用银行家算法对申请资源对进行判定
{
charch;
inti=0,j=0;
ch=y;
cout<<请输入要求分配的资源进程号(0-<<m-1<<):
;
cin>>i;//输入须申请的资源号
cout<<请输入进程<<i<<申请的资源:
<<endl;
for(j=0;j<n;j++){
cout<<name[j]<<:
;
cin>>request[j];//输入需要申请的资源
}
for(j=0;j<n;j++){
if(request[j]>need[i][j])//判断申请是否大于需求,若大于则出错
{
cout<<进程<<i<<申请的资源大于它需要的资源;
cout<<分配不合理,不予分配!
<<endl;
ch=n;
break;
}
else{
if(request[j]>avaliable[j])//判断申请是否大于当前资源,若大于则
{
//出错
cout<<进程<<i<<申请的资源大于系统现在可利用的资源;
17cout<<分配出错,不予分配!
<<endl;
ch=n;
break;
}
}
}
if(ch==y){
changdata(i);//根据进程需求量变换资源
showdata();//根据进程需求量显示变换后的资源
safe();//根据进程需求量进行银行家算法判断
}
}
voidaddresources(){//添加资源
intn,flag;
cout<<请输入需要添加资源种类的数量:
;
cin>>n;
flag=n;
n=n+n;
for(inti=0;i<n;i++){
cout<<名称:
;
cin>>name[flag];
cout<<数量:
;
cin>>avaliable[flag++];
}
showdata();
safe();
}
voiddelresources(){//删除资源
charming;
inti,flag=1;
cout<<请输入需要删除的资源名称:
;
do{
cin>>ming;
for(i=0;i<n;i++)
if(ming==name[i]){
flag=0;
break;
}
if(i==n)
cout<<该资源名称不存在,请重新输入:
;
}
while(flag);
for(intj=i;j<n-1;j++){
name[j]=name[j+1];
18avaliable[j]=avaliable[j+1];
}
n=n-1;
showdata();
safe();
}
voidchangeresources(){//修改资源函数
cout<<系统目前可用的资源[avaliable]:
<<endl;
for(inti=0;i<n;i++)
cout<<name[i]<<:
<<avaliable[i]<<endl;
cout<<输入系统可用资源[avaliable]:
<<endl;
cin>>avaliable[0]>>avaliable[1]>>avaliable[2];
cout<<经修改后的系统可用资源为<<endl;
for(intk=0;k<n;k++)
cout<<name[k]<<:
<<avaliable[k]<<endl;
showdata();
safe();
}
voidaddprocess(){//添加作业
intflag=m;
m=m+1;
cout<<请输入该作业的最打需求量[max]<<endl;
for(inti=0;i<n;i++){
cout<<name[i]<<:
;
cin>>max[flag][i];
need[flag][i]=max[flag][i]-allocation[flag][i];
}
showdata();
safe();
}
intmain()//主函数
{
inti,j,number,choice,m,n,flag;
charming;
cout<<*****************资源管理系统的设计与实现*****************<<endl;cout<<请首先输入系统可供资源种类的数量:
;
cin>>n;
n=n;
for(i=0;i<n;i++){
cout<<资源<<i+1<<的名称:
;
cin>>ming;
name[i]=ming;
cout<<资源的数量:
;
cin>>number;
19avaliable[i]=number;
}
cout<<endl;
cout<<请输入作业的数量:
;
cin>>m;
m=m;
cout<<请输入各进程的最大需求量(<<m<<*<<n<<矩阵)[max]:
<<endl;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
cin>>max[i][j];
do{
flag=0;
cout<<请输入各进程已经申请的资源量(<<m<<*<<n<<矩阵)[allocation]:
<<endl;for(i=0;i<m;i++)
for(j=0;j<n;j++){
cin>>allocation[i][j];
if(allocation[i][j]>max[i][j])
flag=1;
need[i][j]=max[i][j]-allocation[i][j];
}
if(flag)
cout<<申请的资源大于最大需求量,请重新输入!
\n;
}
while(flag);
showdata();//显示各种资源
safe();//用银行家算法判定系统是否安全
while(true){
cout<<**************银行家算法演示***************<<endl;
cout<<1:
增加资源<<endl;
cout<<2:
删除资源<<endl;
cout<<3:
修改资源<<endl;
cout<<4:
分配资源<<endl;
cou
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- OS 实验 报告 格式 4000