用 閃電俠 的例子解釋一下程序和執行緒

2022-10-11 08:33:10 字數 3236 閱讀 4212

艾倫在一次粒子加速器**大事故中獲得了極速移動的超能力,因此開始化身為超級英雄「閃電俠」。模擬之下,cpu是計算機最核心的部件,它負責指令的讀取和執行,每秒可以執行幾十億條指令!其實比閃電俠還要快得多。

小閃這種能力很快就被fbi發現了,為了好好利用小閃,fbi僱傭了小閃為其特別行動小組a執行任務。

說是特別行動小組,其實除了小閃之外只有乙個a博士,小閃日常的工作就是取得a博士的指令並且執行。這就是計算機早期的單程序模型。

但是a博士從蒐集情報到得出正確的指令畢竟需要時間,而小閃執行指令的速度又太快,所以在fbi高層眼裡,a博士總是忙忙碌碌,而小閃成天優哉遊哉。

為了提高小閃的利用率,fbi在特別行動小組辦公室的樓下,著手成立另乙個特別行動小組b。

這個著手成立的過程就是編碼,而編碼的結果就是得到乙個能夠完成某個特定功能的程式。

很快,特別行動小組b在b博士的獨自掌管下開始暗中執行。這就是程序的誕生,程序其實就是執行的程式。現在fbi特別行動小組進入了多程序時代。

雖然都是fbi的特別行動小組,若無特殊情況,a和b通常井水不犯河水,他們都認為自己壟斷了fbi的所有資源,但這其實只是fbi的小把戲而已。

背後的含義就是每個程序採用了完全相同的虛擬位址空間,然而經由作業系統和硬體mmu協作,對映到不同的實體地址空間。

不同的程序,都有各自獨立的物理記憶體空間,特別行動小組a和b之間的通訊就是程序間通訊(ipc)。

小閃雖然速度快,但是依然沒辦法在同一時刻同時執行a博士和b博士兩個人的指令,就好像人不能在向右看的同時向左看。

a博士和b博士常常為此大打出手,誰都想占用小閃更多的時間,好完成自己的kpi。

fbi領導層想了乙個辦法,新成立了乙個排程小組,用來給各個小組分配小閃的使用時間。一開始,排程小組會給每個程序分配相等的一小段時間,然後每個小組輪番地占用小閃執行相應時間的任務。這就是cpu的時間片分配。

如果小閃在這一小段時間內還沒執行完,那也必須得停,但是得儲存一下執行進度,下次繼續從結束的地方開始做。這就是cpu的上下文切換。

這樣一來,a博士和b博士的kpi完成了,小閃也忙起來了。說是忙起來,但是花在指令執行上的時間其實也沒多多少,基本就是在兩個小組之間反覆橫跳了,小閃的工作依然愜意。

兩個博士眼紅於小閃依然有大把的空閒時間,居然頗有默契地發起了招聘公告,廣攬天下英才,勢必要多找點事情給小閃做。

很快,行動小組內的成員越來越多,並且每個成員的任務都不一樣,比如有些人負責查閱資料,有些人負責收取訊息......小組內各個成員分工協作,完成特別小組的共同目標。自此進入多執行緒時代。

執行緒就好比是小組內的成員,乙個程序可以包含很多個執行緒。

程序是資源分配的基本單位,比如fbi給特別小組分配辦公場所。

執行緒是cpu排程的基本單位,比如小閃需要執行每個小組成員的指令。

成員多了,管理就成了乙個新的問題。如果每個成員只是自說自話,完全不講究團隊協作,極容易造成團隊內部衝突。

為此,fbi制定了幾個策略。對應的是執行緒的同步。

行動小組內的資源不同,共享的程度也不一樣。比如廁所,當有人正在使用的時候,其他人只能等待,如果貿然闖進去必然出現衝突。這表示程序中的某些共享記憶體同一時間只能由乙個執行緒使用,其他執行緒必須等待該執行緒結束使用之後才能繼續使用。

乙個防止其他人進入的簡單方法就是給廁所新增一把鎖,首先占用廁所的人上鎖,其他人看到有鎖之後就在門口排隊,直到占用的執行緒釋放鎖才能進入。這個策略叫做「互斥鎖」,英文叫做mutex

不同於廁所,會議室就能同時允許10個人進入,如果人數超過10個,多出來的人只能排隊等著,除非有人空出位置,其他人才能進入會議室。

為了解決這個問題,fbi在會議室的門口掛了10把鑰匙,每個人進入會議室前都要取一把鑰匙,出來時把鑰匙放回原位。如果後來者發現沒有鑰匙了,就在會議室門口等待。這種策略叫做「訊號量」,互斥鎖只允許乙個執行緒進入臨界區,訊號量允許多個執行緒同時進入臨界區。

有些時候,行動小組的某些任務比較複雜,需要流水線式作業。上游的人員做完之後把結果交付給下游人員處理,這就是典型的生產者消費者模式。

如果生產者生產得太快,我們可以適當讓上游的人員停止作業,等待某個時機喚醒生產者;反之,如果消費者消費得太快,我們可以適當讓下游的人員停止作業,等到某個時機喚醒消費者。

這種策略叫做「條件變數」,背後的原理是當執行緒在等待某些條件時使執行緒進入睡眠狀態,一旦條件滿足,就喚醒。

最後拿行動小組的放映機舉個例子。很多成員喜歡在休息時間坐在一起使用放映機看個電影,消遣一下時間,類似於多執行緒對同一資源進行讀操作,這種情況下不管多少人在看電影都不會出現問題。

但是偏偏有人在其他人看電影的時候要公升級一下放映機的作業系統,這肯定會影響其他人的觀影體驗;反之,在公升級作業系統的時候,有人要看電影,這同樣會對公升級人員造成困擾。

這種時候我們可以定乙個策略,當觀影時,隨時歡迎其他觀影人員使用**;當公升級時,禁止任何觀影人員和任何其他公升級人員使用。

這種方式稱為「讀寫鎖」,也叫做「共享-獨佔鎖」,「觀影」對應的就是執行緒的讀操作,「公升級」對應的就是執行緒的寫操作。具體來說一般有兩種情況:

讀寫鎖處於寫鎖定的狀態,則在解鎖之前,所有試圖加鎖的執行緒都會阻塞;

讀寫鎖處於讀鎖定的狀態,則所有試圖以讀模式加鎖的執行緒都可得到訪問權,但是以寫模式加鎖的執行緒則會阻塞;

完!

通俗的解釋一下正規化

正規化是什麼呢?比如拷貝來一段瞅瞅 正規化是符合某一種級別的關係模式的集合。關聯式資料庫中的關係必須滿足一定的要求,滿足不同程度要求的為不同正規化。我知道不用說,你肯定一臉懵逼!因為我也是!下面我就通俗的來解釋一下三大正規化吧,不喜勿噴,個人理解 第一正規化 其實就是讓列保持原子性,原子性就是不能再...

解釋一下尾遞迴的含義

usr bin python3 def fact n return fact iter n,1 def fact iter num,product if num 1 return product return fact iter num 1,num product print fact 4 定義函式...

解釋一下檔案 etc fstab的內容

etc fstab 內容解釋 偷個懶,把別人的話拷貝過來,做個標記,然後下班走人.dev hda1 mnt c ntfs ro,users,gid users,umask 0002,nls utf8 0 0 dev hda9 mnt d ntfs 3g silent,umask 0,locale z...