操作系统进程同步的教学实践

合集下载

操作系统实验二实验报告

操作系统实验二实验报告

操作系统实验二实验报告一、实验目的本次操作系统实验二的主要目的是深入理解和掌握进程管理的相关概念和技术,包括进程的创建、执行、同步和通信。

通过实际编程和实验操作,提高对操作系统原理的认识,培养解决实际问题的能力。

二、实验环境本次实验使用的操作系统为 Windows 10,编程环境为 Visual Studio 2019。

三、实验内容及步骤(一)进程创建实验1、首先,创建一个新的 C++项目。

2、在项目中,使用 Windows API 函数`CreateProcess`来创建一个新的进程。

3、为新进程指定可执行文件的路径、命令行参数、进程属性等。

4、编写代码来等待新进程的结束,并获取其退出代码。

(二)进程同步实验1、设计一个生产者消费者问题的模型。

2、使用信号量来实现生产者和消费者进程之间的同步。

3、生产者进程不断生成数据并放入共享缓冲区,当缓冲区已满时等待。

4、消费者进程从共享缓冲区中取出数据进行处理,当缓冲区为空时等待。

(三)进程通信实验1、选择使用管道来实现进程之间的通信。

2、创建一个匿名管道,父进程和子进程分别读写管道的两端。

3、父进程向管道写入数据,子进程从管道读取数据并进行处理。

四、实验结果及分析(一)进程创建实验结果成功创建了新的进程,并能够获取到其退出代码。

通过观察进程的创建和执行过程,加深了对进程概念的理解。

(二)进程同步实验结果通过使用信号量,生产者和消费者进程能够正确地进行同步,避免了缓冲区的溢出和数据的丢失。

分析结果表明,信号量机制有效地解决了进程之间的资源竞争和协调问题。

(三)进程通信实验结果通过管道实现了父进程和子进程之间的数据通信。

数据能够准确地在进程之间传递,验证了管道通信的有效性。

五、遇到的问题及解决方法(一)在进程创建实验中,遇到了参数设置不正确导致进程创建失败的问题。

通过仔细查阅文档和调试,最终正确设置了参数,成功创建了进程。

(二)在进程同步实验中,出现了信号量使用不当导致死锁的情况。

操作系统 实验三 进程同步

操作系统 实验三 进程同步

集美大学计算机工程学院实验报告课程名称:操作系统指导教师:王丰实验成绩:实验编号:实验三实验名称:进程同步班级:计算12姓名:学号:上机实践日期:2015.5上机实践时间:2学时一、实验目的1、掌握用Linux信号灯集机制实现两个进程间的同步问题。

2、共享函数库的创建二、实验环境Ubuntu-VMware、Linux三、实验内容⏹需要的信号灯: System V信号灯实现☐用于控制司机是否可以启动车辆的的信号灯 S1=0☐用于控制售票员是否可以开门的信号灯 S2=0System V信号灯实现说明□ System V的信号灯机制属于信号灯集的形式, 一次可以申请多个信号灯.□同样利用ftok()生成一个key: semkey=ftok(path,45);□利用key申请一个包含有两个信号灯的信号灯集, 获得该集的idsemid=semget(semkey,2,IPC_CREAT | 0666);□定义一个联合的数据类型union semun{int val;struct semid_ds *buf;ushort *array;};□利用semctl()函数对信号灯初始化,参数有:信号灯集的id: semid要初始化的信号灯的编号:sn要设定的初始值:valvoid seminit(int semid, int val,int sn){union semun arg;arg.val=val;semctl(semid,sn,SETVAL,arg);}利用初始化函数,初始化信号灯:seminit(semid,0,0);//用来司机启动汽车的同步seminit(semid,0,1);//用来售票员开门的同步控制□利用semop()函数, 对信号灯实现V操作:sembuf是一个在头部文件中的预定义结构、semid—信号灯集id, sn—要操作的信号灯编号void semdown(int semid,int sn){/* define P operating*/struct sembuf op;op.sem_num=sn;op.sem_op=-1;//P操作为-1op.sem_flg=0;semop(semid,&op,1);}2、Linux的静态和共享函数库·Linux生成目标代码: gcc -c 源程序文件名(将生成一个与源程序同名的.o目标代码文件。

操作系统教学实践心得(3篇)

操作系统教学实践心得(3篇)

