没有合适的资源?快使用搜索试试~ 我知道了~
操作系统实验1-9.doc
资源推荐
资源详情
资源评论
操作系统实验 1-9
实验一 进程同步和互斥
(建议 4 学时)
一、实验目的
1.掌握临界资源、临界区概念及并发进程互斥、同步访问原理。
2.学会使用高级语言进行多线程编程的方法。
3.掌握利用 VC++或 Java 语言线程库实现线程的互斥、条件竞争,并编码实现 P、V
操作,利用 P、V 操作实现两个并发线程对有界临界区的同步访问。
4.通过该实验,学生可在源代码级完成进程同步互斥方案的分析、功能设计、编程实
现,控制进程间的同步、互斥关系。
二、实验要求
1.知识基础:学生应在完成进程和线程及调度等章节的学习后进行。
2.开发环境与工具:
硬件平台——个人计算机。
软件平台-Windows 操作系统,vc++语言或 Java 语言开发环境。
3.运用高级语言 VC++或 Java 语言线程库及多线程编程技术进行设计实现。
三、实验内容
1.实现临界资源、临界区、进程或线程的定义与创建。
2.利用两个并发运行的进程,实现互斥算法和有界缓冲区同步算法。
四、实验方案指导
该实验方案由以下几个关键设计项目组成:
1.并发访问出错。即设计一个共享资源,创建两个并发线程,二者并发访问该共享资
源。当没有采用同步算法设计时,线程所要完成的某些操作会丢失。
2.互斥锁。并发线程使用线程库提供的互斥锁,对共享资源进行访问。
3.软件方法。设计并编程实现计数信号量、P 操作函数、V 操作函数,并发线程通过
调用 P,V 操作函数实现线程的互斥。
4.同步访问多缓冲区。利用上面的软件方法完成 P,V 操作,可实现两个线程对多缓
冲区的同步访问。
五、实验方案实现范例
以下是对该项目中包含的部分设计功能的实现方法、实现过程、技术手段的描述,供师
生参考。
1.模拟线程并发运行。
假设我们使用 POSIX 线程库,而 POSIX 并没有真正提供线程间的并发运行需求。我们
设计的系统应支持符合 RR 调度策略的并发线程,每个线程运行一段时间后自动挂起,另一
个线程开始运行。这样一个进程内所有线程以不确定的速度并发执行。
2.模拟一个竞争条件——全局变量。
创建两个线程 tl 和 t2,父线程主函数 main()定义两个全局变量 accntl 和 accnt2,每个变
量表示一个银行账户,初始化为 0。每个线程模拟一个银行事务:将一定数额的资金从一个
账户转到另一个账户。每个线程读入一个随机值,代表资金数额,在一个账户上做减法,在
另一个账户上做加法,用两个变量记录两个账户的收支情况。良性情况下收支应平衡,即两
操作系统实验 1-9
个全局变量之和应为 0。
下面是每个线程的代码:
counter=0;
do{
tmp1=accnt1;
tmp2=accnt2;
r=random();
accnt1=tmp1+r;
accnt2=tmp2-r;
counter++;
}while(accnt1+accnt2==0);
printf(”%d”,counter);
=====================================================================
两个线程运行的代码相同,只要各自代码不被交叉执行,两个收支余额之和就应一直为
如果线程被交叉执行,某个线程可能会读入一个旧的 accntl 值和一个新的 accnt2 值,或
反,这样会导致某个值的丢失。当这种情况出现时,线程停止运行,并把出现情况的位置
Counter 的值)打印出来。
3.模拟一个竞争条件——共享文件。
主线程创建两个共享文件 fl 和 f2,每个文件包含一个当前银行账户。线程使用随机数
对文件进行读/写,方式同上。注意:文件在读/写过程中不要加互斥访问锁,以免不会出
现交叉访问的情况。
4.测试出现一个竞争条件的时间。
我们的编程环境中,一般无法支持线程的 RR 调度,必须编程实现两个线程间在两个赋
值语句之间插入以下代码:在指定区间(比如 0 到 1)生成一个随机数,小于一个极限值
(如 0.1),调用线程自动挂起函数 jield(),自动放弃 CPU,另一运行,于是导致一个数据更
新的丢失。
5.互斥锁。
POSIX 线程库提供一个二值信号量,称为 MUTEX,它可以加锁或解锁。如果已被另一
个线程加上锁的 MUTEX 加锁,就会引发该线程被阻塞,MUTEX 解锁时唤醒它。使用这些
原语,很容易实现互斥进入 CS(临界区)。进入 CS 区时加锁,离开 CS 区时解锁。系统负
责阻塞或唤醒线程。
6.用软件方法实现互斥访问临界区。
用标准编程语言设置变量的值,用线程“忙等待”实现互斥访问 CS。设计两线分代码如
下:
=====================================================================
int cl=0,c2=0,will_wait;
p1: while(l) {
cl=l;
will_wait=l;
while(c2&&(will_wait ==1)); /*忙等待*/
csl;
cl=0;programl;
}
p2: while(l) {
操作系统实验 1-9
c2=1;
will_wait= 2;
while(cl&&(will_wait==2); /* 忙等待*/
cs2;
c2=0;program2;
}
=====================================================================
该软件方法使用三个变量 cl,c2,will_wait,解决两个线程的同步问题。两个线程分别
将 c1 和 c2 设置为 1,表示自己试图进入临界区,并将 will_wait 分别设置为 1 和 2,以消除
任何竞争条件。通过“忙等待”循环实现线程的阻塞。当线程退出 CS 区时,分别将变量 c1
和 c2 设置为 0。
我们可以比较互斥锁和软件方法这两种解决方法的效率。可以通过重复相同的循环次数,
测量各自的执行时间,尽量减少可能的外部干扰,重复测试几次,并计算平均值。
操作系统实验 1-9
实验二 进程及其资源管理
(建议 4 学时)
一、实验目的
1.理解资源共享与互斥特性,以及操作系统管理资源的基本方法。
2.学会使用高级语言进行多线程编程的方法。
3.掌握利用 VC++或 Java 线程库实现一个管理器,用来实现操作系统对进程及其资源
的管理功能。
4.通过该实验,学生可在源代码级完成进程及其资源管理方案的分析、功能设计、编
程实现,控制进程间的同步、互斥关系。
二、实验要求
1.知识基础:学生应在完成对进程和线程、调度、死锁等章节的学习后进行。
2.开发环境与工具:
硬件平台——个人计算机。
软件平台——Windows 操作系统,根据需要,任选安装 VC++语言、java 语言或 C
语言开发环境。
三、实验内容
1.开发一个函数,建立进程控制块和资源控制块结构,并实现相关数据结构的初始化。
2.开发一系列操作,由进程调用这些操作,达到控制进程申请或释放各种资源的目的。
四、实验方案指导
该实验方案由以下几个关键设计项目组成:
1.进程数据结构表示。
2.资源数据结构表示。
3.进程对资源的操作。
4.调度程序。
5.用户功能 shell 界面。
五、实验方案实现范例
以下是对该项目中包含的设计功能的实现方法、实现过程、技术手段的描述,供师生
参考。
1.进程数据结构表示。
使用结构类型设计实现进程 PCB 表,它包含以下成员:①进程 ID——进程的唯一标识,
供其他进程引用该进程;②内存——是一个指针链表,它在创建进程时已申请完毕,可用
链表实现;③其他资源——表示除去内存之外的所有资源;④进程状态——包括两个数据
类型,一个是状态码,另一个是状态队列链表指针;⑤生成树——包括两个数据类型,本
进程的父进程和本进程的子进程;⑥优先级——供进程调度程序使用,用来确定下一个运
行进程,可以设定为静态整数。
2.资源数据结构。
每个资源都用一个称为资源控制块的数据结构表示。使用结构类型设计实现资源控制块
RCB。资源控制块包括以下字段成员:①RID-资源的唯一标识,由进程引用;②资源状态
——空闲/已分配;③等待队列——是被本资源阻塞的进程链表,本资源正被其他所有资
剩余15页未读,继续阅读
资源评论
是空空呀
- 粉丝: 171
- 资源: 3万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功