開篇語
不一樣的名字,相似的內(nèi)容颅湘。這是第四篇關(guān)于操作系統(tǒng)的文章了。前面三篇反響平平栗精,不算內(nèi)容的專業(yè)性過強闯参,大部分簡書讀者看不懂;maybe也有我的名字取得太嚇人有點關(guān)系悲立,所以現(xiàn)在改頭換面鹿寨,換湯不換藥的繼續(xù)來發(fā)表文章,記筆記的同時也希望也希望可以收獲一點關(guān)注薪夕。
前面還有三篇類似的:
計算機四級網(wǎng)絡工程師--《操作系統(tǒng)(Operating System)》重點內(nèi)容學習
計算機四級網(wǎng)絡工程師--《操作系統(tǒng)(Operating System)》重點內(nèi)容學習2
計算機四級網(wǎng)絡工程師--《操作系統(tǒng)(Operating System)》重點內(nèi)容學習3
正文----并發(fā)與同步
一、進程之間的相互作用:
1原献、進程之間有:相關(guān)進程馏慨,無關(guān)進程
2埂淮、進程之間的關(guān)系有:
- 進程互斥:一個資源只能被有限的進程訪問,那么當多個進程訪問這個資源的時候写隶,會存在進程互斥
- 進程同步:進程之間存在遞進關(guān)系倔撞,B進程的能否執(zhí)行,取決于A進程的是否執(zhí)行完成慕趴。所以A 痪蝇、B 進程之間是進程的同步現(xiàn)象。
二冕房、進程互斥:
1霹俺、進程互斥的解決辦法:由競爭的雙方平等協(xié)商、引入進程管理者
2毒费、引入基礎概念 ** 臨界資源:一段時間內(nèi)只允許一個進程進行訪問使用的資源丙唧,比如打印機,比如掃描儀等**
三觅玻、進程同步:
1想际、遵從四個基本原則:
- 空閑讓進
- 忙則等待
- 有限等待
- 讓權(quán)等待:若進程不進入臨界區(qū),那么就要釋放處理器溪厘,以免陷入“忙等”狀態(tài)胡本,浪費資源。
四畸悬、進程互斥的軟件方法
1侧甫、單標志算法(進入臨界區(qū)的話也就意味著開始占用資源了)
while(turn!=i);
進入臨界區(qū),
turn=j;
進入剩余區(qū);
2蹋宦、雙標志披粟、先檢查算法
while(flag[j]);
flag[i]=true;
進入臨界區(qū),
flag[i]=false;
剩余區(qū)
PS:如果這個算法考慮分式操作系統(tǒng)的事件分片冷冗,絕對GG守屉,如果把上面的算法里面的i j對調(diào),然后你把我賦值為真蒿辙,我把你賦值為真拇泛,兩個進程對一個資源開始哄搶,那就好思灌,直接互斥
3俺叭、雙標志、后檢查算法
flag[i]=true;
while(flag[j]);
臨界區(qū);
flag[i]=false;
剩余區(qū)
PS:講道理泰偿,這個我沒看出太多的內(nèi)涵熄守,不過貌似把上面說到的那個時間分片問題給干掉了。但是還是會有問題,這個點未曾深入柠横,不做多說。
4课兄、先修改牍氛,后檢查,后修改者等待算法
flag[i]=true;
turn=j; %Tenor Waiting
while(flag[j]&&turn==j);
臨界區(qū)烟阐,flag[i]=false;剩余區(qū)
PS:我已經(jīng)無話可PS
五搬俊、進程互斥的硬件方法
1、TS硬件指令:每個臨界區(qū)都設置公共的變量lock:true 表示被占用蜒茄,每次進入臨界區(qū)之前查詢即可互斥
2唉擂、SWAP指令:每個臨界區(qū)都設置公共的變量lock,初始值為false檀葛,給每個進程設置一個私有變量key玩祟,需要進入臨界區(qū)則與lock交換key 值,可以更好地標識內(nèi)容屿聋。
3空扎、信號量(創(chuàng)始者:Dijkstra)
信號量代表一個資源量的可用量;
0:系統(tǒng)中可用資源的數(shù)目
=0:對應資源用盡润讥,并且目前該資源的對應阻塞隊列沒有等待者
<0:因為該資源不可用而導致的阻塞進程的數(shù)目
這就涉及到操作系統(tǒng)這個內(nèi)容中的一個很大的转锈,很重要的內(nèi)容--PV操作,由原語直接對信號量進行操作楚殿,對進程進行的操作撮慨。
六、經(jīng)典的進程互斥與同步問題
1脆粥、生產(chǎn)者--消費者問題
Just like 我們買iPhone手機一樣的砌溺。你得Apple公司做出來產(chǎn)品,然后放到店子里面变隔,你才能買吧抚吠,然后你買完了的話,店鋪那邊就得告訴Apple弟胀,產(chǎn)能不夠啊楷力,你們要加班繼續(xù)造啦。
這個問題孵户,稍微一分析就知道萧朝,是一個進程同步問題,所以要講一個很重要的原則夏哭,那就是:
進程同步检柬,信號量是按照有爭議的進程數(shù)來決定的,本題就是一個信號量:商店的貨夠不夠用?
進程互斥的話何址,信號量就等于是資源數(shù)了里逆。
因為你想撒,同步問題用爪,是協(xié)作關(guān)系原押,是接力跑。你的人沒到偎血,我就不能動诸衔,至于那個代表你到了的是什么,那就無關(guān)緊要了對不颇玷?管你是棒子還是拍手笨农。
相反的,互斥問題就是競爭關(guān)系了帖渠。獎杯只有一個啊谒亦,你拿了我怎么拿?重要的是結(jié)果空郊,反而過程會被淡化了诊霹。
所以就有了如下的PV操作代碼(PV的定義:P是代表,這個資源渣淳,我用了一個脾还;V是代表,這個資源入愧,哥用完了鄙漏,你們誰要誰拿去,不關(guān)我事):
For Apple:
while(true)
{
P(Apple_Company_Product)
Producting
V(Consumer_iPhone)
}
For us:
while(true)
{
P(Consumer_iPhone)
Buying
V(Apple_Company_Product)
}
上面的代碼的意思是:
蘋果公司部分棺蛛,蘋果公司先在日程上把制作手機的任務標記為完成了怔蚌,然后開工生產(chǎn),做完了就開發(fā)布會旁赊,告訴消費者可以賣腎準備買果了桦踊。
而消費者,先把錢準備好终畅,賣掉了一個腎籍胯。然后就買了新機,就可以發(fā)消息給Apple 要他們加班了离福。
2杖狼、經(jīng)典的哲學家吃飯問題
int fork1=fork2=1;
int knie1=knife2=1;
Pa()
{
while(true)
{ P(knife1);
P(fork1);
Have lunch;
V(knife1);
V(fork1);
}
}
Pb()
{
while(true)
{ P(knife2);
P(fork1);
Have lunch;
V(knife2);
V(fork1);
}
}
Pc()
{
while(true)
{ P(knife2);
P(fork2);
Have lunch;
V(knife2);
V(fork2);
}
}
Pd()
{
while(true)
{ P(knife1);
P(fork2);
Have lunch;
V(knife1);
V(fork2);
}
}
這個是哪個上課的老師經(jīng)過了三次的改進之后才拿出來的比較好的形式,形成競爭機制。也就是說绿聘,在第一步的時候嗽上,四個人分別開始搶,因為要同時刀叉在手才可以吃飯熄攘,也就是說同時只有兩個人能吃飯兽愤,所以一開始先確定哪兩個人能吃飯就好。那個老師初期的解決策略并未考慮這點鲜屏,四個餐具烹看,四個人国拇,四個人先人手一把洛史,這下好,不吃飯是沒法放下餐具的酱吝。所以就形成了死鎖了也殖。大家都要吃飯,但是你的行為阻礙了我务热,并且我還沒辦法搞死你來吃飯忆嗜,這就死了。故而引入先競爭崎岂,后吃飯機制是很大的一個進步捆毫,這樣就確保了,拿不到刀的人冲甘,絕對拿不到叉子绩卤,也就杜絕了死鎖這種進程運行的大敵!完美江醇!
一個互斥問題濒憋,一個同步問題,差不多了陶夜。年級學生會換屆大會也結(jié)束了凛驮。可以收拾收拾回宿舍了条辟。明天早上有課黔夭,心塞塞,一定要早睡早睡再早睡S鸬铡纠修!
結(jié)束語
推薦一首歌---Wercking ball 很好聽的哦。厂僧。只是歌詞很非就是了扣草。但是絲毫不妨礙我走夜路的時候聽著這歌就在路邊上扭起了曼妙的動作,好吧,撤軍辰妙,分團委的要照相了鹰祸。我撤也~~~~~另外,今晚開車很開心@XNC密浑,雖然有點恐怖
個人宣言
知識傳遞力量蛙婴,技術(shù)無國界,文化改變生活尔破!