1. 程式人生 > >程序和執行緒的主要區別(總結)

程序和執行緒的主要區別(總結)

根本區別:程序是作業系統資源分配的基本單位,而執行緒是任務排程和執行的基本單位

在開銷方面:每個程序都有獨立的程式碼和資料空間(程式上下文),程式之間的切換會有較大的開銷;執行緒可以看做輕量級的程序,同一類執行緒共享程式碼和資料空間,每個執行緒都有自己獨立的執行棧和程式計數器(PC),執行緒之間切換的開銷小。

所處環境:在作業系統中能同時執行多個程序(程式);而在同一個程序(程式)中有多個執行緒同時執行(通過CPU排程,在每個時間片中只有一個執行緒執行)

記憶體分配方面:系統在執行的時候會為每個程序分配不同的記憶體空間;而對執行緒而言,除了CPU外,系統不會為執行緒分配記憶體(執行緒所使用的資源來自其所屬程序的資源),執行緒組之間只能共享資源。

包含關係:沒有執行緒的程序可以看做是單執行緒的,如果一個程序內有多個執行緒,則執行過程不是一條線的,而是多條線(執行緒)共同完成的;執行緒是程序的一部分,所以執行緒也被稱為輕權程序或者輕量級程序。

=====================================================================

1. 一個程式至少有一個程序,一個程序至少有一個執行緒

2. 執行緒的劃分尺度小於程序,使得多執行緒程式的併發性高

3. 程序在執行過程中擁有獨立的記憶體單元,而多個執行緒共享記憶體,從而極大地提高了程式的執行效率

4. 每個獨立的執行緒有一個程式執行的入口、順序執行序列和程式的出口。但是執行緒不能夠獨立執行,必須依存在應用程式中,由應用程式提供多個執行緒執行控制

5. 多執行緒的意義在於一個應用程式中,有多個執行部分可以同時執行。但作業系統並沒有將多個執行緒看做多個獨立的應用,來實現程序的排程和管理以及資源分配

=========================================================================

多程序

程序是資源(CPU、記憶體等)分配的基本單位,它是程式執行時的一個例項。程式執行時系統就會建立一個程序,併為它分配資源,然後把該程序放入程序就緒佇列,程序排程器選中它的時候就會為它分配CPU時間,程式開始真正執行。

Linux系統函式fork()可以在父程序中建立一個子程序,這樣的話,在一個程序接到來自客戶端新的請求時就可以複製出一個子程序讓其來處理,父程序只需負責監控請求的到來,然後建立子程序讓其去處理,這樣就能做到併發處理。

# -*- coding:utf-8 -*-
import os

print('當前程序:%s 啟動中 ....' % os.getpid())
pid = os.fork()
if pid == 0:
    print('子程序:%s,父程序是:%s' % (os.getpid(), os.getppid()))
else:
    print('程序:%s 建立了子程序:%s' % (os.getpid(),pid ))

輸出結果:

當前程序:27223 啟動中 ....
程序:27223 建立了子程序:27224
子程序:27224,父程序是:27223

fork函式會返回兩次結果,因為作業系統會把當前程序的資料複製一遍,然後程式就分兩個程序繼續執行後面的程式碼,fork分別在父程序和子程序中返回,在子程序返回的值pid永遠是0,在父程序返回的是子程序的程序id。

多執行緒

執行緒是程式執行時的最小單位,它是程序的一個執行流,是CPU排程和分派的基本單位,一個程序可以由很多個執行緒組成,執行緒間共享程序的所有資源,每個執行緒有自己的堆疊和區域性變數。執行緒由CPU獨立排程執行,在多CPU環境下就允許多個執行緒同時執行。同樣多執行緒也可以實現併發操作,每個請求分配一個執行緒來處理。

執行緒和程序各自有什麼區別和優劣呢?

  • 程序是資源分配的最小單位,執行緒是程式執行的最小單位。

  • 程序有自己的獨立地址空間,每啟動一個程序,系統就會為它分配地址空間,建立資料表來維護程式碼段、堆疊段和資料段,這種操作非常昂貴。而執行緒是共享程序中的資料的,使用相同的地址空間,因此CPU切換一個執行緒的花費遠比程序要小很多,同時建立一個執行緒的開銷也比程序要小很多。

  • 執行緒之間的通訊更方便,同一程序下的執行緒共享全域性變數、靜態變數等資料,而程序之間的通訊需要以通訊的方式(IPC)進行。不過如何處理好同步與互斥是編寫多執行緒程式的難點。

  • 但是多程序程式更健壯,多執行緒程式只要有一個執行緒死掉,整個程序也死掉了,而一個程序死掉並不會對另外一個程序造成影響,因為程序有自己獨立的地址空間。