1、概念程序員
一、進程算法
進程(Process)是計算機中的程序關於某數據集合上的一次運行活動,是系統進行資源分配和調度的基本單位,是操做系統結構的基礎。在早期面向進程設計的計算機結構中,進程是程序的基本執行實體;在當代面向線程設計的計算機結構中,進程是線程的容器。程序是指令、數據及其組織形式的描述,進程是程序的實體。編程
進程是一個具備獨立功能的程序關於某個數據集合的一次運行活動。它能夠申請和擁有系統資源,是一個動態的概念,是一個活動的實體。它不僅是程序的代碼,還包括當前的活動,經過程序計數器的值和處理寄存器的內容來表示。網絡
進程的概念主要有兩點:第一,進程是一個實體。每個進程都有它本身的地址空間,通常狀況下,包括文本區域(text region)、數據區域(data region)和堆棧(stack region)。文本區域存儲處理器執行的代碼;數據區域存儲變量和進程執行期間使用的動態分配的內存;堆棧區域存儲着活動過程調用的指令和本地變量。第二,進程是一個「執行中的程序」。程序是一個沒有生命的實體,只有處理器賦予程序生命時(操做系統執行之),它才能成爲一個活動的實體,咱們稱其爲進程。多線程
二、線程併發
所謂守護 線程,是指在程序運行的時候在後臺提供一種通用服務的線程,好比垃圾回收線程就是一個很稱職的守護者,而且這種線程並不屬於程序中不可或缺的部分。所以, 當全部的非守護線程結束時,程序也就終止了,同時會殺死進程中的全部守護線程。反過來講,只要任何非守護線程還在運行,程序就不會終止。模塊化
用戶線程和守護線程二者幾乎沒有區別,惟一的不一樣之處就在於虛擬機的離開:若是用戶線程已經所有退出運行了,只剩下守護線程存在了,虛擬機也就退出了。 由於沒有了被守護者,守護線程也就沒有工做可作了,也就沒有繼續運行程序的必要了。工具
進程是資源分配的最小單位,線程是CPU調度的最小單位。線程和進程的區別在於,子進程和父進程有不一樣的代碼和數據空間,而多個線程則共享數據空 間,每一個線程有本身的執行堆棧和程序計數器爲其執行上下文.多線程主要是爲了節約CPU時間,發揮利用,根據具體狀況而定. 線程的運行中須要使用計算機的內存資源和CPU。spa
多進程: 進程是程序在計算機上的一次執行活動。當你運行一個程序,你就啓動了一個進程。顯然,程序是死的(靜態的),進程是活的(動態的)。進程能夠分爲系統進程 和用戶進程。凡是用於完成操做系統的各類功能的進程就是系統進程,它們就是處於運行狀態下的操做系統自己;全部由用戶啓動的進程都是用戶進程。進程是操做 系統進行資源分配的單位。 進程又被細化爲線程,也就是一個進程下有多個能獨立運行的更小的單位。在同一個時間裏,同一個計算機系統中若是容許兩個或兩個以上的進程處於運行狀態,這 即是多任務。現代的操做系統幾乎都是多任務操做系統,可以同時管理多個進程的運行。 多任務帶來的好處是明顯的,好比你能夠邊聽mp3邊上網,與此同時甚至能夠將下載的文檔打印出來,而這些任務之間絲絕不會相互干擾。那麼這裏就涉及到並行 的問題,俗話說,一心不能二用,這對計算機也同樣,原則上一個CPU只能分配給一個進程,以便運行這個進程。咱們一般使用的計算機中只有一個CPU,也就 是說只有一顆心,要讓它一心多用,同時運行多個進程,就必須使用併發技術。實現併發技術至關複雜,最容易理解的是「時間片輪轉進程調度算法」,它的思想簡 單介紹以下:在操做系統的管理下,全部正在運行的進程輪流使用CPU,每一個進程容許佔用CPU的時間很是短(好比10毫秒),這樣用戶根本感受不出來 CPU是在輪流爲多個進程服務,就好象全部的進程都在不間斷地運行同樣。但實際上在任何一個時間內有且僅有一個進程佔有CPU。 若是一臺計算機有多個CPU,狀況就不一樣了,若是進程數小於CPU數,則不一樣的進程能夠分配給不一樣的CPU來運行,這樣,多個進程就是真正同時運行的,這 即是並行。但若是進程數大於CPU數,則仍然須要使用併發技術。 進行CPU分配是以線程爲單位的,一個進程可能由多個線程組成,這時狀況更加複雜,但簡單地說,有以下關係:操作系統
總線程數<= CPU數量:並行運行
總線程數> CPU數量:併發運行
並行運行的效率顯然高於併發運行,因此在多CPU的計算機中,多任務的效率比較高。可是,若是在多CPU計算機中只運行一個進程(線程),就不 能發揮多CPU的優點。 這裏涉及到多任務操做系統的問題,多任務操做系統(如Windows)的基本原理是:操做系統將CPU的時間片分配給多個線程,每一個線程在操做系統指定的 時間片內完成(注意,這裏的多個線程是分屬於不一樣進程的).操做系統不斷的從一個線程的執行切換到另外一個線程的執行,如此往復,宏觀上看來,就好像是多個 線程在一塊兒執行.因爲這多個線程分屬於不一樣的進程,所以在咱們看來,就好像是多個進程在同時執行,這樣就實現了多任務
多線程:在計算機編程中,一個基本的概念就是同時對多個任務加以控制。許多程序設計問題都要求程序可以停下手頭的工做,改成處理其餘一些問題, 再返回主進程。能夠經過多種途徑達到這個目的。最開始的時候,那些掌握機器低級語言的程序員編寫一些「中斷服務例程」,主進程的暫停是經過硬件級的中斷實 現的。儘管這是一種有用的方法,但編出的程序很難移植,由此形成了另外一類的代價高昂問題。中斷對那些實時性很強的任務來講是頗有必要的。但對於其餘許多問 題,只要求將問題劃分進入獨立運行的程序片段中,使整個程序能更迅速地響應用戶的請求。
最開始,線程只是用於分配單個處理器的處理時間的一種工具。但假如操做系統自己支持多個處理器,那麼每一個線程均可分配給一個不一樣的處理器,真正 進入「並行運算」狀態。從程序設計語言的角度看,多線程操做最有價值的特性之一就是程序員沒必要關心到底使用了多少個處理器。程序在邏輯意義上被分割爲數個 線程;假如機器自己安裝了多個處理器,那麼程序會運行得更快,毋需做出任何特殊的調校。根據前面的論述,你們可能感受線程處理很是簡單。但必須注意一個問 題:共享資源!若是有多個線程同時運行,並且它們試圖訪問相同的資源,就會遇到一個問題。舉個例子來講,兩個線程不能將信息同時發送給一臺打印機。爲解決 這個問題,對那些可共享的資源來講(好比打印機),它們在使用期間必須進入鎖定狀態。因此一個線程可將資源鎖定,在完成了它的任務後,再解開(釋放)這個 鎖,使其餘線程能夠接着使用一樣的資源。
多線程是爲了同步完成多項任務,不是爲了提升運行效率,而是爲了提升資源使用效率來提升系統的效率。線程是在同一時間須要完成多項任務的時候實現的。
一個採用了多線程技術的應用程序能夠更好地利用系統資源。其主要優點在於充分利用了CPU的空閒時間片,能夠用盡量少的時間來對用戶的要求作 出響應,使得進程的總體運行效率獲得較大提升,同時加強了應用程序的靈活性。更爲重要的是,因爲同一進程的全部線程是共享同一內存,因此不須要特殊的數據 傳送機制,不須要創建共享存儲區或共享文件,從而使得不一樣任務之間的協調操做與運行、數據的交互、資源的分配等問題更加易於解決。
進程間通訊(IPC,Inter-Process Communication),指至少兩個進程或線程間傳送數據或信號的一些技術或方法。進程是計算機系統分配資源的最小單位。每一個進程都有本身的一部分 獨立的系統資源,彼此是隔離的。爲了能使不一樣的進程互相訪問資源並進行協調工做,纔有了進程間通訊。這些進程能夠運行在同一計算機上或網絡鏈接的不一樣計算 機上。
進程間通訊技術包括消息傳遞、同步、共享內存和遠程過程調用。IPC是一種標準的Unix通訊機制。
使用IPC 的理由:
信息共享
加速;
模塊化;
方便; 以及
私有權分離.
主要的 IPC 方法
方法 提供方(操做系統或其餘環境)
文件 多數操做系統
信號 多數操做系統
Socket 多數操做系統
消息隊列(en:Message queue) 多數操做系統
管道(en:Pipe) 全部的 POSIX systems, Windows.
具名管道(en:Named Pipe) 全部的 POSIX 系統, Windows.
信號量(en:Semaphore) 全部的 POSIX 系統, Windows.
共享內存 全部的 POSIX 系統, Windows.
Message passing(en:Message passing) 用於 MPI規範,Java RMI, CORBA, MSMQ, MailSlot 以及其餘.