SlideShare a Scribd company logo
1 of 17
实验五 读者 - 写者问题




          实验教材:课本第 9 章
               2011.11.19
                   4 课时
处理机调度实验问题
   算法流程图
   课本上代码两处问题
       时间片用完之后,没有比较当前进程与就绪队
        列中有最大优先权进程的优先数
       运行过程中有的测试用例会导致丢失个别进程
   随机数产生函数
读者 - 写者问题
   实验目的
   实验内容
   实验原理
   实验指导
   相关进程间通信( IPC )函数说明
实验目的
   理解进程同步的原理和机制

    通过读者— 写者问题的设计与实现进一步
    掌握进程同步在实际中的应用
实验内容
   编写读者— 写者问题的程序,要求如下:
       在 Linux 下用 C 编程,利用信号量操作实现进程同
        步;
       读写请求随机产生(比如敲击键盘上的 r 和 w )
        ,并动态显示当前的状态(读的时候有多少读者,
        有多少个写者在等待;写的时候是谁在写,还有多
        少写者和读者在等待),每个读者和写者用的时间
        可以预先设定。
   本例中,有一个初始化的数组,读者和写者均
    是对此数组进行操作。写者是随机对数组中的
    数字进行修改,修改的值也是随机的,这样更
    直观、更有助于理解。
实验原理
   同步
       同步是指进程间共同完成一项任务时直接发生相互作用的关
        系,即进程在执行的时间顺序上必须遵循特定的次序,这种
        时序关系称为同步关系。例如: B 进程在运行时需要 A 进程
        的输出结果作为资源,那么 A 进程必须在 B 进程执行之前完
        成,这就确定了 A 、 B 两进程间的同步关系。

   互斥
       这是一种更常见的进程之间的相互关系,通常是由于多个进
        程共享某些资源而引起的,而这些进程往往彼此独立。例如
        :系统只有一台打印机,有两个进程同时使用它输出数据的
        话,打印结果将使这两个进程的输出内容混杂在一起。为了
        保证共享临界资源的各个进程都能正确运行,当临界资源被
        一个进程访问时,其他访问进程必须等待。多个进程在共享
        临界资源时的这种制约关系称为进程互斥。
实验指导
   设有一组共享数据 DB 和两组并发进程 , 一组进程只对此
    组数据执行读操作 , 另一组进程可对此组数据执行写操作
    ( 同时也可以执行读操作 ) ,将前一组进程称作读者,后
    一组进程称作写者。为了保证共享数据的完整性,要求:
       多个读者的操作可以同时进行;
       多个写者的操作不可同时进行;
       任何读者与写者的操作不可同时进行。


                           DB




             R1   …   Rm        W1   …   Wn
实验指导
   实验的流程图如图所示                         开始



                                     随机产生一组数




           随机在某位置读取          r                    w       随机在某个位置写入
              内容                      用户的选择                 某随机数




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


                         Y                            Y



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

                                 Y                Y



                                       结束
