操作系统——基于信号量机制的并发程序设计

实验九*基于信号量机制的并发程序设计 一、实验目的 (1)回顾操作系统进程、线程的有关概念,针对经典的同步、互斥、死锁与饥饿问题进行并发程序设计。 (2)了解互斥体对象,利用互斥与同步操作编写读者-写者问题的并发程序,加深对P(即semWait)、V(即semSignal)原语以及利用P、V原语进行进程间同步与互斥操作的理解。 二、总体设计(含背景知识或基本原理与算法、或模块介绍、设计步骤等) 背景知识: 读者写者问题:有读者和写者两组并发进程,共享一个文件,当两个或两个以上的读进程同时访问共享数据时不会产生副作用,但若是某个写进程和其他进程同 阅读详情

一、实验题目

基于信号量机制的并发程序设计

二、实验目的

(1) 回顾操作系统进程、线程的有关概念,针对经典的同步、互斥、死锁与饥饿问题进行并发

程序设计。

(2) 了解互斥体对象,利用互斥与同步操作编写读者-写者问题的并发程序,加深对 P (即

semWait)、V(即 semSignal)原语以及利用 P、V 原语进行进程间同步与互斥操作的理解。

(3) 理解 Linux 支持的信息量机制,利用 IPC 的信号量系统调用编程实现哲学家进餐问题。

三、总体设计(含背景知识或基本原理与算法、或模块介绍、设计步骤等)

读者-写者问题:

*在读者-写者问题中,多个读者可以同时读取共享资源,但只能有一个写者可以写入共享资源。

*使用互斥体对象(mutex)实现对共享资源的互斥访问。

*使用信号量(semaphore)实现读者和写者之间的同步和互斥操作。

存在一个多进程共享的数据区,该数据区可以是一个文件或一块内存空间,甚至可以是一组寄存器,有些进程(reader)只读取这个数据区中的数据,有些进程(writer)只往数据区中写数据。此外,还必须满足:

1.任意数量的读进程可同时读这个文件。

2.一次只有一个写进程可以写文件

3.若写进程正在写文件,则禁止任何读进程读文件。

书上实现的读者优先的算法思路是:

写进程比较简单,信号量WriteSemaphore用于实施排斥,只要一个写进程正在访问数据区,其他写进程和读进程就都不能访问它。读进程也使用WriteSemaphore实施互斥,但为了允许多个读进程,没有读进程正在读时,第一个试图读的读进程需要在WriteSemaphore上等待。当至少已有一个读进程在读时,随后的读进程无须等待,可以直接进入。readcount用于记录读进程的数量,信号量XSemaphore用于确保readcount被正确地更新。

四、详细设计(含主要的数据结构、程序流程图、关键代码等)

读者-写者问题的并发程序设计

 

使用互斥体对象mutex来保证对共享资源的互斥访问。

使用两个信号量readers和writers来控制读者和写者之间的同步和互斥操作。

读者线程:

在进入临界区之前,使用sem_wait(&readers)来等待其他读者完成读取操作。

进入临界区读取共享资源。

使用sem_post(&readers)来释放读者信号量。

写者线程:

在进入临界区之前,使用sem_wait(&writers)来等待其他写者完成写入操作。

进入临界区写入共享资源。

使用sem_post(&writers)来释放写者信号量。

代码:

#include <windows.h>

#include <iostream>

#define MAX_READER_NUM 512

#define READER_NUM 3

#define WRITER_NUM 2

#define MOD 100

using namespace std;

int readcount = 0;

HANDLE WriteSemaphore; //实现读写互斥

HANDLE XSemaphore; //对于人数修改的互斥量

DWORD WINAPI reader(LPVOID); //读者线程

DWORD WINAPI writer(LPVOID); //写者线程

bool p_ccontinue = true;    //控制程序结束

int test = 0;

int main()

{

    //初始化两个信号量

    /*结构体指针;信号量对象的初始计数;信号量对象的最大计数;信号量对象的名称*/

    WriteSemaphore = CreateSemaphore(NULL,1,MAX_READER_NUM,NULL);

    XSemaphore = CreateSemaphore(NULL,1,MAX_READER_NUM,NULL);

    //用WindowsAPI模拟课本上 parbegin(reader,writer);

    //总的线程数

    HANDLE hThreads[READER_NUM + WRITER_NUM]; //各线程的 handle

    DWORD readerID[READER_NUM]; //读者线程的标识符

    DWORD writerID[WRITER_NUM]; //写者线程的标识符

    //创建读者线程

    for (int i=0; i<READER_NUM; i++)

    {

        hThreads[i]=CreateThread(NULL,0,reader,NULL,0,&readerID[i]);

        if (hThreads[i]==NULL)

            return -1;

    }

    //创建写者线程

    for (int i=0; i<WRITER_NUM; i++)

    {

        hThreads[READER_NUM+i]=CreateThread(NULL,0,writer,NULL,0,&writerID[i]);

        if (hThreads[i]==NULL)

            return -1;

    }

    while(p_ccontinue)

    {

        if(getchar())  //按回车后终止程序运行

        {

            p_ccontinue = false;

        }

    }

    return 0;

}

