1.什麼是進程?

進程是操作系統進行資源分配和調度的基本概念,可以說進程是線程的容器,一個進程里包括數據區域和堆棧存儲著活動過程調用的指令和本地的變數,進程沒運行時候處於沒有生命的一個實體的狀態,運行時依賴處理器給他活體狀,一個進程至少有一個線程,如果沒有的話那麼這個線程就是它本身。

2.多進程的概念

理論上一個CPU只能給一個進程,如果想一個CPU運行多個進程的話,那就是多進程,就要使用並發技術,實現並發技術非常複雜,說一下簡單的並發技術 "時間片輪轉進程調度演算法" 在操作系統的管理下,所有正在運行的進程輪流使用CPU,每個進程允許佔用CPU的時間非常短(比如10ms),這樣用戶根本感覺不出來 CPU是在輪流為多個進程服務,但實際上在任何一個時間內有且僅有一個進程佔有CPU。 如果一台計算機有多個CPU,情況就不同了,如果進程數大於CPU數的時候,使用這種並發技術。目前都是幾核的CPU都能夠處理。

同時,這兩種上下文切換的處理都是通過操作系統內核來完成的。內核的這種切換過程伴隨的最顯著的性能損耗是將寄存器中的內容切換出。

3.什麼是線程?

線程是程序執行流的最小單元,一個線程的信息包括(線程ID,指令集合,堆棧組)組成的線程這種單位,上面進程提到進程是線程的一個容器,說明線程運行在進程裡面的,那就是運行在進程裡面的一個實體,它不擁有系統資源,但它擁有進程的資源。

一、線程的三種狀態

1.就緒狀態:

是指線程具備運行的所有條件,邏輯上可以運行,在等待處理機的過程。

2.阻塞狀態:

是指線程在等待某一個事件(信號量)。

3.運行狀態:

是指線程佔有處理機正在運行。

二、多線程

同時運行多個線程完成不同的工作,就叫做多線程,使用多線程的好處有:

1.資源利用率更好: 想像一下,一個應用程序需要從本地文件系統中讀取和處理文件的情景。比方說,從磁碟讀取一個文件需要5秒,處理一個文件需要2秒。處理兩個文件則需要14s,在這段時間裡,CPU非常的空閑,它可以做一些別的事情,那麼我們使用多個線程的話,是不是可以處理文件的同時去讀取新的文件,這樣就提高了時間效率,

2.程序響應更快:假設做某一個服務的時候,它在某一個埠監聽進來的請求,當一個請求到來時,它去處理這個請求,然後再返回去監聽。

3.程序設計簡單

做多線程的時候運用多線程的技術設計非常簡單易用,遵循好一些規則,避免造成阻塞等操作,基本可以很快設計程序的需求。

4.使用場景:

多線程:密集I/O任務(網路I/O,磁碟I/O,資料庫I/O)使用多線程合適。

三、線程與線程主要依靠什麼通信

線程間通信主要通過共享內存

什麼是協程?

一個程序可以包含多個協程,線程相對獨立有自己的上下文,協程也是,但是協程由自己控制,不受操作系統控制,可以不加鎖的訪問全局變數,所以上下文的切換非常快,可以說是輕量級的線程,也可以說稱之為用戶級別的線程就叫協程,一個線程可以多個協程,一個進程也可以單獨擁有多個協程,線程進程都是同步機制,而協程則是非同步。

1.使用場景:

又稱微線程,在單線程上執行多個任務,用函數切換,開銷極小。不通過操作系統調度,沒有進程、線程的切換開銷。genventmonkey.patchall

多線程請求返回是無序的,那個線程有數據返回就處理那個線程,而協程返回的數據是有序的,處理磁碟的I/O比較慢,處理網路I/O性能還是比較高。

四.進程線程上下文切換

順便說一下上下文切換上下文切換就是從當前執行任務切換到另一個任務執行的過程。但是,為了確保下次能從正確的位置繼續執行,在切換之前,會保存上一個任務的狀態。進程上下文切換與線程上下文切換最主要的區別就是線程的切換虛擬空間內存是相同的(因為都是屬於自己的進程),但是,進程切換的虛擬空間內存則是不同的。同時,這兩種上下文切換的處理都是通過操作系統內核來完成的。

上面畫了一個進程,線程,協程的調用關係圖。


推薦閱讀:
相关文章