More Related Content
Similar to 实验五 读者 写者问题 (20)
实验五 读者 写者问题
- 1. 实验五 读者 - 写者问题
实验教材:课本第 9 章
2011.11.19
4 课时
- 2. 处理机调度实验问题
算法流程图
课本上代码两处问题
时间片用完之后,没有比较当前进程与就绪队
列中有最大优先权进程的优先数
运行过程中有的测试用例会导致丢失个别进程
随机数产生函数
- 3. 读者 - 写者问题
实验目的
实验内容
实验原理
实验指导
相关进程间通信( IPC )函数说明
- 4. 实验目的
理解进程同步的原理和机制
通过读者— 写者问题的设计与实现进一步
掌握进程同步在实际中的应用
- 5. 实验内容
编写读者— 写者问题的程序,要求如下:
在 Linux 下用 C 编程,利用信号量操作实现进程同
步;
读写请求随机产生(比如敲击键盘上的 r 和 w )
,并动态显示当前的状态(读的时候有多少读者,
有多少个写者在等待;写的时候是谁在写,还有多
少写者和读者在等待),每个读者和写者用的时间
可以预先设定。
本例中,有一个初始化的数组,读者和写者均
是对此数组进行操作。写者是随机对数组中的
数字进行修改,修改的值也是随机的,这样更
直观、更有助于理解。
- 6. 实验原理
同步
同步是指进程间共同完成一项任务时直接发生相互作用的关
系,即进程在执行的时间顺序上必须遵循特定的次序,这种
时序关系称为同步关系。例如: B 进程在运行时需要 A 进程
的输出结果作为资源,那么 A 进程必须在 B 进程执行之前完
成,这就确定了 A 、 B 两进程间的同步关系。
互斥
这是一种更常见的进程之间的相互关系,通常是由于多个进
程共享某些资源而引起的,而这些进程往往彼此独立。例如
:系统只有一台打印机,有两个进程同时使用它输出数据的
话,打印结果将使这两个进程的输出内容混杂在一起。为了
保证共享临界资源的各个进程都能正确运行,当临界资源被
一个进程访问时,其他访问进程必须等待。多个进程在共享
临界资源时的这种制约关系称为进程互斥。
- 7. 实验指导
设有一组共享数据 DB 和两组并发进程 , 一组进程只对此
组数据执行读操作 , 另一组进程可对此组数据执行写操作
( 同时也可以执行读操作 ) ,将前一组进程称作读者,后
一组进程称作写者。为了保证共享数据的完整性,要求:
多个读者的操作可以同时进行;
多个写者的操作不可同时进行;
任何读者与写者的操作不可同时进行。
DB
R1 … Rm W1 … Wn
- 8. 实验指导
实验的流程图如图所示 开始
随机产生一组数
随机在某位置读取 r w 随机在某个位置写入
内容 用户的选择 某随机数
N N
读者是否已经全部读完 写者是否已经全部写完
Y Y
写者是否已经全部写完 读者是否已经全部读完
N N
Y Y
结束
- 9. 相关进程间通信( IPC )函数说明
sembuf 结构
sem_num 欲处理的信号编码, 0 表示第一个信号
sem_op
大于 0 ,加到 semval 中
等于 0 , semop() 函数会等到 semval 降为 0 ,除非 sem_flg
设为 IPC_NOWAIT
小于 0 ,若 semval>=|sem_op|, 则 semval-|sem_op| 反之,且
sem_flg=IPC_NOWAIT 则 semop 返回错误
sem_flg 操作符,可为 0 、 IPC_NOWAIT 、 SEM_UNDO
- 10. 相关进程间通信( IPC )函数说明
semun 结构
val --SETVAL 用的 semval
buf-- 指向 IPC_STAT 或 IPC_SET 用的 semid_ds
结构
array—GETALL 或 SETAL 用的数组
- 11. 相关进程间通信( IPC )函数说明
ftok() 函数
原型: key_t ftok(char *pathname, char proj)
说明: ftok() 用来将参数 pathname 指定的文
件和项目 ID 转换成 System V IPC 函数所需要使
用的 key 。
返回值:若成功则返回 key_t 值,否则返
回 -1 ,错误原因保存在 errno
- 12. 相关进程间通信( IPC )函数说明
semget() 函数
原型: int semget(key_t key, int nsems, int
semflg)
说明:创建一个新的信号量集,或者使用一个
已经存在的信号量集。第一个参数是关键字值
(一般是由系统调用 ftok() 返回的)。第二个
参数 nsems 指出一个新的信号量集合中应该创
建的信号量的个数
返回:如果成功,则返回信号量集的 IPC 标识
符。如果失败,则返回 -1
- 13. 相关进程间通信( IPC )函数说明
semop() 函数
原型: int semop(int semid, struct sembuf
*sops,unsigned nsops)
说明:信号量操作。参数 semid 为预处理的信
号队列识别代码,由 semget 返回得
来。 sembuf 是指向将要操作的数组的指
针。 nsops 表示参数是 sops 的结构数目。
返回:若成功返回 0 ,失败返回 -1
- 14. 相关进程间通信( IPC )函数说明
semctl() 函数
原型: int semctl(int semid, int semnum, int
cmd, union semunarg);
说明:控制信号队列的运作, semctl() 提供了
几种方式来控制信号队列的运作。参数 semid
指定信号灯集,参数 semnum 指定对哪个信号
灯操作,参数 cmd 指定具体的操作类
型, semunarg 用于设置或返回信号灯信息,
代表一个 semun 实例。
返回:若成功返回 0 ,否则返回 -1
- 15. 相关进程间通信( IPC )函数说明
pthread_create() 函数
原型: int pthread_create(pthread_t *thread,
const pthread_attr_t *attr, void *(*start_routine)
(void *), void *arg);
说明: thread :用于返回创建的线程的 ID ,
arr 用于指定的被创建的线程的属性,使用
NULL ,表示使用默认的属性, start_routine
这是一个函数指针,指向线程被创建后要调用
的函数, arg 用于给线程传递参数
返回:成功返回 0 ,失败 -1
- 16. 相关进程间通信( IPC )函数说明
perror() 函数
原型: void perror(const char *s);
说明:用 来 将 上 一 个 函 数 发 生 错 误 的
原 因 输 出 到 标 准 错误 (stderr) 。参数 s
所指的字符串会先打印出 , 后面再加上错误原
因字符串。此错误原因依照全局变量 errno 的
值来决定要输出的字符串
- 17. 实验报告提交要求
服务器: ftp://219.231.160.1
用户名: panjingchangstu
密 码: lm
实验报告命名:班级 + 学号 + 姓名 .zip
如:软件 1 班 200900800001 张三 & 软件 1
班 200900800002 李四 .zip
实验结论包括每个人所做的工作
源码和实验报告一起打包