//读者阅读

void READUNIT()

{

    cout<<"一个读者开始阅读:";

    cout<<test<<endl;

}

//写者写

void WRITEUNIT()

{

    cout<<"写者开始写:";

    test = (test+1) % MOD;

    cout<<test<<endl;

}

//读者

DWORD WINAPI reader(LPVOID lpPara)

{

    while(p_ccontinue)

    {

        WaitForSingleObject(XSemaphore,INFINITE); //semWait(x);

        readcount++;

        if(readcount == 1)  //第一个读者来了

            WaitForSingleObject(WriteSemaphore,INFINITE); //semWait(wsem);

        ReleaseSemaphore(XSemaphore,1,NULL); //semSignal(x);

        READUNIT();

        //阅读完毕

        WaitForSingleObject(XSemaphore,INFINITE); //semWait(x);

        readcount--;

        //无读者,释放资源

        if(readcount == 0)

            ReleaseSemaphore(WriteSemaphore,1,NULL); //semSignal(wsem);

        ReleaseSemaphore(XSemaphore,1,NULL); //semSignal(x);

        Sleep(3000);

    }

    return 0;

}

//写者

DWORD WINAPI writer(LPVOID lpPara)

{

    while(p_ccontinue)

    {

        WaitForSingleObject(WriteSemaphore,INFINITE); //semWait(wsem);

        WRITEUNIT();

        ReleaseSemaphore(WriteSemaphore,1,NULL); //semSignal(wsem);

        Sleep(2000);

    }

    return 0;

}

五、实验结果与分析

这段代码的实验结果是模拟了读者和写者对共享资源的并发访问。由于读者和写者之间的同步和互斥操作,读者和写者会交替地对共享资源进行读取和写入操作。通过输出信息可以观察到读者和写者的行为。

值得注意的是,读者和写者之间的调度是不确定的,所以每次运行结果可能略有不同。读者和写者的执行顺序会根据操作系统的调度策略和线程的竞争情况而有所变化。

总体来说,这段代码演示了使用互斥体和信号量来实现读者-写者问题的基本思路和实现方式。通过合理地控制互斥访问和同步操作,可以确保多个读者和写者之间对共享资源的正确访问和修改。

 

六、小结与心得体会

在这个实验中,我们通过使用互斥体对象和信号量机制,成功设计了一个并发程序来解决读者-写者问题。通过这个实验,我得出了以下的小结和心得体会:

1.熟悉操作系统的进程和线程概念:在设计并发程序之前,我们需要对操作系统的进程和线程有一定的了解。了解进程和线程的概念、特点以及它们之间的关系,能够帮助我们更好地理解并发编程的问题和解决方法。

2.理解同步和互斥的重要性:在多个线程同时访问共享资源时,必须确保对共享资源的访问是同步和互斥的。通过使用互斥体对象和信号量,我们可以实现线程之间的同步和互斥操作,避免数据竞争和不一致的结果。

3.学会使用信号量机制:信号量是一种常用的并发编程机制,它可以用来控制并发线程之间的访问和同步。在本实验中,我们使用信号量来控制读者和写者之间的访问和修改共享资源的操作。学会使用信号量的原语,如sem_wait和sem_post,能够有效地实现线程之间的同步和互斥。

4.注意死锁和饥饿问题:在设计并发程序时,需要注意死锁和饥饿问题的可能性。死锁是指多个线程互相等待对方释放资源而无法继续执行的情况,而饥饿则是指某些线程由于资源分配不均而无法得到执行的情况。在本实验中,我们通过合理地设计互斥和同步操作,避免了死锁和饥饿的发生。

5.调试并发程序的挑战:并发程序的调试相对复杂,因为线程的执行顺序是不确定的,可能存在竞争条件和难以重现的错误。在本实验中,我们可以通过输出信息来观察并验证读者和写者的行为,以及共享资源的正确访问和修改。同时,运用调试工具和技巧可以帮助我们更好地理解程序的执行流程和发现潜在的问题。

