操作系统------进程同步和进程互斥

进程同步:由于操作系统的并发性导致各个进程的代码是以不可预知的速度向前推进的,这就导致我们无法知道两个进程的代码的执行顺序是怎么样的。而进程同步是规定了进程之间的执行顺序。

进程互斥:规定在一个时间段内只能有一个进程访问临界资源(需要互斥访问的资源),各个进程之间需要互斥访问。而实现进程互斥的那部分代码在逻辑上可以分为四个部分,进入区,临界区,退出区,剩余区。进入区:实现进程互斥的代码,阻止其它进程的访问。临界区:访问资源的那部分代码。退出区:负责释放资源的那部分代码。剩余区:除上面部分外的其它代码,用于实现其它功能。

实现进程互斥需要满足四个原则空闲让进,忙则等待,有限等待,让权等待。空闲让进:临界区空闲时,可以允许一个请求进入临界区的进程立即进入临界区。忙则等待:当已有进程进入临界区时,其他试图进入临界区的进程必须等待。有限等待:对请求访问的进程,应保证能在有限时间内进入临界区(保证不会饥饿)。让权等待:当进程不能进入临界区时,应立即释放处理机,防止进程忙等待。

实现进程互斥的软件方法有四种为单标志法,双标志先检查,双标志后检查,Peterson算法。

单标志法:两个进程在访问完临界区后会把使用临界区的权限转交给另一个进程。也就是说每个进程进入临界区的权限只能被另一个进程赋予。单标志法存在的主要问题是:违背“空闲让进”原则。

 双标志先检查:设置一个布尔型数组flag[],数组中各个元素用来标记各进程想进入临界区的意愿,比如“flag[0]=ture”意味着0号进程P0现在想要进入临界区。每个进程在进入临界区之前先检查当前有没有别的进程想进入临界区,如果没有,则把自身对应的标志flag[i]设为true,之后开始访问临界区。双标志先检查法的主要问题是:违反“忙则等待”原则。

 双标志后检查:双标志先检查法的改版。前一个算法的问题是先“检查”后“上锁”,但是这两个操作又
无法一气呵成,因此导致了两个进程同时进入临界区的问题。因此,人们又想到先“上锁”后“检查”
的方法,来避免上述问题。双标志后检查法虽然解决了“忙则等待”的问题,但是又违背了“空闲让进”和“有限等待”原则,会因各进程都长期无法访问临界资源而产生“饥饿”现象。

 Peterson算法:结合双标志法、单标志法的思想。如果双方都争着想进入临界区,那可以让进程尝试“孔融让梨”(谦让)。做一个有礼貌的进程。Peterson算法用软件方法解决了进程互斥问题,遵循了空闲让进、忙则等待、有限等待三个原则,但是依然未遵循让权等待的原则。

 进程互斥的硬件实现方法有三种为中断屏蔽方法,TestAndSet(TS指令/TSL指令),Swap指令(XCHG指令)。

中断屏蔽方法:利用“开/关中断指令”实现(与原语的实现思想相同,即在某进程开始访问临界区到结束访问为止都不允许被中断,也就不能发生进程切换,因此也不可能发生两个同时访问临界区的情况).

 TestAndSet(TS指令/TSL指令):TSL指令是用硬件实现的,执行的过程不允许被中断,只能一气呵成。以下是用C语言描述的逻辑。

 Swap指令:Swap指令是用硬件实现的,执行的过程不允许被中断,只能一气呵成。以下是用C语言描述的逻辑。

互斥锁:用于实现进程互斥的工具,当进程使用资源前先给该资源上锁,用完后在解锁。特性:
需要忙等,进程时间片用完才下处理机,违反“让权等待”。优点:等待期间不用切换进程上下文,多处理器系统中,若上锁的时间短,则等待代价很低常用于多处理器系统,一个核忙等,其他核照常工作,并快速释放临界区不太适用于单处理机系统,忙等的过程中不可能解锁。

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

信号量的值可以用操作系统提供的两个原语来修改,wait(s)原语和signal(s)原语这两个原语通常简称为P(s)操作和V(s)操作。对信号量的操作只有三种信号量的初始化,P操作和V操作。

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

 记录型信号量:用记录型数据结构表示的信号量(实现进程同步和进程互斥都是使用该信号量)。

 

 

 信号量机制实现进程同步:使用记录型信号量机制可以实现进程同步,先为想要实现进程同步的两个进程创建一个记录型信号量并把资源量设为0,之后在想要后执行的进程的那部分代码前加上一个P(s)操作,在想要先执行的进程的那部分代码后加上V(s)操作即可实现进程同步。原理是一开始的资源量为0,这就导致如果先执行需要后执行的进程里的P(s)操作的话会因为资源量进行减一操作后变为负数,从而使得进程陷入阻塞态只有等到需要先执行的进程执行V(s)操作释放资源后才能使进程变为就绪态重新运行。这样就保证了进程的执行顺序。

 

总的来说信号量机制是用来实现进程互斥和进程同步功能的,在实现进程互斥时需要先明确那些资源需要互斥访问,这里的资源不仅仅指的是硬件资源只要你想要某个东西在同一时刻只能被一个进程所访问就可以采用信号量机制。进程同步问题是为了确定进程之间的运行顺序,比如进程通信里的管道通信就需要写进程运行在读进程前,凡是涉及进程执行顺序的问题都可以考虑采用信号量机制。

生产者-消费者问题,多生产者-多消费者问题,吸烟者问题,读者写者问题,哲学家进餐问题。这些问题都是采用信号量机制解决的,实现逻辑去看视频。

管程:用于实现进程同步的一种程序,是对P,V操作的封装。简化了实现进程同步的复杂度,因为在使用P,V操作实现进程同步时很容易由于设置不当造成进程死锁。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值