一、实验目的
实验目的:通过实现生产者消费者问题的同步深入了解和掌握进程同步和互
斥的原理。
二、实验要求
设计要求:有一群生产者进程在生产产品,并将这些产品提供给消费者进程去消费。为使生产者进程与消费者进程能并发执行,在两者之间设置了一个具有n个缓冲区的缓冲池,生产者进程将他所生产的产品放入一个缓冲区中;消费者进程可从一个缓冲区中取走产品去消费。尽管所有的生产者进程和消费者进程都是以异步方式运行的,但他们之间必须保持同步,既不允许消费者进程到一个空缓冲去去取产品,也不允许消费者进程到一个空缓冲区去取产品,也不允许生产者进程向一个已经装满产品但未被取走的缓冲区中投放产品。
三、实验过程
实验过程中应注意:首先,在每个程序中用于实现互斥的wait(mutex)和signal(mutex)必须成对的出现:其次,对资源信号量empty和full的wait和signal操作,同样需要成对的出现,但他们分别处于不同的程序中。
代码见附件OS1.
四、实验总结
在这次实验中,通过对生产者消费者问题的学习,我了解了操作系统的实用性;一直以来,我都认为操作系统是完全理论性的知识,所以这次实习改变了我的这种错误观念,也坚定了我好好学习的信心。同时我发现学习操作系统这门课程还有很所益处,它可以让我们学习管理很多其他的东西。
这次的生产者消费者问题很好的巩固了课堂上所学习的信号量的知识,他和我们生活中的很多其他的问题相似,所以可以用这个问题解决很多生活中的其他的问题。
实习二 模拟银行家算法
一、实验目的
根据设计题目的要求,充分地分析和理解题目,叙述系统的要求,明确程序要求实现的功能以及限制条件。
明白自己需要用代码实现的功能,清楚编写每部分代码的目的,做到有的放矢,有条理不遗漏的用代码实现银行家算法。
二、实验要求
(1)可以输入某系统的资源以及T0时刻进程对资源的占用及需求情况的表项,以及T0时刻系统的可利用资源数。
(2)对T0时刻的进行安全性检测,即检测在T0时刻该状态是否安全。 (3)进程申请资源,用银行家算法对其进行检测,分为以下三种情况: A. 所申请的资源大于其所需资源,提示分配不合理不予分配并返回 B. 所申请的资源未大于其所需资源,但大于系统此时的可利用资源,提示分配不合理不予分配并返回。
C. 所申请的资源未大于其所需资源,亦未大于系统此时的可利用资源,预分配并进行安全性检查:
a. 预分配后系统是安全的,将该进程所申请的资源予以实际分配并打印后返回。
b. 与分配后系统进入不安全状态,提示系统不安全并返回。
(4)对输入进行检查,即若输入不符合条件,应当报错并返回重新输入。
三、实验过程
1、实习内容:
银行家算法是一种最具有代表性的避免死锁的算法。
要解释银行家算法,必须先解释操作系统的安全状态和不安全状态。 所谓安全状态,是指系统能按照某种进程顺序{P1,P2,…,Pn}(称{P1,P2,…,Pn }序列为安全序列),来为每个进程Pi分配其所需资源,直至满足每个进程对资源的最大需求,使每个进程都可以顺利完成。安全状态一定没有
死锁发生。
如果系统无法找到这样一个安全序列,则称系统处于不安全状态。 那么,什么是安全序列呢?
如果对每一个进程Pi(12、算法思路:
先对用户提出的请求进行合法性检查,即检查请求是否大于需要的,是否大于可利用的。若请求合法,则进行预分配,对分配后的状态调用安全性算法进行检查。若安全,则分配;若不安全,则拒绝申请,恢复到原来的状态,拒绝申请。
3、测试用例:
此次试验使用的是课本上(p110—p111页)的例子,即: 进程 最大需求量 占有量 需求量 可分配量 A B C A B C A B C A B C
P0 7 5 3 0 1 0 7 4 3 3 3 2 P1 3 2 2 2 0 0 1 2 2 (2 3 0) P2 9 0 2 3 0 2 6 0 0 P3 2 2 2 2 1 1 0 1 1 P4 4 3 3 0 0 2 4 3 1 代码见OS2.
四、 实验总结
银行家算法是避免死锁的主要方法,在银行家算法这个系统之中,采用了基本的数据结构,用了几个数组来表示各种信息,比如最大需求量Max[][]、已分配资源数Allocation[][]、仍需求资源数Need[][]、以及系统可利用的资源数、申请各类资源等数组。该算法最主要的用以实现系统功能的应该有两个部分,一是用银行家算法来判断,二是用安全性算法来检测系统的安全性。
这次实习让我深入的了解了解决死锁问题的一个方法,除此之外,还可以通过预防死锁,检测死锁,解除死锁来处理死锁问题。
实习三 页面调度算法
一、实验目的
通过自己编程来实现页面调度算法,进一步理解页面调度算法的概念及含义,提高对页面调度算法的认识,同时提高自己的动手实践能力。加深我们对主存与辅助存储器统一管理、逻辑地址与物理地址转换、部分装入和部分替换问题的理解,同时,有利于我们对虚拟存储技术的理解。
二、实验要求
利用C++,实现页面调度算法 1. 最优替换算法OPT 2. 先进先出调度算法 3. 最近最少调度算法
三、实验过程
不必装入进程的全部信息,仅将当前使用部分先装入主存,其余部分存放在磁盘中,待使用时由系统自动将其装起来。当进程所访问的程序和数据在主存中时,可顺利进行;如果处理器所访问的程序或数据不在主存中,为了继续执行,由系统自动将这部分信息从磁盘装入,叫做“部分装入”;如若此刻没有足够的空闲物理空间,便把主存中暂时不用的信息移至磁盘,叫做“部分替换”。
目前有许多页面调度算法,本实验主要涉及先进先出调度算法、最近最少调度算法、最近最不常用调度算法。本实验使用页面调度算法时作如下假设,进程在创建时由操作系统为之分配一个固定数目物理页,执行过程中物理页的数目和位置不会改变。也即进程进行页面调度时只能在分到的几个物理页中进行。
1.最优替换算法OPT
2. 先进先出调度算法 3.最近最少调度算法
缺页中断次数是缺页时发出缺页中断的次数 缺页中断率=用次缺页中断次数/总的页面引数*100% 代码见附录OS3.
四、 实验总结
这次实验主要是熟悉页面调度方法,分别有最佳值换算法,先进先出页面置换算法,最近最久未使用算法。先进先出置换算法效率是最差的,因为页面调入的先后顺序不能反映页面的使用情况。Lru算法性能较好,但是对硬件系统有较多的支持硬件。
实验四 文件的混合索引分配方式
一、实验目的
编写程序,模拟混合索引形式的文件系统。
二、实验要求
编写程序,模拟混合索引形式的文件系统。能接收建立、删除、读、写和查询属性的命令,并在模拟文件系统中进行操作。提供一个可供操作者建立、删除、读、写文件和查看文件属性的交互界面。
三、实验过程
1、文件索引块 typedef struct index{
int num;/*编号*/
unsigned long int len;/*文件长度*/ char type;/*类型*/
char ModiTime[27];/*文件建立/最后修改的时间*/ long iAddrDir0[8];/*直接索引*/
long iAddrDir1;/*一级索引*/ long iAddrDir2;/*二级索引*/ long iAddrDir3;/*三级索引*/ char used;
}I,*pI;
I findex[INDEX_ITEM_NUM];
2、文件目录表 typedef struct directory{
char fname[FNAMELEN]; int inum; char used;
}Dir,*pDir;
Dir fdir[DIR_ITEM_NUM];
3、位视图
char map[MAP_ROW_NUM][MAP_COLLUM_NUM]; 代码见OS4.
四、 实验总结
这是这门课程的最后一次实验了,这门课程让我认识到每一门课程都有它设置的必要性,在生活中都是可以用到的,并不是想我们所想的那样没有实用性。这次的实习主要是模拟混合索引形式的文件系统。这种方式有效的克服了变长记录文件不便于直接存取的缺点,而且所付出的代价也不算太大。
因篇幅问题不能全部显示,请点此查看更多更全内容