IT铁人
由於电脑同时会执行许多程序,不同程序可能会共用其中几个变数。
举例来说,一个停车场要标示里面还剩多少位置时,如果二楼有一台车走了,一楼也有一台车走了,理论上要多出两个空位,但如果同步的问题没有处理好,可能导致二楼跟一楼取走原本剩余的车位数量,减去一之後丢回去告诉中控,这时候中控就会只有收到减去一的结果,导致外面公告的数字跟停车场内的实际数字不一样。
不同的Process沟通的方式主要有两种,分别为Shared Memory及Message Passing,以下分别介绍。
Process之间向OS申请一个shared memory space,可以在这之间宣告一些shared variables,Process可藉由write, read这些shared variables,达到沟通的目的。
有点像是在冰箱上贴便利贴,规定这个冰箱给某两个process沟通,像是有些家庭会在冰箱上贴一些"晚餐在里面,自己微波"或是通知隔天的行程之类的。
这种做法OS不用特别支援,只要提供shared memory就好,所以主要责任在programming身上,比如说不同的process(家人)不可以同时抢memory(便条纸),发生的话称为Race condition,需要额外写避免发生的程序码。
适用於大量资讯沟通,而且这种沟通方式速度快(不用kernel介入),不适合分散式系统。
两个Process要沟通时要建立Communication link,并且此link要能互相传输,沟通完即释放。
就像是讲电话,拨通电话号码後交给电信业者处理,沟通完挂电话连接就断了。
这种方式就需要OS提供支援,如果两个Process同时请求沟通,OS要能处理。像是Line通话会在两人同时拨电话的时候接不到对方来电,OS就要想办法避免这种状况发生。
因为需要kernel介入,所以沟通速度慢并且适用於少量的Message,适合用在分散式系统。
这边简单介绍Race Condition以及解决方法,前面用停车场的例子简单介绍了一下,我们底下用程序的例子来解释:
假设有一个变数"x"初始值为5,会被两个process使用到,P1会执行x=x+1,P2会执行x=x-1,这时候根据不同的执行顺序会有4,5,6三种结果,以下分别举一个例子说明:
x=4 | x=5 | x=6 |
---|---|---|
P1,P2同时取得x的初始值x=5 | P1先取得x的数值且计算并存入x=6 | P1,P2同时取得x的初始值x=5 |
P1,P2对取得的值进行计算x1=6, x2=4 | P2取得x的数值且计算并存入x=5 | P1,P2对取得的值进行计算x1=6, x2=4 |
P2在P1之後存回x, x=5 => 6 => 4 | P1在P2之後存回x, x=5 => 6 => 4 |
由於我们不知道Process之间如何交错,所以要避免这种情况发生。
解决方法有两种主要做法,第一种是Disable Interrupt,第二种是Critical Section Design。
这个做法是在处理共享变数时Disable Interrupt,完成存取後才Enable Interrupt,如此一来在这期间CPU不会被Preempted交给其他Process。
这个做法非常简单暴力,就像是围起封锁线不准进入一样,在单核心的情况下适合使用这种作法。如果是多核心的情况,禁止某个CPU Preempted以後,可能会被其他的CPU Preempted,如果禁止所有CPU Preempted,则Performance会变得非常差。
并且如果让User任意Disable Interrupt,万一User迟迟没有Enable Interrupt,则CPU永远不会交给其他Process使用。
Critical Section的作用代表这块很重要,一次只能有一个Process待在Critical Section中,Critical Section Design的想法是由Programmer在Critical Section的前後写控制码,分为Entry Section以及Exit Section。
Critical Section Design必须满足三点,分别为Mutual Exclusion、Progress、Bounded Waiting,以下详细介绍这三个要素。
要素 | 内容 |
---|---|
Mutual Exclusion | 任何时间点最多只允许一个Process在自己的C.S.活动。 |
Progress | 不想进入C.S.的Process不可阻碍其他想进入C.S.的Process进入C.S.。多个Process想进入C.S.时必须在有限时间内决定谁可进入,不可让所有Process卡住。 |
Bounded Waiting | No Starvation。Process在提出进入C.S.的申请後,最多等n-1次(n个Process)即可进入C.S.。 |
至於实际的设计方式,经过多次的改良之後解释起来会有点小复杂,有兴趣的同学就去查查吧~
底下提供其中一个范例,还有其他更难理解的Algorithm。
这篇就到这边了!Race Condition是在多核心的时候会发生的问题,科技的进展同时会产生更多问题需要解决,那我们下篇见罗~
上一篇 | 下一篇 |
---|---|
Deadlock | Memory Management |
>>: 【Day 23】为美好的 Windows 献上 ETW - Event Tracing for Windows
考量到要建立各种 class 所以统一建立一个 class 给所有人继承 可以直接跳过,但注意之後有...
改善软件操作介面 金融业提供给外部用户的 App 通常具备易用、防呆、多次确认的程序,但内部的商用软...
HTML元素的组成 以下图为例 通常都有一个起始标签<>和一个结束标签< / &g...
物件导向的设计中,关於建构物件的方式我们成为建构器(constructor),这关系到物件使用的方式...
一、简易说明 Mongo DB 对於单个 Document 的大小限制为 16MB, 若想储存大於这...