首页 > 系统相关 >03_实验三_进程同步

03_实验三_进程同步

时间:2023-12-07 23:35:30浏览次数:38  
标签:03 进程同步 信号量 互斥 原语 实验 缓冲区 进程 操作

实验三 进程同步

实验目的

  • 使用 EOS 的信号量,编程解决生产者—消费者问题,理解进程同步的意义。

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

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

预备知识

信号量机制

问题:

1.在双标志先检查法中,进入区的“检查”、“上锁”操作无法一气呵成,从而导致了两个进程有可能同时进入临界区的问题:
2.所有的解决方案都无法实现“让权等待”。

Dijkstra提出了信号量机制。

用户进程可以通过使用操作系统提供的一对原语来对信号量进行操作,从而很方便的实现了进程互斥、进程同步。

信号量其实就是一个变量(可以是一个整数,也可以是更复杂的记录型变量),可以用一个信号量来表示系统中某种资源的数量,比如:系统中只有一台打印机,就可以设置一个初值为1的信号量。

原语是一种特殊的程序段,其执行只能一气呵成,不可被中断。原语是由关中断/开中断指令实现的。软件解决方案的主要问题是由“进入区的各种操作无法一气呵成”,因此如果能把进入区、退出区的操作都用“原语”实现,使这些操作能“一气呵成”就能避免问题。