第1篇一、引言操作系统是计算机科学的核心课程之一,它涵盖了计算机硬件、软件以及系统管理的各个方面。

在我国,操作系统教学已经取得了长足的进步,许多高校都开设了操作系统课程。

作为一名操作系统课程的教师,我深刻地认识到,实践是检验真理的唯一标准,教学实践对于提高教学质量具有重要意义。

以下是我对操作系统教学实践的一些心得体会。

二、教学实践的重要性1. 提高教学质量通过教学实践,教师可以更加深入地了解操作系统理论在实际应用中的体现,从而更好地将理论知识传授给学生。

同时,实践过程中,教师可以及时发现教学中的不足,及时调整教学方法和策略,提高教学质量。

2. 培养学生动手能力操作系统教学实践可以让学生亲自动手,通过实际操作掌握操作系统的工作原理和操作方法。

这对于培养学生的动手能力、提高学生的综合素质具有重要意义。

3. 激发学生学习兴趣实践过程中,学生可以亲身感受到操作系统的魅力,从而激发他们的学习兴趣。

这对于提高学生的学习积极性、培养学生的创新精神具有重要作用。

4. 促进教师成长教学实践是教师成长的重要途径。

通过实践,教师可以不断提高自己的教学水平,积累丰富的教学经验,为今后的教学和研究打下坚实基础。

三、教学实践的具体措施1. 优化课程设计在课程设计中,要充分考虑学生的实际需求,合理设置教学内容。

例如,可以将操作系统课程分为理论教学和实践教学两个部分,分别讲解操作系统的原理和操作方法。

2. 采用多样化的教学方法在教学过程中,要灵活运用多种教学方法,如讲授法、案例分析法、实验法等。

通过多样化的教学方法,激发学生的学习兴趣,提高教学效果。

3. 强化实践教学环节实践教学是操作系统教学的重要组成部分。

教师可以组织学生进行实验、上机操作等实践活动,让学生在实际操作中掌握操作系统的工作原理和操作方法。

4. 建立实践基地为了更好地开展实践教学,学校可以建立操作系统实践基地,为学生提供良好的实践环境。

实践基地可以包括实验室、计算机房等,配备丰富的实验设备和软件。

操作系统实验四 进程的同步

操作系统实验四 进程的同步

操作系统实验报告哈尔滨工程大学软件学院第六讲进程的同步一、实验概述1. 实验名称实验系统的启动2. 实验目的1).使用EOS 的信号量编程解决生产者—消费者问题,理解进程同步的意义。

2).调试跟踪EOS 的信号量的工作过程,理解进程同步的原理。

3).修改EOS 的信号量算法,使之支持等待超时唤醒功能(有限等待),加深理解进程同步的原理。

3. 实验类型(验证、设计)验证4. 实验内容1).准备实验2).使用EOS的信号量解决生产者-消费者问题3).调试EOS信号量的工作过程①创建信号量②等待释放信号量③等待信号量(不阻塞)④释放信号量(不唤醒)⑤等待信号量(阻塞)⑥释放信号量(唤醒)4).修改EOS的信号量算法在目前EOS Kernel项目的ps/semaphore.c文件中,PsWaitForSemaphore 函数的Milliseconds参数只能是INFINITE,PsReleaseSemaphore 函数的ReleaseCount 参数只能是1。

现在要求同时修改PsWaitForSemaphore函数和PsReleaseSemaphore函数中的代码,使这两个参数能够真正起到作用,使信号量对象支持等待超时唤醒功能和批量释放功能。

二、实验环境操作系统:windows xp编译环境:OS Lab三、实验过程1. 设计思路和流程图图3-1.整体试验流程图图3-2.Main 函数流程图、生产者消费、消费者流程图2. 需要解决的问题及解答(1).思考在ps/semaphore.c文件内的PsWaitForSemaphore和PsReleaseSemaphore函数中,为什么要使用原子操作?答:在执行等待信号量和释放信号量的时候,是不允许cpu响应外部中断的,如果此时cpu响应了外部中断,会产生不可预料的结果,无法正常完成原子操作。

(2). 绘制ps/semaphore.c文件内PsWaitForSemaphore和PsReleaseSemaphore 函数的流程图。

操作系统实验一-进程同步

操作系统实验一-进程同步

实验一进程同步一、实验目的:分析进程的同步与互斥现象,编程实现经典的进程同步问题——生产者与消费者问题的模拟,进一步加深对进程同步与互斥的理解。

