linux性能優化1-進程相關基礎知識

1.進程相關知識點
1.1.什麼是進程?
進程能夠看作是程序的副本,進程是程序的執行的實例。進程可使用任意資源以便Linux內核能夠處理完成它的任務。
1.2.進程是如何管理的
在Linux操做系統上運行的全部進程都是經過task_struct結構來管理的,也叫「進程描述符」。
1.3.進程描述符屬性
一個進程描述符包含了單個進程在運行期間的必要信息,好比進程標識、進程的屬性、構建進程的資源等。
1.4.子進程的建立和結束過程
當一個進程建立一個新進程的時候,建立進程(父進程)發出一個fork()系統調用,而後父進程獲得一個新建立的進程(子進程) 的進程描述符,並設置一個新的進程ID。它複製父進程的進程描述符的值給子進程。此時父進程的整個地址空間是不能複製的,兩個進程共享相同的地址空間。exec()系統調用將新的程序複製到子進程的地址空間。由於兩個進程共享相同的地址空間,因此新程序 寫數據時會致使頁錯誤。對此,內核會給子進程分配新的物理頁。這種延遲的操做被稱爲Copy On Write。一般子進程執行它本身的程序,而不是執行與父進程相同的做。當程序執行完成的時候,經過一個exit()系統調用終止子進程。exit()系統調用釋放進程的大部分數據結構併發出一個終止信號通知父進程。此時的進程被稱爲殭屍進程。子進程不會被徹底移除,直到父進程經過wait()系統調用得知子進程已終止,父進程纔會移除全部子進程的數據結構,並釋放進程描述符。
1.5.進程的狀態
·TASK_RUNNING(運行狀態)
在這種狀態下,進程正在CPU上運行,或者在隊列(運行隊列)中等待運行。
·TASK_STOPPED(中止狀態)
在這種狀態下,進程因爲某些信號(SIGINT、SIGSTOP)被暫停。進程在等待一個恢復信號如SIGCONT
·TASK_INTERRUPTIBLE(可中斷的睡眠狀態)
在這種狀態下,進程被暫停,並等待某個條件獲得知足。例如進程等待鍵盤中斷。
·TASK_UNINTERRUPTIBLE(不可中斷的睡眠狀態)
當進程處於此狀態時,會給進程發送一個不知曉任何操做的信號。例如進程在等待磁盤I/O的操做。
·TASK_ZOMBIE(僵死狀態)
一個進程經過exit()系統調用退出之後,它的父進程應該知道它已經終止。在此狀態下,一個進程在等待通知它的父進程釋放
全部的數據結構。一個殭屍進程不能終止本身,在這種狀況下其顯示爲Z狀態。使用kill命令是不能殺死這樣一個進程的,由於它已經
被認定爲死亡。若是想擺脫它,能夠殺死父進程。可是若是是init進程的子進程稱爲殭屍進程的話,就必須重啓系統來擺脫它。
1.6.進程的基本狀態
進程在運行中不斷地改變其運行的狀態。一般,一個進程必須具備以下三種基本狀態。
·Running(運行狀態)
當進程已得到CPU資源,進程正在CPU上執行,此時狀態稱爲執行狀態。
·Ready(就緒狀態)
當進程已分配到除了CPU覺得的全部必要的資源,只要得到CPU資源即可以當即執行,這種狀態稱爲就緒狀態
·Blocked(阻塞狀態)
正在執行的進程,因爲等待某個事件而沒法執行,此刻的狀態稱爲阻塞狀態。引發阻塞狀態的因素有:I/O等待,緩衝區申請,等待信號等。算法

1.7.進程的內存段
進程使用它們本身的內存地址區域來執行工做。工做的變化取決於當前狀況和進程的使用。一個進程能夠有不一樣的工做負載和不一樣須要的數據大小。
進程能夠處理各類各樣的數據大小。進程的內存區域由以下段組成:
·文本段
這個區域用來存儲可執行的代碼。
·數據段
數據段由三個區域組成:數據,這個區域存儲初始化的數據,好比靜態變量;BSS,這個區域存儲零初始化的數據,數據初始化爲零;
堆(heap),這個區域,malloc()會根據需求動態分配內存。
·堆棧段
這個區域是局部變量、函數參數、返回的存儲函數的存放區域。
1.8.進程的優先級和nice值
進程優先級是一個數字,用來肯定CPU處理進程的順序,並能夠肯定靜態(實時)優先級和動態(非實時)優先級。一個具備最高優先級的進程有較大的機會獲得在一個處理器上運行的權限。最高靜態(實時)優先級99對應於系統優先級0,最低靜態(非實時)優先級0對應於系統優先級99. 這些靜態(實時)優先級,系統是不能動態改變它們的。對於動態(非實時)的優先級,內核須要使用一個基於進程行爲和特徵的算法作上下加減5的動態調整。一個進程能夠間接的經過使用進程的nice值來改變靜態優先級。Linux支持nice值從19(最低優先級)到-20(最高優先級)。默認值是0。nice值越小進程越優先得到CPU運行權限。
1.9.什麼是上下文切換
在處理器執行期間,運行進程的信息被存儲在處理器的寄存器或者高速緩存中,執行的進程被加載到寄存器的數據集被稱爲上下文。在切換過程當中先存儲運行進程的上下文,而後將下一個要運行的進程的上下文恢復到寄存器。進程描述符和內核模式堆棧區域用於存儲上下文。這個切換的過程叫作上下文切換(context switching)。通常不能有太多的上下文切換,由於處理器每次要刷新寄存器和高速緩存,以便釋放空間給新的進程,此時會致使
性能問題。
1.9.什麼是中斷
中斷處理是優先級最高的任務之一,中斷一般由I/O設備產生,好比網絡接口卡、鍵盤、磁盤控制器、等。中斷處理是Linux內核通知事件。它告訴內核中斷進程執行,並要儘量地快速執行中斷處理,由於有些設備須要快速響應。當一箇中斷信號到達內核的時候,內核必須從當前執行的進程切換到一個新的進程,以處理這個中斷。這意味着中斷會致使上下文切換。中斷分爲兩類;硬中斷和軟中斷。硬中斷由硬件設備產生,須要快速的響應,軟中斷被用來處理能夠推遲的任務。在一個多處理器的環境中,中斷是由每一個處理器處理的。將中斷綁定到單個處理器上能夠提升系統的性能。
1.10.什麼是線程
線程是在進程中產生的一個執行單元,在同一個進程中與其餘線程並行運行。它們共享相同的資源,好比內存、地址空間、打開的文件等等。它們能夠訪問同一組應用程序的數據。線程也被稱爲輕量級的進程。由於它們共享資源,因此在它們中的每一個線程不能同時改變它們的共享資源,所以,互斥、鎖、序列化等是用戶應用程序要實現的機制。
經過拜讀趙永剛老師的佳做《Linux性能優化大師》,並加上本身的理解所總結的知識點。若有雷同,純屬巧合。若有維權,請通知我刪除。緩存

相關文章
相關標籤/搜索