当前位置:文档之家› 操作系统实验1~9

操作系统实验1~9

================================================================ int cl=0,c2=0,will_wait;
p1: while(l) { cl=l; will_wait=l; while(c2&&(will_wait ==1)); /*忙等待*/ csl; cl=0;programl; }
态为空闲*/
else {
/*等待队列不为空*/
remove(r->waiting_list,q);
/*从等待队列中移出一个进程q*/
q->status.type=’ready’;
/*将进程q的状态设为就绪*/
q->status.list=RL;
/*进程q的状态指针指向就绪队列*/
insert(RL,q); }
二、实验要求 1.知识基础:学生应在完成对进程和线程、调度、死锁等章节的学
习后进行。 2.开发环境与工具: 硬件平台——个人计算机。 软件平台——Windows操作系统,根据需要,任选安装VC++语
言、java语言或C语言开发环境。
三、实验内容 1.开发一个函数,建立进程控制块和资源控制块结构,并实现相关
题。两个线程分别将c1和c2设置为1,表示自己试图进入临界区,并将 will_wait分别设置为1和2,以消除任何竞争条件。通过“忙等待”循环实 现线程的阻塞。当线程退出CS区时,分别将变量c1和c2设置为0。
我们可以比较互斥锁和软件方法这两种解决方法的效率。可以通过重 复相同的循环次数,测量各自的执行时间,尽量减少可能的外部干扰,
p2: while(l) { c2=1; will_wait= 2; while(cl&&(will_wait==2); /* 忙等待*/ cs2; c2=0;program2; }
================================================================ 该软件方法使用三个变量cl,c2,will_wait,解决两个线程的同步问
数据结构的初始化。 2.开发一系列操作,由进程调用这些操作,达到控制进程申请或释
放各种资源的目的。
四、实验方案指导 该实验方案由以下几个关键设计项目组成: 1.进程数据结构表示。 2.资源数据结构表示。 3.进程对资源的操作。 4.调度程序。 5.用户功能shell界面。
五、实验方案实现范例 以下是对该项目中包含的设计功能的实现方法、实现过程、技术手
重复测试几次,并计算平均值。
实验二 进程及其资源管理
(建议4学时) 一、实验目的
1.理解资源共享与互斥特性,以及操作系统管理资源的基本方法。 2.学会使用高级语言进行多线程编程的方法。
3.掌握利用VC++或Java线程库实现一个管理器,用来实现操作系统 对进程及其资源的管理功能。
4.通过该实验,学生可在源代码级完成进程及其资源管理方案的分 析、功能设计、编程实现,控制进程间的同步、互斥关系。
/*进程q插入就绪队列*/
scheduler( );
/*调度程序运行选择下一个运行进程*/
================================================================
4.调度程序。
调度策略采用固定优先级和可剥夺优先级调度算法。即调度程序必
须维护n个不同优先 级的就绪队列,各就绪队列可为空,也可包含多个
scheduler( );
/*调度程序运行选择下一个运行进程*/
release(RID)
/*释放资源算法*/
{ r=get_RCB(RID);
/*获取资源控制块首地址*/
remove(self->other_resource,r);
/*从进程资源链表中删除该资源
*/
if(waiting_list==NULL) r->status=’free’; /*等待队列为空,置资源状
If(self->priority<p->priority)||self->status.type!=’running’||self= nil)
态数据,系统启动时初始化。
3.进程管理及进程对资源的操作。
进程操作及进程状态转换归纳如下:①进程创建——(无)→就绪;
②申请
行→阻塞;③资源释放——阻塞→就绪;④删除进程——(任何状态)
→(无);
——就绪→运行或运行→就绪。
具体实现步骤如下:
(1)根据上述数据结构,用高级语言设计相应函数,分别实现创建进
使用,用来确定下一个运行进程,可以设定为静态整数。
2.资源数据结构。
每个资源都用一个称为资源控制块的数据结构表示。使用结构类型设
计实现资源控制块RCB。资源控制块包括以下字段成员:①RID-资源的
唯一标识,由进程引用;②资源状态——空闲/已分配;③等待队列
——是被本资源阻塞的进程链表,本资源正被其他所有资源都设定为静
2.模拟一个竞争条件——全局变量。 创建两个线程tl和t2,父线程主函数main()定义两个全局变量accntl和 accnt2,每个变 量表示一个银行账户,初始化为0。每个线程模拟一个 银行事务:将一定数额的资金从一个 账户转到另一个账户。每个线程 读入一个随机值,代表资金数额,在一个账户上做减法,在 另一个账 户上做加法,用两个变量记录两个账户的收支情况。良性情况下收支应 平衡,即两 个全局变量之和应为0。 下面是每个线程的代码:
段的描述,供师生参考。 1.进程数据结构表示。 使用结构类型设计实现进程PCB表,它包含以下成员:①进程ID——
进程的唯一标识, 供其他进程引用该进程;②内存——是一个指针链 表,它在创建进程时已申请完毕,可用链表实现;③其他资源——表示 除去内存之外的所有资源;④进程状态——包括两个数据类型,一个是 状态码,另一个是状态队列链表指针;⑤生成树——包括两个数据类 型,本进程的父进程和本进程的子进程;⑥优先级——供进程调度程序
4.同步访问多缓冲区。利用上面的软件方法完成P,V操作,可实 现两个线程对多缓冲区的同步访问。
五、实验方案实现范例 以下是对该项目中包含的部分设计功能的实现方法、实现过程、技术
手段的描述,供师生参考。 1.模拟线程并发运行。 假设我们使用POSIX线程库,而POSIX并没有真正提供线程间的并发
运行需求。我们设计的系统应支持符合RR调度策略的并发线程,每个 线程运行一段时间后自动挂起,另一 个线程开始运行。这样一个进程 内所有线程以不确定的速度并发执行。
有当优先级高于自己的所有进程都运行完毕,或都进入阻塞 状态时,
它才能得到运行权。
为了简化调度程序,我们假定系统中至少有一个进程处于就绪态。为
确保这一点,设计 一个特殊进程init,该进程在系统初始化时自动创
建,并赋予最低优先级0级。init进程有两个作用:充当闲逛进程,该进
程运行时不申请任何资源,以免被阻塞;作为第一个被创建的进程,它
实验一 进程同步和互斥
(建议4学时) 一、实验目的
1.掌握临界资源、临界区概念及并发进程互斥、同步访问原理。 2.学会使用高级语言进行多线程编程的方法。 3.掌握利用VC++或Java语言线程库实现线程的互斥、条件竞争,并 编码实现P、V操作,利用P、V操作实现两个并发线程对有界临界区的 同步访问。 4.通过该实验,学生可在源代码级完成进程同步互斥方案的分析、 功能设计、编程实现,控制进程间的同步、互斥关系。
4.测试出现一个竞争条件的时间。 我们的编程环境中,一般无法支持线程的RR调度,必须编程实现两 个线程间在两个赋值语句之间插入以下代码:在指定区间(比如0到1) 生成一个随机数,小于一个极限值(如0.1),调用线程自动挂起函数 jield(),自动放弃CPU,另一运行,于是导致一个数据更新的丢失。 5.互斥锁。 POSIX线程库提供一个二值信号量,称为MUTEX,它可以加锁或解 锁。如果已被另一个线程加上锁的MUTEX加锁,就会引发该线程被阻 塞,MUTEX解锁时唤醒它。使用这些原语,很容易实现互斥进入 CS(临界区)。进入CS区时加锁,离开CS区时解锁。系统负责阻塞或 唤醒线程。 6.用软件方法实现互斥访问临界区。 用标准编程语言设置变量的值,用线程“忙等待”实现互斥访问CS。 设计两线分代码如下:
没有父进程,可创建比自己优先级高的其他进程。所以init进程是进程
生成树的根进程。
采用优先级策略的调度程序的常见结构知下所示:
================================================================
scheduler()
{ 找出最高优先级进程p;
request(RID)
/*申请资源算法*/
{ r=get_RCB(RID);
/*获取资源控制块首地址*/
if (r->status= =’free’ ) {
/*资源可用*/
r->status=’allocated’;
/*分配给调用进程,*/
insert(self->other_resources,r); } /*插入一个RCB指针指向进程
进程。0级进程优先级最低,n-l级进程优先级最高。创建进程时就赋予
了固定的优先级,并在进程的生存期内保持不变。当新进程创建或阻塞
进程被唤醒时,它就被插入同级的就绪队列中。
调度程序按“先来先服务”和优先级“从高到低”的方式处理就绪队列。
即从最高优先 级的非空就绪队列的队首选择一个进程进入运行态。这
样的调度策略很容易导致"饥饿",进 程出现。因为对进程q来说,只
资源链表;*/
else {
/*资源不可用*/
相关主题