二、实验内容:用C语言实现对生产者与消费者问题的模拟。

实验原理:生产者和消费者是经典的进程同步问题,在这个问题中,生产者不断的向缓冲区中写入数据,而消费者则从缓冲区中读取数据。

生产者进程和消费者对缓冲区的操作是互斥,即当前只能有一个进程对这个缓冲区进行操作,生产者进入操作缓冲区之前,先要看缓冲区是否已满,如果缓冲区已满,则它必须等待消费者进程将数据取出才能写入数据,同样的,消费者进程从缓冲区读取数据之前,也要判断缓冲区是否为空,如果为空,则必须等待生产者进程写入数据才能读取数据。

三、实验准备:1. 实现步骤:(1)分析计算机系统中对资源的分配与释放过程:计算机系统中的每个进程都可以消费或生产某类资源。

当系统中某一进程使用某一资源时,可以看作是消耗,且该进程称为消费者。

而当某个进程释放资源时,则它就相当一个生产者。

(2)定义生产者消费者问题中的各数据结构,并初始化信号量;(3)创建生产者与消费者进程,利用信号量实现生产者与消费者之间的同步与互斥;最后编程实现。

2. 相关函数:在实现的过程中需要用到以下API函数:(1)CreateThread()//该函数创建一个在调用进程的地址空间中执行的线程。

若线程创建成功,将返回该线程的句柄。