相关进程间通信( 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
相关进程间通信( IPC )函数说明
   semun 结构


       val --SETVAL 用的 semval
       buf-- 指向 IPC_STAT 或 IPC_SET 用的 semid_ds
        结构
       array—GETALL 或 SETAL 用的数组
相关进程间通信( IPC )函数说明
   ftok() 函数
       原型: key_t ftok(char *pathname, char proj)
       说明: ftok() 用来将参数 pathname 指定的文
        件和项目 ID 转换成 System V IPC 函数所需要使
        用的 key 。
       返回值:若成功则返回 key_t 值,否则返
        回 -1 ,错误原因保存在 errno
相关进程间通信( IPC )函数说明
   semget() 函数
       原型: int semget(key_t key, int nsems, int
        semflg)
       说明:创建一个新的信号量集,或者使用一个
        已经存在的信号量集。第一个参数是关键字值
        (一般是由系统调用 ftok() 返回的)。第二个
        参数 nsems 指出一个新的信号量集合中应该创
        建的信号量的个数
       返回:如果成功,则返回信号量集的 IPC 标识
        符。如果失败,则返回 -1
相关进程间通信( IPC )函数说明
   semop() 函数
       原型: int semop(int semid, struct sembuf
        *sops,unsigned nsops)
       说明:信号量操作。参数 semid 为预处理的信
        号队列识别代码,由 semget 返回得
        来。 sembuf 是指向将要操作的数组的指
        针。 nsops 表示参数是 sops 的结构数目。
       返回:若成功返回 0 ,失败返回 -1
相关进程间通信( IPC )函数说明
   semctl() 函数
       原型: int semctl(int semid, int semnum, int
        cmd, union semunarg);
       说明:控制信号队列的运作, semctl() 提供了
        几种方式来控制信号队列的运作。参数 semid
        指定信号灯集,参数 semnum 指定对哪个信号
        灯操作,参数 cmd 指定具体的操作类
        型, semunarg 用于设置或返回信号灯信息,
        代表一个 semun 实例。
       返回:若成功返回 0 ,否则返回 -1
相关进程间通信( 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
相关进程间通信( IPC )函数说明
   perror() 函数
       原型: void perror(const char *s);
       说明:用 来 将 上 一 个 函 数 发 生 错 误 的
        原 因 输 出 到 标 准 错误 (stderr) 。参数 s
        所指的字符串会先打印出 , 后面再加上错误原
        因字符串。此错误原因依照全局变量 errno 的
        值来决定要输出的字符串
实验报告提交要求
   服务器: ftp://219.231.160.1
   用户名: panjingchangstu
   密  码: lm
   实验报告命名:班级 + 学号 + 姓名 .zip
       如:软件 1 班 200900800001 张三 & 软件 1
        班 200900800002 李四 .zip
   实验结论包括每个人所做的工作
   源码和实验报告一起打包

More Related Content

What's hot

C python 原始碼解析 投影片
C python 原始碼解析 投影片C python 原始碼解析 投影片
C python 原始碼解析 投影片kao kuo-tung
 
10 檔案說明與處理
10 檔案說明與處理10 檔案說明與處理
10 檔案說明與處理shademoon
 
Golang server design pattern
Golang server design patternGolang server design pattern
Golang server design pattern理 傅
 
系統程式 -- 第 12 章
系統程式 -- 第 12 章系統程式 -- 第 12 章
系統程式 -- 第 12 章鍾誠 陳鍾誠
 
Go语言: 互联网时代的C
Go语言: 互联网时代的CGo语言: 互联网时代的C
Go语言: 互联网时代的CGoogol Lee
 
第1章 入门
第1章 入门第1章 入门
第1章 入门Runa Jiang
 
Lua 语言介绍
Lua 语言介绍Lua 语言介绍
Lua 语言介绍gowell
 
基于XMPP的Gtalk机器人
基于XMPP的Gtalk机器人基于XMPP的Gtalk机器人
基于XMPP的Gtalk机器人roamin9 Zhou
 
Compiler for Dummy 一點都不深入的了解 Compiler, Interpreter 和 VM
Compiler for Dummy 一點都不深入的了解 Compiler, Interpreter 和 VMCompiler for Dummy 一點都不深入的了解 Compiler, Interpreter 和 VM
Compiler for Dummy 一點都不深入的了解 Compiler, Interpreter 和 VMLi Hsuan Hung
 
Js对象及函数式编程乱步
Js对象及函数式编程乱步Js对象及函数式编程乱步
Js对象及函数式编程乱步Pierre Woo
 
Net Parallel Programming .NET平行處理與執行序
Net Parallel Programming .NET平行處理與執行序Net Parallel Programming .NET平行處理與執行序
Net Parallel Programming .NET平行處理與執行序HO-HSUN LIN
 
C語言 第4章 基本輸出與輸入功能
C語言 第4章 基本輸出與輸入功能C語言 第4章 基本輸出與輸入功能
C語言 第4章 基本輸出與輸入功能shademoon
 
Erlang jiacheng
Erlang jiachengErlang jiacheng
Erlang jiachengAir-Smile
 
Intro to C++ Basic
Intro to C++ BasicIntro to C++ Basic
Intro to C++ BasicShih Chi Lin
 
Introduction to C++ over CLI
Introduction to C++ over CLIIntroduction to C++ over CLI
Introduction to C++ over CLI建興 王
 
OOP in C - Virtual Function (Chinese Version)
OOP in C - Virtual Function (Chinese Version)OOP in C - Virtual Function (Chinese Version)
OOP in C - Virtual Function (Chinese Version)Kai-Feng Chou
 
Cppcheck分析
Cppcheck分析Cppcheck分析
Cppcheck分析Wu Liang
 

What's hot (20)

C python 原始碼解析 投影片
C python 原始碼解析 投影片C python 原始碼解析 投影片
C python 原始碼解析 投影片
 
10 檔案說明與處理
10 檔案說明與處理10 檔案說明與處理
10 檔案說明與處理
 
Golang server design pattern
Golang server design patternGolang server design pattern
Golang server design pattern
 
系統程式 -- 第 12 章
系統程式 -- 第 12 章系統程式 -- 第 12 章
系統程式 -- 第 12 章
 
Go语言: 互联网时代的C
Go语言: 互联网时代的CGo语言: 互联网时代的C
Go语言: 互联网时代的C
 
第1章 入门
第1章 入门第1章 入门
第1章 入门
 
Lua 语言介绍
Lua 语言介绍Lua 语言介绍
Lua 语言介绍
 
基于XMPP的Gtalk机器人
基于XMPP的Gtalk机器人基于XMPP的Gtalk机器人
基于XMPP的Gtalk机器人
 
Compiler for Dummy 一點都不深入的了解 Compiler, Interpreter 和 VM
Compiler for Dummy 一點都不深入的了解 Compiler, Interpreter 和 VMCompiler for Dummy 一點都不深入的了解 Compiler, Interpreter 和 VM
Compiler for Dummy 一點都不深入的了解 Compiler, Interpreter 和 VM
 
Js对象及函数式编程乱步
Js对象及函数式编程乱步Js对象及函数式编程乱步
Js对象及函数式编程乱步
 
Net Parallel Programming .NET平行處理與執行序
Net Parallel Programming .NET平行處理與執行序Net Parallel Programming .NET平行處理與執行序
Net Parallel Programming .NET平行處理與執行序
 
C語言 第4章 基本輸出與輸入功能
C語言 第4章 基本輸出與輸入功能C語言 第4章 基本輸出與輸入功能
C語言 第4章 基本輸出與輸入功能
 
Erlang jiacheng
Erlang jiachengErlang jiacheng
Erlang jiacheng
 
Intro to C++ Basic
Intro to C++ BasicIntro to C++ Basic
Intro to C++ Basic
 
Introduction to C++ over CLI
Introduction to C++ over CLIIntroduction to C++ over CLI
Introduction to C++ over CLI
 
系統程式 -- 第 7 章
系統程式 -- 第 7 章系統程式 -- 第 7 章
系統程式 -- 第 7 章
 
OOP in C - Virtual Function (Chinese Version)
OOP in C - Virtual Function (Chinese Version)OOP in C - Virtual Function (Chinese Version)
OOP in C - Virtual Function (Chinese Version)
 
系統程式 -- 第 8 章
系統程式 -- 第 8 章系統程式 -- 第 8 章
系統程式 -- 第 8 章
 
Cppcheck分析
Cppcheck分析Cppcheck分析
Cppcheck分析
 
第9章文件
第9章文件第9章文件
第9章文件
 

Similar to 实验五 读者 写者问题

The Evolution of Async Programming (GZ TechParty C#)
The Evolution of Async Programming (GZ TechParty C#)The Evolution of Async Programming (GZ TechParty C#)
The Evolution of Async Programming (GZ TechParty C#)jeffz
 
Java华为面试题
Java华为面试题Java华为面试题
Java华为面试题yiditushe
 
线程与并发
线程与并发线程与并发
线程与并发Tony Deng
 
IOS入门分享
IOS入门分享IOS入门分享
IOS入门分享zenyuhao
 
[圣思园][Java SE]Io 3
[圣思园][Java SE]Io 3[圣思园][Java SE]Io 3
[圣思园][Java SE]Io 3ArBing Xie
 
千呼萬喚始出來的Java SE 7
千呼萬喚始出來的Java SE 7千呼萬喚始出來的Java SE 7
千呼萬喚始出來的Java SE 7javatwo2011
 
Linux Tracing System 浅析 & eBPF框架开发经验分享
Linux Tracing System 浅析 & eBPF框架开发经验分享Linux Tracing System 浅析 & eBPF框架开发经验分享
Linux Tracing System 浅析 & eBPF框架开发经验分享happyagan
 
Metro Style Apps from C++ Developers' View
Metro Style Apps from C++ Developers' ViewMetro Style Apps from C++ Developers' View
Metro Style Apps from C++ Developers' ViewEric ShangKuan
 
Hadoop学习总结
Hadoop学习总结Hadoop学习总结
Hadoop学习总结ordinary2012
 
基于Erlang的
基于Erlang的基于Erlang的
基于Erlang的hnoutman
 
第六章 函數與巨集
第六章 函數與巨集第六章 函數與巨集
第六章 函數與巨集shademoon
 
Java Script 引擎技术
Java Script 引擎技术Java Script 引擎技术
Java Script 引擎技术bigqiang zou
 
Scrum gathering 2012 Shanghai_精益与持续改进分会场演讲话题: 大型企业ci平台建设和实施分享(陈小光)
Scrum gathering 2012 Shanghai_精益与持续改进分会场演讲话题: 大型企业ci平台建设和实施分享(陈小光)Scrum gathering 2012 Shanghai_精益与持续改进分会场演讲话题: 大型企业ci平台建设和实施分享(陈小光)
Scrum gathering 2012 Shanghai_精益与持续改进分会场演讲话题: 大型企业ci平台建设和实施分享(陈小光)JoXuZi
 
Erlang开发及应用
Erlang开发及应用Erlang开发及应用
Erlang开发及应用litaocheng
 
Learning python in the motion picture industry by will zhou
Learning python in the motion picture industry   by will zhouLearning python in the motion picture industry   by will zhou
Learning python in the motion picture industry by will zhouWill Zhou
 

Similar to 实验五 读者 写者问题 (20)

The Evolution of Async Programming (GZ TechParty C#)
The Evolution of Async Programming (GZ TechParty C#)The Evolution of Async Programming (GZ TechParty C#)
The Evolution of Async Programming (GZ TechParty C#)
 
Java华为面试题
Java华为面试题Java华为面试题
Java华为面试题
 
线程与并发
线程与并发线程与并发
线程与并发
 
IOS入门分享
IOS入门分享IOS入门分享
IOS入门分享
 
getPDF.aspx
getPDF.aspxgetPDF.aspx
getPDF.aspx
 
getPDF.aspx
getPDF.aspxgetPDF.aspx
getPDF.aspx
 
Python變數與資料運算
Python變數與資料運算Python變數與資料運算
Python變數與資料運算
 
[圣思园][Java SE]Io 3
[圣思园][Java SE]Io 3[圣思园][Java SE]Io 3
[圣思园][Java SE]Io 3
 
千呼萬喚始出來的Java SE 7
千呼萬喚始出來的Java SE 7千呼萬喚始出來的Java SE 7
千呼萬喚始出來的Java SE 7
 
Linux Tracing System 浅析 & eBPF框架开发经验分享
Linux Tracing System 浅析 & eBPF框架开发经验分享Linux Tracing System 浅析 & eBPF框架开发经验分享
Linux Tracing System 浅析 & eBPF框架开发经验分享
 
Metro Style Apps from C++ Developers' View
Metro Style Apps from C++ Developers' ViewMetro Style Apps from C++ Developers' View
Metro Style Apps from C++ Developers' View
 
Hadoop学习总结
Hadoop学习总结Hadoop学习总结
Hadoop学习总结
 
Hi Haskell
Hi HaskellHi Haskell
Hi Haskell
 
基于Erlang的
基于Erlang的基于Erlang的
基于Erlang的
 
第六章 函數與巨集
第六章 函數與巨集第六章 函數與巨集
第六章 函數與巨集
 
Java Script 引擎技术
Java Script 引擎技术Java Script 引擎技术
Java Script 引擎技术
 
Scrum gathering 2012 Shanghai_精益与持续改进分会场演讲话题: 大型企业ci平台建设和实施分享(陈小光)
Scrum gathering 2012 Shanghai_精益与持续改进分会场演讲话题: 大型企业ci平台建设和实施分享(陈小光)Scrum gathering 2012 Shanghai_精益与持续改进分会场演讲话题: 大型企业ci平台建设和实施分享(陈小光)
Scrum gathering 2012 Shanghai_精益与持续改进分会场演讲话题: 大型企业ci平台建设和实施分享(陈小光)
 
Erlang开发及应用
Erlang开发及应用Erlang开发及应用
Erlang开发及应用
 
Learning python in the motion picture industry by will zhou
Learning python in the motion picture industry   by will zhouLearning python in the motion picture industry   by will zhou
Learning python in the motion picture industry by will zhou
 
C語言應用前置處理
C語言應用前置處理C語言應用前置處理
C語言應用前置處理
 

实验五 读者 写者问题

  • 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  实验结论包括每个人所做的工作  源码和实验报告一起打包