作業系統之程序三部曲

2021-07-24 22:17:53 字數 1039 閱讀 4129

世間萬物都有產生、發展以及消亡的過程。程序亦不例外。每個程序都有建立、執行與消亡的過程。這也就是程序的三部曲。也是今天要講解的。

在linux系統中,第乙個程序是系統固有的(核心設計者設計好的)。系統在引導並完成了基本的初始化以後,就有了系統的第乙個程序(核心執行緒)。除此之外,所有其他程序和核心程序都是在這個原始程序或其他子孫程序所建立的。所以,在linux系統中,準確地來說:乙個新的程序一定是由乙個已經存在的程序」複製「出來的,而不是」創造「出來的。

linux中將程序的建立與目標程式的執行分成兩步。

第一步:

從已經存在的」父程序「中複製出乙個子程序,但是該子程序有自己的task_struct和系統空間堆疊,但與父程序共享其他所有的資源。例如:如果父程序開啟裡五個檔案,那麼子程序也有五個開啟的檔案,而且這些檔案的當前讀寫指標也停在相同的地方。

為此,linux提供了兩種呼叫方式,乙個是fork(),另乙個是clone()。兩者的區別主要是fork()是全部複製,而clone()是帶引數的,可以是選擇性地複製。後來,為提高效率,又增設了vfork()。vfork()也是不帶引數的,但是除了task_struct結構和系統空間堆疊之外的資源全部通過資料結構和指標的複製」遺傳「。所以,vfork()出來的是執行緒而不是程序。

其實,這三個系統呼叫都是通過do_work()來完成的,所不同的只是對do_work()的呼叫引數所起的作用不同。即每次呼叫時,系統都會產生相應的訊號,而這個訊號將決定do_work()中哪個引數起作用。

第二步:

目標程式的執行。一般來說,建立乙個新的程序是因為執行新的任務。為此,系統提供了execve()呼叫,讓乙個程序執行得以執行。

好處:

複製代價比較低,而且通過複製而傳承下來的資源往往對子程序很有用;更重要的是有利於父、子程序間通過pipe來建立一種簡單有效的程序間通訊,並且從而產生了作業系統的使用者介面即shell的」管道「機制。

建立子程序後,父程序有兩個選擇——同步和非同步。同步也即」受阻「狀態,父程序會進入休眠狀態,而非同步就是不受阻狀態,父程序繼續執行它原先的任務。

人生三部曲

人生三部曲 童年沙丁魚罐頭似的公共汽車在曬的發燙的柏油路上緩慢地爬著。我 瘦瘦小小的個子在擁擠的人群中喘不過氣來。還要多久呀?人們煩躁而沉悶的氣氛充斥著整個車廂。忽然,我看見一位打扮入時的西裝人士,正悄悄地把手伸入一位老人的口袋。我第一反應就是有小偷!於是大聲脫口而出,一車人都回頭驚悸地看著我,西裝...

報表三部曲之連線

我們了解和設計了報表之後,剩下的就要實現vb與報表的資料互連。首先要先新增相應的部件。ctrl t 部件 勾選grid report。1.在專案中加入對grid report 的引用 之後出現 2,在窗體中設計部件大小等等屬性。其次,是 1,例項化報表 dim withevents report a...

Jmock使用三部曲

import org.jmock.mockery import org.jmock.expectations class publishertest extends testcase execute publisher.publish message verify assert.assert.注意 ...