一对原语:wait(S)原语和signal((S)原语,可以把原语理解为我们自己写的函数,函数名分别为wait和signal,,括号里的信号量S其实就是函数调用时传入的一个参数。

wait、signal原语常简称为P、V操作(来自荷兰语proberen和verhogen)。因此,做题的时候常把wait(S以、signal(S)两个操作分别写为P(S)、V(S)

整型信号量

用一个整数型的变量作为信号量,用来表示系统中某种资源的数量

image-20231120221041144

  • 存在的问题:不满足“让权等待”原则,会发生“忙等”

记录型信号量

整型信号量的缺陷是存在“忙等”问题,因此人们又提出了“记录型信号量”,即用记录型数据结构表示的信号量。

image-20231120221736209

对信号量S的一次P操作意味着进程请求一个单位的该类资源,因此需要执行S.value-,表示资源数减1,当S.vaue<0时表示该类资源已分配完毕,因此进程应调用bock原语进行自我阻塞(当前运行的进程从运行态→阻塞态),主动放弃处理机,并插入该类资源的等待队列SL中。可见,该机制遵循了“让权等待”原则
不会出现“忙等”现象。

对信号量S的一次V操作意味着进程释放一个单位的该类资源,因此需要执行S.value++,表示资源数加1,若加1后仍是S.value<=0,表示依然有进程在等待该类资源,因此应调用wakeup原语唤醒等待队列中的第一个进程(被唤醒进程从阻塞态→就绪态

image-20231121120347319

EOS内核的三种同步对象

  • 互斥对象(Mutex)
  • 信号量对象(Semaphore)
  • 事件对象(Event)

这三种同步对象都涉及到两个状态signalednosignaled,进程间同步本质上是对这两个状态进行切换,不同对象有不同的切换逻辑,具体可参考源代码

EOS创建了如下调用,当线程对同步对象进行这种调用时,处于nosignaled的对象会变成signaled

ULONG WaitForSingleObject (
	IN HANDLE Handle,
	IN ULONG Milliseconds
)

生产者-消费者问题

系统中有一组生产者进程和一组消费者进程,生产者进程每次生产一个产品放入缓冲区,消费者进程每次从缓冲区中取出一个产品并使用。(注:这里的“产品”理解为某种数据)

生产者、消费者共享一个初始为空、大小为的缓冲区。

只有缓冲区没满时,生产者才能把产品放入缓冲区,否则必须等待。

只有缓冲区不空时,消费者才形从中取出严品,合则必须等待。

缓冲区是临界资源,各进程必须互斥地访问。

image-20231121175824881

  • 能否改变相邻的P,V操作的顺序?

image-20231121180155198

不能颠倒,实现互斥的P操作一定要在实现同步的P操作之后,V操作不会导致进程阻塞,因此两个V操作顺序可以颠倒。

  • 关系分析。找出题目中描述的各个进程,分析它们之间的同步、互斥关系。
  • 整理思路。根据各进程的操作流程确定P、V操作的大致顺序。
  • 设置信号量。设置需要的信号量,并根据题目条件确定信号量初值。(互斥信号量初值一般为1,同步信号量的初始值要看对应资源的初始值是多少)

多生产者-多消费者问题

image-20231121194210585

解决:

image-20231121200330035

总结:在生产者-消费者问题中,如果缓冲区大小为1,那么有可能不需要设置互斥信号量就可以实现互斥访问缓冲区的功能。当然,这不是绝对的,要具体问题具体分析。

建议:在考试中如果来不及仔细分析,可以加上互斥信号量,保证各进程一定会互斥地访问缓冲区。但需要注意的是,实现互斥的P操作一定要在实现同步的P操作之后,否则可能引起“死锁”。

重要:

比如,如果从单个进程行为的角度来考虑的话,我们会有以下结论:
如果盘子里装有苹果,那么一定要女儿取走苹果后父亲或母亲才能再放入水果

如果盘子里装有橘子,那么一定要儿子取走橘子后父亲或母亲才能再放入水果

这么看是否就意味着要设置四个同步信号量分别实现这四个“一前一后”的关系了?
正确的分析方法应该从“事件”的角度来考虑,我们可以把上述四对“进程行为的前后关系”抽象为一对“事件的前后关系”
盘子变空事件→放入水果事件。“盘子变空事件”既可由儿子引发,也可由女儿引发;“放水果事件”既可能是父亲执行,也可能是母亲执行。这样的话,就可以用一个同步信号量解决问题了。

从事件的角度出发去考虑问题

实验过程

image-20231117081523859

代码详见codecode已提交,就不在放在这里了

标签:03,进程同步,信号量,互斥,原语,实验,缓冲区,进程,操作
From: https://www.cnblogs.com/binbinzhidao/p/17884247.html

相关文章

  • 08_实验七_拓展实验二
    拓展实验2:在物理机上运行EOS操作系统任务一:改进EOS内核引导过程,实现裸机从无文件系统的平坦软盘镜像引导内核代码调整将EOS内核引导过程调整为U盘引导后,就不再需要对内核进行FAT文件系统相关内容的初始化,将其注释掉,否则会因为初始化失败而无法进入到内核。需要将文件......
  • 07_实验七_拓展实验一
    拓展实验1本拓展实验的任务和目标是为了更好的理解和认识EOS操作系统的内核程序。EOS的内核程序的代码在codecode平台已经给出。参考上面之前已经完成的6个基础实验的调试过程可以更好的理解内核程序的代码。然后调试一个应用程序的执行过程,详细了解了EOS操作系统的所有重要模......
  • 06_实验六_读文件和写文件
    读文件和写文件实验目的了解在EOS应用程序中读文件和写文件的基本方法。通过为FAT12文件系统添加写文件功能,加深对FAT12文件系统和磁盘存储器管理原理的理解。文件系统驱动程序的作用用户对文件的读写请求转换为对磁盘扇区的读写请求,并负责对磁盘扇区进行管理。实验内容......
  • 09_实验八_拓展实验三
    拓展实验三:线程调度算法改进实验目的实现多级反馈队列调度算法实验步骤实现时间片轮转调度算法。修改时间片的大小TICKS_OF_TIME_SLICE为100,方便观察执行后的效果。在控制台命令“rr”的处理函数中,将Sleep时间更改为200*1000,这样可以有充足的时间查看优先级降......
  • 实验四 Web服务器2
    实验四Web服务器2基于华为鲲鹏云服务器CentOS中(或Ubuntu),使用LinuxSocket实现:1.Web服务器的客户端服务器,提交程序运行截图2.实现GET即可,请求,响应要符合HTTP协议规范3.服务器部署到华为云服务器,浏览器用本机的4.把服务器部署到试验箱。(加分项)web_server.c1#include......
  • 实验四 Web服务器2
    server.c#include<stdio.h>#include<stdlib.h>#include<string.h>#include<unistd.h>#include<sys/types.h>#include<sys/socket.h>#include<netinet/in.h>#definePORT8080#defineBUFFER_SIZE1024intmain(){   int......
  • 实验四 Web服务器1
    Web服务器1-socket编程实验内容基于华为鲲鹏云服务器CentOS中(或Ubuntu),使用LinuxSocket实现:time服务器的客户端服务器,提交程序运行截图echo服务器的客户端服务器,提交程序运行截图,服务器把客户端传进来的内容加入“服务器进程pid你的学号姓名echo:”返回给客户端服务器......
  • 03-数码管显示
    03-数码管显示简介数码管led数码管:数码管是一种简单、廉价的显示器,是由多个发光二极管封装在一起组成“8”字型的器件数码管分为两种共阴极(下图上面一个电路图所示),共阴极情况下com端(也叫位选端)接低电平,段选段接高电平才会使二极管发光共阳极(下图下面一个电路图所示......
  • LOJ6039 「雅礼集训 2017 Day5」珠宝
    LOJ传送门显然枚举物品做背包没有前途,于是我们把体积相等的物品捆绑在一起。设\(f_{i,j}\)为考虑完体积\(\in[1,i]\)的物品,背包容量为\(j\)的最大值。可以贪心求出\(g_{i,j}\)为选\(j\)个体积为\(i\)的物品的价值最大值。分\(j\bmodi\)的余数转移,发现可以......
  • 实验四 Web服务器1-socket编程
    实验四Web服务器1-socket编程基于华为鲲鹏云服务器CentOS中(或Ubuntu),使用LinuxSocket实现:1.time服务器的客户端服务器,提交程序运行截图2.echo服务器的客户端服务器,提交程序运行截图,服务器把客户端传进来的内容加入“服务器进程pid你的学号姓名echo:”返回给客户端3.......