函数原型:HANDLE CreateThread (LPSECURITY_ATTRIBUTES lpThreadAttributes, //描述安全性,用NULL表示使用缺省值DWORD dwStackSize, //新线程拥有自己的堆栈,0表示使用缺省值1MB,推荐LPTHREAD_START_ROUTINE lpStartAddress, //新线程的起始地址,放线程函数名称LPVOID lpParameter,//此值被传送到线程函数去作为参数DWORD dwCreationFlags,//允许产生一个暂时挂起的线程,默认是0立即开始执行LPDWORD lpThreadld );//新线程的ID被传到这用法举例:hHandle1 = CreateThread( (LPSECURITY_ATTRIBUTES) NULL,0,(LPTHREAD_START_ROUTINE) ThreadName1,(LPVOID) NULL,0, &dwThreadID1 );(2)CreateMutex()函数可用来创建一个有名或无名的互斥量对象,函数返回值为互斥对象的句柄。

山东大学操作系统实验报告4进程同步实验

山东大学操作系统实验报告4进程同步实验

山东大学操作系统实验报告4进程同步实验计算机科学与技术学院实验报告实验题目:实验四、进程同步实验学号:日期:20120409 班级:计基地12 姓名:实验目的:加深对并发协作进程同步与互斥概念的理解,观察和体验并发进程同步与互斥操作的效果,分析与研究经典进程同步与互斥问题的实际解决方案。

了解 Linux 系统中 IPC 进程同步工具的用法,练习并发协作进程的同步与互斥操作的编程与调试技术。

实验内容:抽烟者问题。

假设一个系统中有三个抽烟者进程,每个抽烟者不断地卷烟并抽烟。

抽烟者卷起并抽掉一颗烟需要有三种材料:烟草、纸和胶水。

一个抽烟者有烟草,一个有纸,另一个有胶水。

系统中还有两个供应者进程,它们无限地供应所有三种材料,但每次仅轮流提供三种材料中的两种。

得到缺失的两种材料的抽烟者在卷起并抽掉一颗烟后会发信号通知供应者,让它继续提供另外的两种材料。

这一过程重复进行。

请用以上介绍的 IPC 同步机制编程,实现该问题要求的功能。

硬件环境:处理器:Intel® Core™i3-2350M CPU @ 2.30GHz ×4图形:Intel® Sandybridge Mobile x86/MMX/SSE2内存:4G操作系统:32位磁盘:20.1 GB软件环境:ubuntu13.04实验步骤:(1)新建定义了producer和consumer共用的IPC函数原型和变量的ipc.h文件。

(2)新建ipc.c文件,编写producer和consumer 共用的IPC的具体相应函数。

(3)新建Producer文件,首先定义producer的一些行为,利用系统调用,建立共享内存区域,设定其长度并获取共享内存的首地址。

然后设定生产者互斥与同步的信号灯,并为他们设置相应的初值。

当有生产者进程在运行而其他生产者请求时,相应的信号灯就会阻止他,当共享内存区域已满时,信号等也会提示生产者不能再往共享内存中放入内容。

进程同步实验报告

一、实验目的1. 理解进程同步的概念和原理;2. 掌握进程同步的基本方法和机制;3. 学会使用信号量实现进程同步;4. 通过实验验证进程同步机制的有效性。

二、实验原理1. 进程同步:在多道程序设计中,进程的执行是并发的,但某些情况下需要保证多个进程按照一定的顺序执行,以避免出现数据不一致、死锁等问题。

进程同步是指通过某种机制,协调多个进程的执行顺序,保证它们能够正确、有效地共享资源。

2. 信号量:信号量是一种特殊的变量,用于实现进程同步。

信号量具有两个原子操作:P操作(wait)和V操作(signal)。

P操作用于申请资源,V操作用于释放资源。

3. 互斥锁:互斥锁是一种常见的进程同步机制,用于保证临界资源的互斥访问。

当一个进程进入临界区时,它会尝试获取互斥锁,如果锁已被其他进程获取,则该进程进入等待状态;当进程退出临界区时,它会释放互斥锁。

三、实验内容1. 实验环境:Linux操作系统,C语言编程环境。

2. 实验工具:gcc编译器、gdb调试器。

3. 实验步骤:(1)创建一个互斥锁,用于保护临界资源。

(2)编写两个进程,分别模拟对临界资源的访问。

(3)在进程访问临界资源前,使用P操作尝试获取互斥锁。

(4)在进程访问临界资源后,使用V操作释放互斥锁。

(5)编译并运行程序,观察进程执行情况。

四、实验结果与分析1. 实验结果:(1)在互斥锁的保护下,两个进程能够按照预期顺序访问临界资源。

(2)当其中一个进程正在访问临界资源时,另一个进程会进入等待状态。

(3)当进程访问临界资源完成后,它会释放互斥锁,允许其他进程访问。

2. 实验分析:(1)互斥锁能够有效地保护临界资源,避免数据不一致问题。

(2)信号量P操作和V操作保证了进程的同步,避免了死锁现象。

(3)通过实验验证了进程同步机制的有效性。

五、实验总结本次实验通过使用信号量和互斥锁,实现了进程同步。

实验结果表明,信号量和互斥锁能够有效地保证进程按照预期顺序执行,避免数据不一致和死锁等问题。

操作系统实验3进程同步报告

实验三进程同步一、实验目的:1.了解进程和线程的同步方法,学会运用进程和线程同步方法来解决实际问题;2.了解windows系统下Win32 API或Pthread信号量机制的使用方法;二、实验预备内容:1.对书上所说基于信号量的有限缓冲的生产者-消费者问题;2.对于信号量的概念有大概的了解,知道如何用信号量的wiat()和signal()函数如何取消应用程序进入临界区的忙等;三、实验环境说明:此实验在Win7(32位) CodeBlocks环境下实现,采用WinAPI的信号量机制。

四、实验内容:设计一个程序解决有限缓冲问题,其中的生产者与消费者进程如下图所示。

在Bounded-Buffer Problem(6.6.1节)中使用了三个信号量:empty (记录有多少空位)、full(记录有多少满位)以及mutex(二进制信号量或互斥信号量,以保护对缓冲区插入与删除的操作)。

对于本项目,empty和full将采用标准计数信号量,而mutex将采用二进制信号量。

生产者与消费者作为独立线程,在empty、full、mutex的同步前提下,对缓冲区进行插入与删除。

本项目可采用Pthread或Win32 API。

(本实验采用Win32 API)五、程序设计说明:1.全局变量:定义缓冲区数组及其环形队列表达方式,定义mutex、empty、full 三个信号量。

empty记录缓冲区有多少个空位;full记录缓冲区有多少个满位;mutex作为互斥信号量,保护对缓冲区插入或删除的操作。

具体定义如下:定义生产者、消费者线程结构和包含的信息:(由于题目中没有要求,因此只定义了编号一个变量)2.缓冲区:缓冲区是一个元数据类型为buffer_item(可通过typedef定义)的固定大小的数组,按环形队列处理。

buffer_item的定义及缓冲区大小可保存在头文件中:A.insert_item():先判断缓冲区是否已满,不满则向缓冲区中插入元素;B.remove_item()先判断缓冲区是否为空,不空则从缓冲区中删除元素;3.生产者线程:生产者线程交替执行如下两个阶段:睡眠一段随机事件,向缓冲中插入一个随机数。

操作系统教学实践(3篇)

第1篇一、引言操作系统是计算机科学与技术领域的重要基础课程,它涉及计算机系统的资源管理、进程管理、存储管理、文件系统等多个方面。

为了提高学生对操作系统的理解和掌握程度,本文将从教学实践的角度,探讨如何进行操作系统教学。

二、教学目标1. 使学生掌握操作系统的基本概念、原理和关键技术;2. 培养学生分析和解决实际问题的能力;3. 增强学生的团队协作和创新能力;4. 提高学生的编程能力和动手能力。

三、教学内容1. 操作系统概述:介绍操作系统的定义、发展历程、分类和特点;2. 进程管理:讲解进程的概念、进程状态、进程调度算法和进程同步与互斥;3. 存储管理:分析内存分配策略、页面置换算法和虚拟内存技术;4. 文件系统:探讨文件系统的概念、目录结构、文件操作和存储设备管理;5. 设备管理:介绍设备的分类、驱动程序、I/O控制方式和中断处理;6. 网络操作系统:讲解网络操作系统的基本概念、网络协议、网络设备管理和网络安全。

四、教学实践1. 案例教学:通过实际案例,引导学生分析操作系统的原理和应用。

例如,以Linux系统为例,讲解进程调度、内存管理和文件系统等知识点。

2. 实验教学:设计实验项目,让学生动手实践操作系统的相关知识。

实验项目包括:(1)进程调度实验:让学生编写进程调度算法,实现进程的创建、调度和同步。

(2)内存管理实验:让学生实现内存分配、页面置换和虚拟内存等技术。

(3)文件系统实验:让学生实现文件系统的目录结构、文件操作和存储设备管理。

(4)设备管理实验:让学生编写设备驱动程序,实现设备的控制和管理。

3. 项目教学:以实际项目为背景,让学生分组完成项目开发。

项目可以包括:(1)操作系统模拟器:让学生模拟操作系统的运行过程,加深对操作系统原理的理解。

(2)嵌入式操作系统开发:让学生了解嵌入式操作系统的特点,掌握嵌入式开发技能。

(3)分布式操作系统开发:让学生了解分布式系统的原理,掌握分布式操作系统的开发方法。

《操作系统》课程实验报告

《操作系统》课程实验报告一、实验目的本次《操作系统》课程实验的主要目的是通过实际操作和观察,深入理解操作系统的工作原理、进程管理、内存管理、文件系统等核心概念,并掌握相关的操作技能和分析方法。

二、实验环境1、操作系统:Windows 10 专业版2、开发工具:Visual Studio Code3、编程语言:C/C++三、实验内容(一)进程管理实验1、进程创建与终止通过编程实现创建新进程,并观察进程的创建过程和资源分配情况。

同时,实现进程的正常终止和异常终止,并分析其对系统的影响。

2、进程同步与互斥使用信号量、互斥锁等机制实现进程之间的同步与互斥。

通过模拟多个进程对共享资源的访问,观察并解决可能出现的竞争条件和死锁问题。

(二)内存管理实验1、内存分配与回收实现不同的内存分配算法,如首次适应算法、最佳适应算法和最坏适应算法。

观察在不同的内存请求序列下,内存的分配和回收情况,并分析算法的性能和优缺点。

2、虚拟内存管理研究虚拟内存的工作原理,通过设置页面大小、页表结构等参数,观察页面的换入换出过程,以及对系统性能的影响。

(三)文件系统实验1、文件操作实现文件的创建、打开、读取、写入、关闭等基本操作。

观察文件在磁盘上的存储方式和文件系统的目录结构。

2、文件系统性能优化研究文件系统的缓存机制、磁盘调度算法等,通过对大量文件的读写操作,评估不同优化策略对文件系统性能的提升效果。

四、实验步骤(一)进程管理实验步骤1、进程创建与终止(1)使用 C/C++语言编写程序,调用系统函数创建新进程。

(2)在子进程中执行特定的任务,父进程等待子进程结束,并获取子进程的返回值。

(3)通过设置异常情况,模拟子进程的异常终止,观察父进程的处理方式。

2、进程同步与互斥(1)定义共享资源和相关的信号量或互斥锁。

(2)创建多个进程,模拟对共享资源的并发访问。

(3)在访问共享资源的关键代码段使用同步机制,确保进程之间的正确协作。

(4)观察并分析在不同的并发情况下,系统的运行结果和资源竞争情况。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

操作系统进程同步的教学实践李志民1 赵一丁2 底恒3(中原工学院计算机学院,河南郑州 450007)摘要:针对操作系统课程中,存在进程同步内容抽象、难以理解的教学实际,本文在分析进程相互制约关系的基础上,归纳出利用信号量机制实现进程同步、互斥的一般性解题思路,以“生产者-消费者问题”为例阐述了具体的解题步骤,在教学过程中结合基于java多线程的可编程操作代码,通过真实的运行结果把抽象知识变为易理解的知识,取得在理论教学方面提高学生学习兴趣、在实践教学方面提高学生实际动手能力的效果。

关键词:进程;同步;互斥;信号量;多线程中图分类号:G642 文献标识码:A操作系统课程的进程同步问题是该课程的核心知识点,也是学习难点。

解决同步和互斥问题最常用的方法就是信号量机制,通过在程序算法中使用P、V 操作达到同步和互斥的目的[1],信号量与P、V 操作是低级的同步机构,用它们很难表示复杂的并发性问题,在并发程序中的出现P、V 操作,使得程序正确性证明更加困难[2]。

在教学过程中,发现很多学生对上课所讲的例子大部分都清楚它的算法,可是当遇到一个新的同步与互斥问题,很多学生觉得还是无从下手,感到困惑。

下面以“生产者-消费者问题”为案例,从进程的相互制约关系入手,归纳出进程同步、互斥的解题思路和解题步骤,利用java代码实现多线程同步,把抽象的知识变为具体可理解知识,提高教学效果。

1 进程同步、互斥的一般性解题思路对于进程的同步与互斥问题,学会问题解决的分析过程,理清解决此类问题的解题思路,是很重要的。

《操作系统》课程中利用信号量机制实现进程的互斥和同步,以记录型信号量为例,利用信号量的P、V操作解决进程同步问题的解题步骤,归纳如下:1.1 确定进程数和进程间的制约关系首先,分析待解决的实际问题,提炼出实际问题进程的数量;然后,根据各进程的活动描述,判断进程间的相互制约关系:(1)如果共享某种临界资源,进程间属于间接相互制约关系,称进程互斥;(2)如果进程间的合作带有前趋、后继关系,进程间属于直接相互制约关系,称进程同步;(3)同时存在互斥和同步两种制约关系。

根据这三种制约关系,分别按1.2、1.3、1.4进行处理。

1.2 进程互斥的解题步骤(1)找出临界资源、临界区;(2)为每个临界资源设一个互斥信号量,如mutex,初始值为n;(n是临界资源的个数) (3)在临界区前加入wait(mutex)原语,作为进入区;在临界区后加入signal(mutex)原语,作为退出区;注意:wait(mutex)和signal(mutex)成对出现在同一个进程中。

1.3 进程同步的解题步骤(1)确定进程之间的前趋关系,画出前趋线;(2)为每条前趋线设一个同步信号量,如empty;(3)在前趋线的箭头前插入wait(empty)原语,作为进入区;箭尾后插入signal(empty)原语,作为退出区;(4)同步信号量empty的初始值为n或0;(n为正整数,是申请资源的初始单位数)同步信号量的初值则要根据进程的初始状态确定,具体设置相应的值。

一般情况下:不能率先执行的wait()原语,其信号量初值为0,否则为n;注意:wait(empty)和signal(empty)成对出现在不同进程中。

1.4进程互斥、同步同时存在时的解题步骤(1)如果进程间存在互斥和同步两种制约关系,分别按照2.2和2.3的解题步骤执行;(2)在同一个进程的进入区中可能会出现两个wait()原语,一定要先写同步信号量,后写互斥信号量;否则,可能出现死锁现象;(3)在同一个进程的退出区中可能会出现两个signal()原语,书写顺序没有严格要求;规范的写法是:先写互斥信号量,后写同步信号量;注意:(1)一定要检查两个wait()原语的顺序,不能颠倒;(2)wait()和signal()必须成对出现,否则会出现死锁现象[3],影响系统性能。

1.5 用类Pacal 语言描述进程同步或互斥算法根据上面几个步骤分析的结果,就可以类Pacal 语言或其它语言实现同步与互斥的算法。

初学者开始时可以按上述步骤解决同步和互斥问题,以上讲述的只是一般的求解规则,有一定的可操作性,但在实际应用中还是要针对具体情况,多做多想,领悟出其中的原理和窍门。

2 基于信号量机制的“生产者--消费者问题”的同步算法以“多生产者-多消费者-多缓冲”问题为例,给出进程同步与互斥的解题步骤。

2.1 确定进程数和进程间的制约关系通过分析就会发现,该问题中生产者、消费者各是一类进程。

并发执行过程如图1所示:表示进程之间的前趋关系图1 生产者-消费者的制约关系两类进程既共享缓冲区计数这一临界资源,又具有“先放再取②→⑴、取后再放⑵→①”的两条前趋关系,进程间同时存在互斥和同步两种制约关系。

2.2 解题步骤2.2.1 进程同步的解题步骤(1)找出临界资源:共享缓冲区的计数;(2)为临界资源设一个互斥信号量,如mutex,初始值为1;(3)在临界区前加入wait(mutex)原语、signal(mutex)原语;2.2.2 进程同步的解题步骤(1)确定进程之间“先放再取、取后再放”的两条前趋关系,画出前趋线;(2)为每条前趋线设一个同步信号量,分别是empty、full;(3)在前趋线的箭头前分别插入wait(empty)、wait(full),箭尾后插入signal(empty)、signal(full);(4)同步信号量empty的初始值为n(缓冲区的大小),full的初始值为0;2.2.3 用类Pacal 语言描述进程同步或互斥算法生产者进程:消费者进程:生产一个产品; wait(full);wait(empty); wait(mutex);wait(mutex);从缓冲区取产品;将产品放入缓冲区;缓冲区计数减1;缓冲区计数加1; signal(mutex);signal(mutex); signal(empty)signal(full);消费;注意:(1)wait(mutex)和signal(mutex)成对出现在同一个进程中。

(2)wait(mutex)和signal(mutex)成对出现在不同进程中。

(3)一定要检查两个wait()原语的顺序,不能颠倒;否则会出现死锁现象,影响系统性能。

3 基于java多线程的“生产者-消费者问题”的同步实现操作系统的课程实验旨在加深学生对理论的理解。

对于进程同步问题,线程是轻型进程, Java为同步线程提供了两个方法:object类的wait()方法和notify()方法。

当线程请求资源而未能满足时,调用wait()方法使线程等待,并将它排在等待队列上; 当线程对资源访问完后,通过notify()方法唤醒等待队列上的线程[4]。

下面是实现生产者-消费者同步的完整的java可运行代码:public class Store {private final int MAX;private int count;public Store(int n){MAX=n; count=0; }public synchronized void addData() throws Exception{ while(count==MAX){this.wait();}count++;System.out.println(Thread.currentThread().getName() +" add a data:"+count);this.notifyAll();}public synchronized void removeData() throws Exception{while(count==0){this.wait(); }System.out.println(Thread.currentThread().getName()+" remove a data:"+count);count--;this.notifyAll(); }}class Producer extends Thread{private Store s;public Producer(Store s){this.s=s;}public void run() {while(true){try {s.addData();Thread.sleep(100);} catch (Exception e) {}}}}class Consumer extends Thread{private Store s;public Consumer(Store s){ this.s=s;}public void run(){while(true){try {s.removeData();Thread.sleep(100);} catch (Exception e) {}}}}public class TestPC {public static void main(String[] args) {Store s=new Store(100);Producer p1=new Producer(s);Producer p2=new Producer(s);Producer p3=new Producer(s);Producer p4=new Producer(s);p1.setName("P01"); p2.setName("p02");p3.setName("P03"); p4.setName("p04");p1.start(); p2.start();p3.start(); p4.start();Consumer c1=new Consumer(s);Consumer c2=new Consumer(s);Consumer c3=new Consumer(s);Consumer c4=new Consumer(s);c1.setName("c01"); c2.setName("c02");c3.setName("c03"); c4.setName("c04");c1.start(); c2.start();c3.start(); c4.start();}}编写测试类,同时调用多个生产者线程和消费者线程,由于多线程并发执行,每次的执行结果可能不尽相同,下面分别是4个生产者线程和4个消费者线程两次并发执行的结果,如图2所示:图2 P-C同步的两次运行结果通过多次执行结果的比较,可以直观地理解进程并发的实质,通过案例教学,可以清楚地观察进程互斥和同步的并发执行过程。

相关文档
最新文档