回覆列表
  • 1 # 不加班的程式猿

    先宣告下,什麼是多程序、多執行緒

    什麼是多程序?

    在計算中,程序是正在執行的計算機程式的一個例項。或者簡單地說,執行程式也稱為程序。

    多程序意味著“在單個計算機系統中具有兩個或更多個CPU。

    例如,如果計算機系統具有雙核心,並且同時執行(執行)兩個程序(同時),則可以透過將每個程序分配給系統的每個核心來實現。因此,這兩個過程可以同時執行。換句話說,多程序可以定義為多個程序可以同時執行,而不是一個接一個地執行。在多程序中,每個程序都有不同的地址空間和資源。

    什麼是多執行緒?

    程序是執行緒的集合。執行緒是一個輕量級的過程。執行緒執行是執行的小處理單元。

    每個程序包含許多執行緒,所有執行緒共享相同的記憶體空間。

    同一個程序中可以存在多個執行緒,共享記憶體等資源,而不同的程序不共享這些資源。

    在單個處理器上,多執行緒通常透過時分多路複用(如多工處理):處理器在不同的執行緒之間切換。

    這種上下文切換通常發生得足夠頻繁,以至於使用者感覺到執行緒或任務同時執行。

    執行緒與程序有什麼不同?

    執行緒不同於傳統的多工作業系統程序:

    程序通常是獨立的,而執行緒作為程序的子集存在

    程序比執行緒攜帶更多的狀態資訊,而程序內的多個執行緒共享程序狀態以及記憶體和其他資源

    程序具有獨立的地址空間,而執行緒共享其地址空間

    程序只能透過系統提供的程序間通訊機制進行互動

    同一程序中的執行緒之間的上下文切換通常比程序之間的上下文切換更快

    多執行緒排程

    作業系統透過以下兩種方式之一來排程執行緒:

    先發制人的多執行緒一般被認為是優越的方法,因為它允許作業系統確定何時發生上下文切換。搶佔式多執行緒的缺點是系統可能會在不恰當的時間進行上下文切換,引起鎖車隊,優先順序反轉或其他負面影響,這可能會透過協作式多執行緒來避免。

    另一方面,合作多執行緒依賴於執行緒自己放棄控制,一旦他們在停止點。如果執行緒正在等待資源變為可用狀態,則會產生問題。

    執行緒的保護機制

    一個執行緒將共享父程序的所有全域性變數和檔案描述符,允許程式設計師在一個程序內輕鬆地分離多個任務。

    它共享一切,除了每個執行緒將有自己的程式計數器,堆疊和暫存器。由於每個執行緒都有自己的堆疊,所以執行緒之間不會共享區域性變數。

    由於一個程序的所有執行緒共享相同的全域性變數,所以同步訪問全域性變數會出現問題。例如,我們假設你有一個全域性變數X和兩個執行緒A和B.假設執行緒A和B只會增加X的值。當執行緒A開始執行時,它將把X的值複製到暫存器中並遞增。在它有機會將值寫回記憶體之前,此執行緒被暫停。下一個執行緒開始,讀取第一個執行緒讀取的相同的X值,遞增並寫回到記憶體。然後,第一個執行緒完成執行並將其值從暫存器寫回到記憶體。在這兩個執行緒完成之後,X的值會按照您的預期遞增1而不是2。

  • 2 # 菜鳥猿

    首先,Linux多執行緒和多程序的作用其實作用都差不多,主要是為了完成併發任務。

    其次,我們再來看看什麼是程序,什麼是執行緒,以及它們之間的關係。

    執行緒是執行體,用來執行我們寫的程式碼或指令,多個執行緒可以同時執行。

    程序是容器,包含了執行緒執行所需要的一切系統資源,執行緒只能在程序空間中執行,程序中可以包含多個執行執行緒,但只有一個主執行緒,我們程式碼中包含main函式的執行緒也就是程序中的主執行緒。

    程序本身是不活躍的,在Linux中,如果程序中的所有執行執行緒都已經退出,而父程序沒有捕獲子程序結束的訊號,此時該程序則會變為殭屍程序,該程序不佔CPU時間,但會佔據系統資源,如果大量存在,必定會導致系統資源被耗盡,導致宕機。

    通俗的比喻就是,作業系統就像一個手工作坊,程序就相當於作坊中一個個獨立的工作車間,而執行緒就相當於車間中真正勞作的工人,沒有工人的車間是無法進行生產的。

    程序空間之間彼此隔離,可以說互不影響,就相當於上述手工作坊中的兩個車間中都有個叫張三的人,但其中一個因為上班時間玩手機被老闆開除了,而另一個車間中的張三卻不會受到任何影響。(當然,這不是絕對的,Linux子程序會在建立初期共享父程序的程序空間,而vfork系統呼叫會導致這種共享一直存在,導致父程序中的變數修改會影響子程序資料,而fork則採用寫時複製技術來避免了這個問題)。

    由於程序的這種隔離性,程序之間共享資料和通訊也變得麻煩許多,一般的技術手段就是管道,POSIX訊號,System V訊號,共享記憶體,Socket網路通訊等等。

    執行緒之間也沒有程序那麼麻煩,它們是共享整個程序空間的,這就像車間裡要開小組會議,一個人發言的時候大家都能聽到,但這又造成了另一個問題,畢竟一個車間十來號人,難免人多嘴雜,怎麼保證一個人發言的中途沒人插嘴呢,這就是執行緒同步的問題,一般的技術手段就是訊號量,互斥鎖,讀寫鎖,檔案鎖等等。

    當然,多執行緒中同步的問題在多程序中依然會遇到,解決辦法自然也就和多執行緒差不多。

  • 中秋節和大豐收的關聯?
  • 如果伊藤美誠不是日本球員,我們還會這樣去嘲諷她嗎?