1:程序和進程的差別
進程的出現最初是在UNIX下,用於表示多用戶,多任務的操作系統環境下,應用程序在內存環境中基本執行單元的概念。進程是UNIX操作系統環境最基本的概念、是系統資源分配的最小單位。UNIX操作系統下的用戶管理和資源分配等工作幾乎都是操作系統通過對應用程序進程的控制實現的!
當使用c c++ java等語言編寫的源程序經相應的編譯器編譯成可執行文件後,提交給計算機處理器運行,運行的狀態稱之為進程。進程在用戶看來是應用程序的執行過程,從操作系統來看,進程是操作系統分配的內存,cpu時間片等資源的基本單位,是為正在運行的程序提供的運行環境。進程與應用程序的區別是應用程序作為靜態文件存儲在計算機的硬盤等存儲空間中,而進程則是處於動態條件下有操作系統維護的系統資源管理實體。
進程概念和程序概念最大的不同的之處在於:
1:進程是動態的,而程序是靜態的
2:進程有一定的生命期,而程序是指令的集合,本身無“運動”的含義。沒有建立進進程的程序不能作為一個獨立得到操作系統的認可。
3:一個進程只能對應一個程序,但一個程序可以對應多個進程。
2:Linux環境下的進程
linux的進程操作方式主要有產生進程、終止進程,並且進程之間存在數據和控制交互,即進程間通信和同步。
進程產生過程:
進程的產生方式有很多種方式,但是其基本過程是一致的。
(1)首先復制其父進程的環境配置。
(2)在內核中建立進程結構。
(3)將結構插入到進程列表,便於維護。
(4)分配資源給此進程。
(5)復制父進程的內存映射信息。
(6)管理文件描述符和鏈接點。
(7)通知父進程。
進程的終止方式:
有5種方式使進程終止:
1:從main函數返回。
2:調用exit函數。
3:調用_exit函數。
4:調用abort。
5:由一個信號終止。
進程在終止的時候,系統會釋放進程所有的資源,例如內存、文件符,內核結構等。
注:exit和_exit的區別在於exit函數在系統調用exit之前要檢查文件的打開情況,把文件緩沖區的內容寫回文件。
進程間的通信:
進程之間的通信有多種方式,其中管道、共享內存和消息隊列是最常用的方式。
1:管道是UNIX族中進程通信的最古老的方式,它利用內核在兩個進程之間建立通道,它的特點是與文件的操作類似,僅僅在管道的一端只讀,另一端只寫。利用讀寫的方式在進程之間傳遞數據。
2:共享內存是將內存的一段地址,在多個進程之間共享。多個進程利用獲得的共享內存的地址來直接對內存進行操作。
3:消息則是在內核中建立一個鏈表,發送方按照一定的標識將數據發送到內核中,內核將其放入量表後,等待接收方的請求。接收方發送請求後,內核按照消息的標識,從內核中將消息從鏈表中摘下,傳遞給收方。消息是一種完全的異步操作。
進程間的同步:
多個進程之間需要寫作完成任務是,經常發生業務之間的依賴現象,從而出現了進程的同步問題。linux下的進程同步方式主要有消息和信號量等。
信號量是一個共享的表示數量的值,用於多個進程之間操作或者共享資源的保護,它是進程同步的最主要的方式。
3:進程和線程
線程和進程是另一對有意義的概念,主要有以下區別和聯系:
1:進車是操作系進行資源分配的基本單位,進程擁有完整的虛擬空間。進行系統資源分配的時候,除了CPU資源外,不會給線程分配獨立的資源,線程所需要的資源需要共享。
2:線程是進程的一部分,如果沒有進行顯示的線程分配,可以認為進程是單線程的;如果進程中建立了線程,則可認為系統是多線程的。
3:多線程和多進程是不同的,雖然二者都是並行完成功能,但是多個線程之間像內存,變量等資源在多個線程之間可以通過簡單的辦法共享,多進程則不同,進程間的共享方法是有限的。
4:進程有進程控制表PCB(這個可不是指PCB板子喲),系統通過通過PCB對進程進行調度;線程有線程控制表TCB。但是TCB所表示的狀態比PCB要少得多。
總之有以上關系可以看出線程是進程的一部分,進程是程序的一部分。
我曾經看過最直白的進程 線程與程序的比較,可以參考這個鏈接來加深理解 http://blog.jobbole.com/38696/#jtss-tsina