实验五 读者 写者问题

17
实实实 实实 - 实实实实 实实实实 实实实 9实 2011.11.19 4 实实

Upload: jason1114

Post on 13-Apr-2017

1.431 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: 实验五 读者 写者问题

实验五 读者 - 写者问题

实验教材:课本第 9 章2011.11.19

4 课时

Page 2: 实验五 读者 写者问题

处理机调度实验问题 算法流程图 课本上代码两处问题

时间片用完之后,没有比较当前进程与就绪队列中有最大优先权进程的优先数 运行过程中有的测试用例会导致丢失个别进程

随机数产生函数

Page 3: 实验五 读者 写者问题

读者 - 写者问题 实验目的 实验内容 实验原理 实验指导 相关进程间通信( IPC )函数说明

Page 4: 实验五 读者 写者问题

实验目的 理解进程同步的原理和机制 通过读者—写者问题的设计与实现进一步掌握进程同步在实际中的应用

Page 5: 实验五 读者 写者问题

实验内容 编写读者—写者问题的程序,要求如下:

在 Linux 下用 C 编程,利用信号量操作实现进程同步; 读写请求随机产生(比如敲击键盘上的 r和 w ),并动态显示当前的状态(读的时候有多少读者,有多少个写者在等待;写的时候是谁在写,还有多少写者和读者在等待),每个读者和写者用的时间可以预先设定。

本例中,有一个初始化的数组,读者和写者均是对此数组进行操作。写者是随机对数组中的数字进行修改,修改的值也是随机的,这样更直观、更有助于理解。

Page 6: 实验五 读者 写者问题

实验原理 同步

同步是指进程间共同完成一项任务时直接发生相互作用的关系,即进程在执行的时间顺序上必须遵循特定的次序,这种时序关系称为同步关系。例如: B 进程在运行时需要 A 进程的输出结果作为资源,那么 A 进程必须在 B 进程执行之前完成,这就确定了 A、 B 两进程间的同步关系。 互斥

这是一种更常见的进程之间的相互关系,通常是由于多个进程共享某些资源而引起的,而这些进程往往彼此独立。例如:系统只有一台打印机,有两个进程同时使用它输出数据的话,打印结果将使这两个进程的输出内容混杂在一起。为了保证共享临界资源的各个进程都能正确运行,当临界资源被一个进程访问时,其他访问进程必须等待。多个进程在共享临界资源时的这种制约关系称为进程互斥。

Page 7: 实验五 读者 写者问题

实验指导 设有一组共享数据 DB 和两组并发进程 , 一组进程只对此组数据执行读操作 , 另一组进程可对此组数据执行写操作

( 同时也可以执行读操作 ) ,将前一组进程称作读者,后一组进程称作写者。为了保证共享数据的完整性,要求: 多个读者的操作可以同时进行; 多个写者的操作不可同时进行; 任何读者与写者的操作不可同时进行。

R1 Rm W1 Wn… …

DB

Page 8: 实验五 读者 写者问题

实验指导 实验的流程图如图所示 开始

用户的选择

结束

r w随机在某位置读取内容

写者是否已经全部写完

随机在某个位置写入某随机数

Y

N

随机产生一组数

读者是否已经全部读完

Y

读者是否已经全部读完写者是否已经全部写完

N

YY

NN

Page 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

Page 10: 实验五 读者 写者问题

相关进程间通信( IPC )函数说明 semun 结构

val --SETVAL 用的 semval buf-- 指向 IPC_STAT或 IPC_SET 用的 semid_ds结构 array—GETALL或 SETAL 用的数组

Page 11: 实验五 读者 写者问题

相关进程间通信( IPC )函数说明 ftok() 函数

原型: key_t ftok(char *pathname, char proj) 说明: ftok() 用来将参数 pathname 指定的文件和项目 ID转换成 System V IPC 函数所需要使用的 key 。 返回值:若成功则返回 key_t 值,否则返回 -1 ,错误原因保存在 errno

Page 12: 实验五 读者 写者问题

相关进程间通信( IPC )函数说明 semget() 函数

原型: int semget(key_t key, int nsems, int semflg)

说明:创建一个新的信号量集,或者使用一个已经存在的信号量集。第一个参数是关键字值(一般是由系统调用 ftok() 返回的)。第二个参数 nsems 指出一个新的信号量集合中应该创建的信号量的个数 返回:如果成功,则返回信号量集的 IPC标识符。如果失败,则返回 -1

Page 13: 实验五 读者 写者问题

相关进程间通信( IPC )函数说明 semop() 函数

原型: int semop(int semid, struct sembuf *sops,unsigned nsops)

说明:信号量操作。参数 semid 为预处理的信号队列识别代码,由 semget 返回得来。 sembuf 是指向将要操作的数组的指针。 nsops 表示参数是 sops 的结构数目。 返回:若成功返回 0 ,失败返回 -1

Page 14: 实验五 读者 写者问题

相关进程间通信( IPC )函数说明 semctl() 函数

原型: int semctl(int semid, int semnum, int cmd, union semunarg);

说明:控制信号队列的运作, semctl()提供了几种方式来控制信号队列的运作。参数 semid指定信号灯集,参数 semnum 指定对哪个信号灯操作,参数 cmd 指定具体的操作类型, semunarg 用于设置或返回信号灯信息,代表一个 semun 实例。 返回:若成功返回 0 ,否则返回 -1

Page 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

Page 16: 实验五 读者 写者问题

相关进程间通信( IPC )函数说明 perror() 函数

原型: void perror(const char *s); 说明:用 来 将 上 一 个 函 数 发 生 错 误 的 原 因 输 出 到 标 准 错误 (stderr) 。参数 s 所指的字符串会先打印出 , 后面再加上错误原因字符串。此错误原因依照全局变量 errno 的值来决定要输出的字符串

Page 17: 实验五 读者 写者问题

实验报告提交要求 服务器: ftp://219.231.160.1 用户名: panjingchangstu 密 码: lm 实验报告命名:班级 +学号 +姓名 .zip

如:软件 1班 200900800001张三 &软件 1班 200900800002李四 .zip

实验结论包括每个人所做的工作 源码和实验报告一起打包