通过完成这个实验,我对并发程序设计有了更深入的理解。同时,我也意识到在实际开发中,合理地设计并发程序是至关重要的,它涉及到线程之间的协作和资源管理。合理使用同步和互斥机制,能够提高程序的性能、可靠性和正确性,避免出现数据竞争和不一致的结果。并发编程是一项挑战,但也是一项有趣和重要的技能,对于开发高效、可扩展的应用程序至关重要。

基于嵌入式操作系统VxWorks 的多任务并发程序设计(6) 基于嵌入式操作系统VxWorks 的多任务并发程序设计(6)――综合实例作者:宋宝华 e-mail:21cnbao@21cn.com这一次连载我们将给出一个综合的实例,系统地用到连载1~5中所学的知识。13 系统描述假设我们面对这样的一个通信控制系统,它由三大部分组成:运行于PC 机Windows 操作系统上的人机界面程序、运行于RISC 结构通用处理器上的VxWorks操作系统和运行于数字信号处 阅读详情

相关推荐

山东大学 操作系统 实验四 进程同步实验

山东大学 操作系统 实验四 进程同步实验

操作系统实验——进程管理与进程通信

广州大学学生实验报告 实验一 进程管理与进程通信 一、实验目的 1、掌握进程的概念,明确进程的含义。 2、认识并了解进程并发执行的实质,进程的阻塞与唤醒,终止与退出的过程。 3、熟悉进程的睡眠、同步、撤消等进程控制方法。 4、分析进程竞争资源的现象,学习解决进程互斥的方法 。 5、了解什么是信号,利用信号量机制熟悉系统中进程之间软中断通信的基本原理, 6、熟悉进程管道通信方式,消息传送的机理 ,...

qq_39792908的博客 1万+

一分钟学会MATLAB-数据清洗(含完整代码)

数据清洗是数据分析过程中的一个重要步骤,目的是提高数据的质量,以便进行更有效的分析。% 删除超出阈值的行。% 用线性插值填充缺失值。% 删除包含缺失值的行。% 找到缺失值的位置。% 可视化数据,识别异常值。缺失值是数据清洗中常见的问题。通过以上步骤,你可以有效地清洗数据,使其准备好进行后续的分析和建模。

2402_87132195的博客 3316

操作系统--信号量的实现

函数的作用是尝试获取信号量,如果信号量的值大于零,则将其减一并继续执行。当计数值等于零时,表示资源已被占用,需要等待其他线程释放资源(在哈工大操作系统上李志军老师的代码讲解中用sem来表示这个量,稍微有点小不同,但是思想是一样的)。的链表头,用于存储等待该信号量的线程的链表。当一个线程无法获取信号量时,它会被添加到该链表中,等待资源的释放(相当于一个等待队列,不过是用链表实现的)。函数是一个不可中断的下降操作,如果进程在等待过程中被中断信号中断,它将一直等待直到获取到信号量资源或者被显式唤醒。

qq_30528603的博客 454

WPF实战:HelixToolkit 3D图形开发入门指南

本文详细介绍了如何使用HelixToolkit在WPF中进行3D图形开发,从环境搭建到创建第一个3D程序(如彩色立方体),再到进阶技巧和常见问题排查。通过实战案例和性能优化建议,帮助开发者快速掌握3D场景构建和模型导入技术,提升开发效率。

weixin_29197051的博客 756

Dell R730安装Windows Server 2008 R2

一、RAID驱动准备  在安装Windows server2008 R2操作系统时,如果没有发现硬盘,请将下面的阵列卡驱动先解压(在下载的.exe文件,双击点下一步会自动解压),解压后把那文件夹复制到U盘中。阵列卡 PERC9 H330 - H730 - H730P - H830 Controllers for Windows Server 2008 R2二、系统安装方法方法一:光盘安装  ①请您...

MarshLin 2万+

2020年暨南大学计算机848真题及答案

2020年暨南大学计算机848真题及答案

u014339447的博客 3330

STM32--基于STM32F103C8T6的OV7670摄像头显示

使用 STM32F103C8T6 微控制器驱动 OV7670 摄像头模组,并将图像数据显示在屏幕上,是嵌入式系统中常见的图像采集与显示应用。OV7670 是一款 CMOS VGA 图像传感器,具有高灵敏度、低电压等特点,适用于嵌入式应用。而 STM32F103C8T6 是一款常用的 MCU 控制器,具有丰富的管脚资源和较高的工作频率。

duierrorshuobu的博客 2145

8 操作系统第二章 进程管理 信号量 PV操作 用信号量机制实现 进程互斥、同 步、前驱关系

