1. 程式人生 > >線程和進程有什麽區別(簡單介紹)

線程和進程有什麽區別(簡單介紹)

復雜 解決 創建 兩種 多線程編程 none 用戶界面 queue cpu調度

簡單介紹

一、線程的基本概念

  線程是進程中執行運算的最小單位,是進程中的一個實體,是被系統獨立調度和分派的基本單位,線程自己不擁有系統資源,只擁有一點在運行中必不可少的資源,但它可與同屬一個進程的其它線程共享進程所擁有的全部資源。一個線程可以創建和撤消另一個線程,同一進程中的多個線程之間可以並發執行。

好處 :(1)易於調度。

(2)提高並發性。通過線程可方便有效地實現並發性。進程可創建多個線程來執行同一程序的不同部分。

(3)開銷少。創建線程比創建進程要快,所需開銷很少。。

(4)利於充分發揮多處理器的功能。通過創建多線程進程,每個線程在一個處理器上運行,從而實現應用程序的並發性,使每個處理器都得到充分運行

二、進程與線程

進程:每個進程都有獨立的代碼和數據空間(進程上下文),進程間的切換會有較大的開銷,一個進程包含1--n個線程。(進程是資源分配的最小單位)

線程:同一類線程共享代碼和數據空間,每個線程有獨立的運行棧和程序計數器(PC),線程切換開銷小。(線程是cpu調度的最小單位)

技術分享圖片

線程和進程一樣分為五個階段:創建、就緒、運行、阻塞、終止。

技術分享圖片

技術分享圖片

多進程是指操作系統能同時運行多個任務(程序)。

多線程是指在同一程序中有多個順序流在執行。

每個正在系統上運行的程序都是一個進程。每個進程包含一到多個線程。進程也可能是整個程序或者是部分程序的動態執行。線程是一組指令的集合,或者是程序的特殊段,它可以在程序裏獨立執行。也可以把它理解為代碼運行的上下文。所以線程基本上是輕量級的進程,它負責在單個程序裏執行多任務。通常由操作系統負責多個線程的調度和執行。

在Java中,一個應用程序可以包含多個線程。每個線程執行特定的任務,並可與其他線程並發執行多線程使系統的空轉時間最少,提高CPU利用率、多線程編程環境用方便的模型隱藏CPU在任務間切換的事實在Java程序啟動時,一個線程立刻運行,該線程通常稱為程序的主線程。

主線程的重要性體現在兩個方面:

1、它是產生其他子線程的線程。

2、通常它必須最後完成執行,因為它執行各種關閉動作。

三、進程與線程的區別:

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

(2)並發性:不僅進程之間可以並發執行,同一個進程的多個線程之間也可並發執行

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

(4)系統開銷:在創建或撤消進程時,由於系統都要為之分配和回收資源,導致系統的開銷明顯大於創建或撤消線程時的開銷。

四、同步和互斥的區別:

當有多個線程的時候,經常需要去同步這些線程以訪問同一個數據或資源。例如,假設有一個程序,其中一個線程用於把文件讀到內存,而另一個線程用於統計文件中的字符數。當然,在把整個文件調入內存之前,統計它的計數是沒有意義的。但是,由於每個操作都有自己的線程,操作系統會把兩個線程當作是互不相幹的任務分別執行,這樣就可能在沒有把整個文件裝入內存時統計字數。為解決此問題,你必須使兩個線程同步工作。

所謂同步,是指散步在不同進程之間的若幹程序片斷,它們的運行必須嚴格按照規定的某種先後次序來運行,這種先後次序依賴於要完成的特定的任務。如果用對資源的訪問來定義的話,同步是指在互斥的基礎上(大多數情況),通過其它機制實現訪問者對資源的有序訪問。在大多數情況下,同步已經實現了互斥,特別是所有寫入資源的情況必定是互斥的。少數情況是指可以允許多個訪問者同時訪問資源。

所謂互斥,是指散布在不同進程之間的若幹程序片斷,當某個進程運行其中一個程序片段時,其它進程就不能運行它們之中的任一程序片段,只能等到該進程運行完這個程序片段後才可以運行。如果用對資源的訪問來定義的話,互斥某一資源同時只允許一個訪問者對其進行訪問,具有唯一性和排它性。但互斥無法限制訪問者對資源的訪問順序,即訪問是無序的。

五、進程間通信的方式?

(1)管道(pipe)及有名管道(named pipe):管道可用於具有親緣關系的父子進程間的通信,有名管道除了具有管道所具有的功能外,它還允許無親緣關系進程間的通信。

(2)信號(signal):信號是在軟件層次上對中斷機制的一種模擬,它是比較復雜的通信方式,用於通知進程有某事件發生,一個進程收到一個信號與處理器收到一個中斷請求效果上可以說是一致的。

(3)消息隊列(message queue):消息隊列是消息的鏈接表,它克服了上兩種通信方式中信號量有限的缺點,具有寫權限得進程可以按照一定得規則向消息隊列中添加新信息;對消息隊列有讀權限得進程則可以從消息隊列中讀取信息。

(4)共享內存(shared memory):可以說這是最有用的進程間通信方式。它使得多個進程可以訪問同一塊內存空間,不同進程可以及時看到對方進程中對共享內存中數據得更新。這種方式需要依靠某種同步操作,如互斥鎖和信號量等。

(5)信號量(semaphore):主要作為進程之間及同一種進程的不同線程之間得同步和互斥手段。

(6)套接字(socket):這是一種更為一般得進程間通信機制,它可用於網絡中不同機器之間的進程間通信,應用非常廣泛。

六、進程和線程的關系:

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

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

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

(4)線程在執行過程中,需要協作同步。不同進程的線程間要利用消息通信的辦法實現同步。線程是指進程內的一個執行單元,也是進程內的可調度實體.

七、多線程的優點

    • 使用線程可以把占據時間長的程序中的任務放到後臺去處理
    • 用戶界面可以更加吸引人,這樣比如用戶點擊了一個按鈕去觸發某些事件的處理,可以彈出一個進度條來顯示處理的進度
    • 程序的運行速度可能加快
    • 在一些等待的任務實現上如用戶輸入、文件讀寫和網絡收發數據等,線程就比較有用了。在這種情況下可以釋放一些珍貴的資源如內存占用等等。
    • 多線程技術在IOS軟件開發中也有舉足輕重的位置。

八、多線程的缺點

    • 如果有大量的線程,會影響性能,因為操作系統需要在它們之間切換。
    • 更多的線程需要更多的內存空間。
    • 線程可能會給程序帶來更多“bug”,因此要小心使用。
    • 線程的中止需要考慮其對程序運行的影響。
    • 通常塊模型數據是在多個線程間共享的,需要防止線程死鎖情況的發生。

總結:

線程和進程的區別在於,子進程和父進程有不同的代碼和數據空間,而多個線程則共享數據空間,每個線程有自己的執行堆棧和程序計數器為其執行上下文.多線程主要是為了節約CPU時間,發揮利用,根據具體情況而定. 線程的運行中需要使用計算機的內存資源和CPU。

線程和進程有什麽區別(簡單介紹)