計算機操做系統之進程管理

進程和線程的聯繫和區別 算法

定義:服務器

進程:具備必定獨立功能的程序關於某個數據集合上的一次運行活動,是系統進行資源分配和調度的一個獨立單位。網絡

線程:進程的一個實體,是CPU調度和分派的基本單位,他是比進程更小的能獨立運行的基本單位,線程本身基本上不擁有系統資源,只擁有一點在運行中必不可少的資源(如程序計數器,一組寄存器和棧),一個線程能夠建立和撤銷另外一個線程;多線程

(線程共享:堆,全局變量,靜態變量,文件公用資源)併發

進程和線程的關係:socket

(1)一個線程只能屬於一個進程,而一個進程能夠有多個線程,但至少有一個線程。函數

(2)資源分配給進程,同一進程的全部線程共享該進程的全部資源。線程

(3)線程在執行過程當中,須要協做同步。不一樣進程的線程間要利用消息通訊的辦法實現同步。設計

(4)處理機分給線程,即真正在處理機上運行的是線程。隊列

(5)線程是指進程內的一個執行單元,也是進程內的可調度實體。

線程與進程的區別:

(1)調度:線程做爲調度和分配的基本單位,進程做爲擁有資源的基本單位。

(2)併發性:不只進程之間能夠併發執行,同一個進程的多個線程之間也能夠併發執行。

(3)擁有資源:進程是擁有資源的一個獨立單位,線程不擁有系統資源,但能夠訪問隸屬於進程的資源。

(4)系統開銷:在建立或撤銷進程的時候,因爲系統都要爲之分配和回收資源,致使系統的明顯大於建立或撤銷線程時的開銷。但進程有獨立的地址空間,進程崩潰後,在保護模式下不會對其餘的進程產生影響,而線程只是一個進程中的不一樣的執行路徑。線程有本身的堆棧和局部變量,但線程之間沒有單獨的地址空間,一個線程死掉就等於整個進程死掉,因此多進程的程序要比多線程的程序健壯,可是在進程切換時,耗費的資源較大,效率要差些。

死鎖產生的緣由及四個必要條件

產生死鎖的緣由主要是:

(1) 由於系統資源不足。

(2) 進程運行推動的順序不合適。

(3) 資源分配不當等。

若是系統資源充足,進程的資源請求都可以獲得知足,死鎖出現的可能性就很低,不然就會因爭奪有限的資源而陷入死鎖。其次,進程運行推動順序與速度不一樣,也可能產生死鎖。

產生死鎖的四個必要條件:

(1) 互斥條件:一個資源每次只能被一個進程使用。

(2) 請求與保持條件:一個進程因請求資源而阻塞時,對已得到的資源保持不放。

(3) 不剝奪條件:進程已得到的資源,在末使用完以前,不能強行剝奪。

(4) 循環等待條件:若干進程之間造成一種頭尾相接的循環等待資源關係。

這四個條件是死鎖的必要條件,只要系統發生死鎖,這些條件必然成立,而只要上述條件之一不知足,就不會發生死鎖。

死鎖的解除與預防:

理解了死鎖的緣由,尤爲是產生死鎖的四個必要條件,就能夠最大可能地避免、預防和解除死鎖。因此,在系統設計、進程調度等方面注意如何不讓這四個必要條件成立,如何肯定資源的合理分配算法,避免進程永久佔據系統資源。此外,也要防止進程在處於等待狀態的狀況下佔用資源。所以,對資源的分配要給予合理的規劃。

進程間通訊

一、管道(Pipe)

一個進程往管道里寫數據,另外一個進程從管道里取數據。管道又能夠分爲匿名管道,匿名管道只能在父、子進程之間通信。還有一種命名管道(named pipes),Linux下叫作FIFO,命名管道能夠在任意進程之間通信。

二、油槽(Slot)

Linux下叫作消息隊列(Message)。就像咱們平常經過郵局寄送信件。一個進程寄送,另外一個進程接收。

三、消息(Message)

Linux下叫作信號(Signal)。Windows是消息驅動的,進程能夠調用WIN32 API函數SendMessage或者PostMessage向另外一個進程發送消息,Windows系統也能夠向進程發送消息。

Linux下能夠經過kill、raise、alarm、pause這些信號處理系統調用來實現。

四、共享內存(Shared Memory)

進程之間經過共享一塊內存的方式來交換數據。

五、Socket

一般咱們使用socket來進行網絡通信,一方做爲客戶機,另外一方做爲服務器。一樣的,socket也能夠做爲進程之間通信的一種方式。

相關文章
相關標籤/搜索