文章目录1 信号量机制1.1 整形信号量1.2 记录形信号量1.3 信号量机制小结2 用信号量机制实现进程互斥、同 步、前驱关系2.1 信号量机制实现进程互斥2.2 信号量机制实现进程同步2.3 信号量机制实现前驱关系2.4 信号量机制实现进程互斥、同 步、前驱关系小结 1 信号量机制 用户进程可以通过使用操作系统提供的一对原语来对信号量进行操作,从而很方便的实现了进程互斥、进程同步。 信号量其实就是一个变量 ,可以用一个信号量来表示系统中某种资源的数量,比如:系统中只有一台打印机,就可以设置一个初值为

夜飘凌的博客 4170

Nvidia Orin Driveos Camera 介绍及调试详解

自动驾驶-nvidia orin driveos Camera 驱动详解及调试

u011803281的博客 2990

Halcon算子知识:optical_flow_mg

光流(Optical Flow)是一种研究图像对齐的算法,一般包括两大类:稀疏光流和稠密光流。稀疏光流就是研究图像中稀疏点的光流,这些点一般是角点;稠密光流则是研究图像中所有点的偏移量。以下介绍halcon的基本光流算子optical_flow_mg的原理方法。该算子计算两个图片的光流法。 二、算子说明 optical_flow_mg(ImageT1, ImageT2 : VectorField : Algorithm, SmoothingSigma, Integration

gongdiwudu的专栏 1万+

操作系统课程设计---实验九 基于信号量机制的并发程序设计

操作系统课程设计—实验九基于信号量机制的并发程序设计 实验九 基于信号量机制的并发程序设计 1、实验目的 (1) 回顾操作系统进程、线程的有关概念,针对经典的同步、互斥、死锁与饥饿问题进行并发 程序设计与实现。 (2) 理解互斥体对象,利用互斥与同步操作编写读者-写者问题的并发程序,加深对 P (即semWait)、V(即 semSignal)原语以及利用 P、V 原语进行进程间同步与互斥操作的理解。 (3) 理解 Linux 支持的信息量机制,利用 IPC 的信号量系统调用编程实现哲学家进餐问题。 2、设

陈陈不like的博客 2837

基于 YOLOv26 的高速抛物识别系统:微小目标检测

本文提出了一种基于YOLOv26的高速抛物识别系统,专注于微小目标检测。系统采用多模块协同架构,包括视频预处理、YOLOv26检测、目标跟踪和抛物行为分析等模块。关键技术包括YOLOv26s模型检测、DeepSORT目标跟踪和边缘计算部署。通过构建包含多种抛物类型的专业数据集,并应用数据增强技术提升模型性能。系统实现了车辆检测、微小抛物目标识别、抛物轨迹分析和风险等级评估等功能,可实时检测高速公路上的抛物行为并触发告警,为交通管理提供智能化解决方案。

一键难忘的博客 630

操作系统课设之基于信号量机制的并发程序设计

操作系统课程设计 读者写者问题 PV操作

RongLin02的博客 4946

pytorch搭建SSAE实现预测分类代码模板完整代码

pytorch搭建SSAE实现预测分类代码模板完整代码

323

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

操作系统课程设计-基于信号量机制的并发程序设计

本实验为课设内容,博客内容为部分报告内容,仅为大家提供参考,请勿直接抄袭,另外,本次实验所用平台是dev c++5.11。

qq_63306482的博客 1031

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

操作系统课设--基于信号量机制的并发程序设计

操作系统课设 1、实验目的 (1)回顾操作系统进程、线程的有关概念,针对经典的同步、互斥、死锁与饥饿问题进行并发程序设计。 (2)了解互斥体对象,利用互斥与同步操作编写读者-写者问题的并发程序,加深对 P (即 semWait)、V(即 semSignal)原语以及利用 P、V 原语进行进程间同步与互斥操作的理解。 (3)理解 Linux 支持的信息量机制,利用 IPC 的信号量系统调用编程实现哲学家进餐问题。 2、设计任务: (1)读者-写者问题的并发程序设计 (2)哲学家进餐问题的并发程序设计以上两个任

Greic的博客 1072

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

操作系统 课堂练习题03【20道 经典题目】

【2021年03月18日(第03周)星期四 课堂练习题】 1、进程同步 2、信号量机制及应用

upward 367

操作系统课程设计(linux操作系统)

操作系统课程设计 本操作系统课程设计主要在linux虚拟机上操作,请下载虚拟机相关软件!实验一 Windows 进程管理实验二 Linux进程管理实验三 Linux进程间通信实验四 Windows 的互斥与同步实验五 内存管理实验六 银行家算法的模拟与实现实验七 磁盘调度算法的模拟与实现实验八 虚拟内存页面置换算法的模拟与实现实验九 基于信号量机制的并发程序设计实验十一 简单二级文件系统的设计 本操作系统课程设计主要在linux虚拟机上操作,请下载虚拟机相关软件! 更多课程设计源码请进主页查看搜索:

陈陈不like的博客 1万+

基于嵌入式操作系统VxWorks的多任务并发程序设计(4)――任务间通信A

基于嵌入式操作系统VxWorks的多任务并发程序设计(4)――任务间通信作者:宋宝华  e-mail:[email]21cnbao@21cn.com[/email] 出处:软件报VxWorks提供了多种任务间通信方式,主要有:(1)共享内存(Shared Memory),用于简单的数据共享;由于VxWorks的所有任务存在于单一的线性地址空间,所以任务间可共享数据,全局变量、线性队列、环形队列、链...

weixin_34409357的博客 500

内功修炼之操作系统学习(三:同步、通信及死锁)

内功修炼之操作系统学习三:同步、通信及死锁 进程并发性是指一组进程的执行在时间上是重叠的。所谓时间重叠是指一个进程执行第一条指令是在另一个进程执行完最后一条指令之前开始的。从宏观上来看,并发性反映一个时间段内有几个进程都处于运行态但尚未结束的状态。从微观上来看,任一时刻仅有一个进程的一个操作在处理器上执行。 现代计算机硬部件能同时进行工作,程序的编制决定不同硬部件并行工作的能力。好的程序能...

系统运维 108

吉林大学 操作系统 23个常见的名词解释

RCU(Read-Copy Update):对于被RCU保护的共享数据结构,读者不需要获得任何锁就可以访问它,但写者在访问它时首先拷贝一个副本,然后对副本进行修改,最后使用 一个回调(callback)机制在适当的时机把指向原来数据的指针重新指向新的被修改的数据。操作系统(Operation System) :是指控制和管理整个计算机系统的硬件和软件资源,并合理的组织和调度计算机的工作和资源的分配,以提供给用户和其它软件方便的接口和环境,它是计算机系统中最基本的系统软件。

weixin_61197809的博客 4294

【操作系统】选择题复习题(以后使用)

1.操作系统是一种()。 A.通用软件 B.系统软件 C.应用软件 D.软件包 我的答案:B2.[单选题] 操作系统是对()进行管理的软件。 A.软件 B.硬件 C.计算机资源 D.应用程序 我的答案:C3.[单选题] 下面关于操作系统说法错误的是()。 A.操作系统是最核心的软件 B.操作系统间接控制硬件 C.操作系统控制其他软件 D.操作系统可以提高系统的效率 我的答案:B4.[单选题] 关于操作系统和支撑软件的说法错误的是() A.操作系统在支撑软件的基础之上才能运行 B.操作系统控制支撑软件 C.支

Bessie_Lee 5356

操作系统第二章复习

一、判断题 1-1多个进程可以对应于同一个程序,且一个进程也可能会执行多个程序。√ 一个程序多个进程:一台电脑可以登录很多qq 一个进程多个程序:UI进程可以在qq,360,LOL等程序执行 1-2并发性是指若干事件在同一个时刻发生。 × 同一时间间隔 1-3用户为每个自己的进程创建PCB,并控制进程的执行过程。 × PCB是由操作系统初启时创建的,并控制进程的执行过程 1-4原语是一种不可分割的操作。 √ 原语具有原子性即不可再分割,一旦执行必须一次性执行完毕 1-5进程可以删除自己的PCB

DreamWendy的博客 7839

操作系统——练习题

文章目录第一章 操作系统引论第二章 进程和线程第三章 处理机调度第五章 内存管理第六章 文件管理第七章 设备管理错难题 第一章 操作系统引论 第二章 进程和线程 解答: 同步关系: 1、爸爸把牛奶糖放盘里,儿子才能取; 2、爸爸把酥糖放盘里,儿子才能取; 互斥关系: 对盘子的访问是互斥的进行; semaphore mutex = 1; //实现互斥访问盘子 semaphore milk = 0; //盘中有几个牛奶糖 semaphore s

m0_53249319的博客 289

操作系统简答题

想整理一份比较全的用于复习和考试的操作系统简答题,持续更新中

Yurken的博客 1835
上一篇: 操作系统——磁盘调度算法的模拟与实现
下一篇: 操作系统——实现一个简单的 shell 命令行解释器
jakeonil
博客等级 码龄5年 1万+粉丝 60原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jakeonil

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值