所在班级: 0310401班。
学生学号: 031040109
学生姓名: 李雨晴。
**题目: 生产者和消费者问题
任课教师: 李艳老师。
完成日期: 2023年12月2日
目录。操作系统课程设计 1
一、课程的地位、目标和任务 3
二、课程设计的基本要求 3
1.课程设计要求: 3
2.学习要求: 3
三、题目分析 3
1.题目的特点: 3
2.采用信号量机制: 4
2.1. pv原语操作的动作 4
2.2信号量 4
四、课程设计的内容 5
1.实验程序的结构图(流程图) 5
2. 数据结构及信号量定义的说明 5
2 .1 createthread 5
2.2. createmutex 6
2.3. createsemaphore 6
2.功能模块 7
五、课程实现的内容 7
1.课程设计的实验环境 7
2. 实验的步骤 8
2.1 打开vc 8
2.2在工程中创建源文件" r_":8
2.3通过调用菜单命令项build->build all进行编译连接 8
3.**实现的具体分析 8
3.1.使用信号量解决生产者-消费者问题 10
3.2.使用消息传递解决生产者-消费者问题 12
六、个人体会 15
参考文献 15
附录:具体实现** 16
一、 课程的地位、目标和任务。
操作系统”是计算机专业的核心专业课,“操作系统课程设计”是理解和巩固操作系统基本理论、原理和方法的重要实践环节。
本课程通过设计实现一个综合作业,加深对操作系统原理的理解,提高综合运用所学知识的能力,培养学生独立工作和解决问题的能力,取得设计与调试的实践经验,为今后进一步从事计算机系统软件和应用软件的分析、研制和开发打下良好的基础。
二、 课程设计的基本要求。
教学内容:用信号量机制解决生产者和消费者问题。
重点:信号量实现进程同步的算法。
难点:进程同步的实现。
理解生产者和消费者模型,掌握利用信号量实现进程同步的方法,通过对实际问题的编程实现,获得实际应用和编程能力。
三、 题目分析。
生产者-消费者(producer-consumer)问题,也称作有界缓冲区(bounded-buffer)问题,两个进程共享一个公共的固定大小的缓冲区。其中一个是生产者,用于将消息放入缓冲区;另外一个是消费者,用于从缓冲区中取出消息。问题出现在当缓冲区已经满了,而此时生产者还想向其中放入一个新的数据项的情形,其解决方法是让生产者此时进行休眠,等待消费者从缓冲区中取走了一个或者多个数据后再去唤醒它。
同样地,当缓冲区已经空了,而消费者还想去取消息,此时也可以让消费者进行休眠,等待生产者放入一个或者多个数据时再唤醒它。
生产者-消费者(producer-consumer)问题非常适合用信号量机制来解决。
为了能让多个进程通过特殊变量展开交互,一个进程在某一关键点上被迫停止执行直至收到对应的特殊变量,通过这一措施,来达到复杂进程间的交互,这种特殊变量就是信号量。为了能够用信号量传送信号,进程可用p、v两个特殊操作来发送和接收信号,如果协作进程的相应信号仍未送到,则进程被挂起直至信号达到为止。
信号量s是一个整数,s大于等于零时代表可供并发进程使用的资源实体数,但s小于零时则表示正在等待使用临界区的进程数。
dijkstra同时提出了对信号量操作的pv原语。
p原语操作的动作是:
1.s减1;
2. 若s减1后仍大于或等于零,则进程继续执行;
3. 若s减1后小于零,则该进程被阻塞后进入与该信号相对应的队列中,然后转进程调度。
v原语操作的动作是:
1. s加1;
2. 若相加结果大于零,则进程继续执行;
3. 若相加结果小于或等于零,则从该信号的等待队列中唤醒一等待进程,然后再返回原进程继续执行或转进程调度。
pv操作对于每一个进程来说,都只能进行一次,而且必须成对使用。在pv原语执行期间不允许有中断的发生。
说明:要保证pv是原子操作,对于操作系统,只须在操作过程中关中断即可。
andrew s. tanenbaum对信号量的定义有所不同,其pv操作也有区别。
信号量是一个整数,其值不小于0。它表示被积累下来的唤醒操作数。
p原语操作的动作是:
1. 检查s是否大于0。
2. 若s>0,则s = s – 1;否则,执行p操作的进程将睡眠,并且此时p操作并未结束。
v原语操作的动作是:
1. s = s + 1。
2. 如果一个或多个进程在该信号量上睡眠,无法完成先前的p操作,则有系统选择其中一个并允许它完成p操作。
四、 课程设计的内容。
1. 实验程序的结构图(流程图)
功能——创建一个在调用进程的地址空间中执行的线程。
格式。handle createthread( lpsecurity_attributes lpthreadattributes,dword dwstacksize,lpthread_start_routine lpstartaddress,lpvoid lpparamiter,dword dwcreationflags,lpdword lpthread );
功能——创建一个命名或匿名的互斥量对象。
格式:handle createmutex(lpsecurity_attributes lpmutexattributes,bool binitialowner,lpctstr lpname);
参数说明:lpmutexattributes——必须取值null。
binitialowner——指示当前线程是否马上拥有该互斥量(即马上加锁)。
lpname——互斥量名称。
功能——创建一个命名或匿名的信号量对象。
格式:handle createsemaphore(lpsecurity_attributes lpsemaphoreattributes,long linitialcount,long lmaximumcount,lpctstr lpname );
参数说明:lpsemaphoreattributes——必须取值null。
linitialcount——信号量的初始值。该值大于0,但小于lmaximumcount指定的最大值。
lmaximumcount——信号量的最大值。
lpname——信号量名称。
参数说明:lpthreadattributes——指向一个lpsecurity_attributes(新线程的安全性描述符)。
dwstacksize——定义原始堆栈大小。
lpstartaddress——指向使用lpthraed_start_routine类型定义的函数。
lpparamiter——定义一个给进程传递参数的指针。
dwcreationflags——定义控制线程创建的附加标志。
lpthread——保存线程标志符(32位)
五、 课程实现的内容。
本实验是在win xp+vc6.0环境下实现的,利用windows sdk编制实例程序。所以试验需要在windows下安装vc后进行。
vc是一个集成开发环境,其中包含了windows sdk所有工具和定义;所以安装了vc后就不用特意安装sdk了。
打开vc, 选择菜单项file->new,选择projects选项卡并建立一个名为" r_wp1"的win32 console applicatoin工程;创建时注意指定创建该工程的目录;
选择菜单项project->add to project->files,在选择框中输入自己想要创建的文件名,这里是" r_";在接下来询问是否创建新文件时回答"yes";然后通过workspace->fileview->source files打开该文件,在其中编辑源文件并保存。
操作系统 软件 操作系统作业
1 信号量的物理含义是什么?2 处于执行状态的进程若同时发生了下列两种情况 1 对某信号量执行p操作后,信号量的值变为负数。2 该进程的时间片到时产生中断。试问,该进程将由执行状态变迁为就绪态,还是阻塞态?简述理由。3 设有n个进程共享一临界区,对于下述情况,说明信号量的初值 含义,并用pv操作写出...
操作系统作业
4.程序并发执行时为什么会失去封闭性和可再现性?因为程序并发执行时,是多个程序共享系统中的各种资源,因而这些资源的状态是由多个程序来改变,致使程序的运行失去了封闭性。而程序一旦失去了封闭性也会导致其再失去可再现性。6.试从动态性,并发性和独立性上比较进程和程序?a.动态性是进程最基本的特性,可表现为...
操作系统作业
一 选择题。1 在进程的组成部分之中,进程在运行中不可修改的部分是 a 私用程序段b 共享程序段。c 数据段d 进程控制块。2 响应比高者优先作业调度算法是以计算时间和 来考虑的。a 输入时间 b 完成时间 c 周转时间 d 等待时间。3 在消息缓冲通信中,消息队列属于 资源。a 临界 b 共享 c...