1. 程式人生 > >第一次作業:深入分析Linux系統進程

第一次作業:深入分析Linux系統進程

pac 重要 模型 組織 zombie linu lsp wid color

前言在現在的操作系統中有很多種,我主要是講講Linux操作系統的,首先我們了解一下Linux系統,Linux是一套免費使用和自由傳播的類Unix操作系統,是一個基於POSIX和UNIX的多用戶、多任務、支持多線程和多CPU的操作系統。它能運行主要的UNIX工具軟件、應用程序和網絡協議。它支持32位和64位硬件。Linux繼承了Unix以網絡為核心的設計思想,是一個性能穩定的多用戶網絡操作系統。它主要用於基於Intel x86系列CPU的計算機上。這都是參看百度網頁上的解釋。

1.Linux系統是如何組織進程的?

首先我們了解一下進程是什麽?

1.1程(Process)是計算機中的程序關於某數據集合上的一次運行活動,是系統進行資源分配和調度的基本單位,是操作系統結構的基礎。在早期面向進程設計的計算機結構中,進程是程序的基本執行實體;在當代面向線程設計的計算機結構中,進程是線程的容器。程序是指令、數據及其組織形式的描述,進程是程序的實體。來自於百度網頁上的解釋。

1.2Linux 系統創建進程都是用 fork() 系統調用創建子進程由 fork() 系統調用創建的新進程被稱為子進程。該函數被調用一次,但返回兩次。如果 fork()進程調用成功,兩次返回的區別是子進程的返回值是0,而父進程的返回值則是新子進程的進程號。

1,3 Linux的進程控制塊為一個由結構task_struct所定義的數據結構,task_struct定義在在/include/ linux/sched.h 中,其中包括管理進程所需的各種信息。

task_struct結構描述

所屬頭文件include\linux\sched.h。

每個進程都會被分配一個task_struct結構,它包含了這個進程的所有信息,

在任何時候操作系統都能跟蹤這個結構的信息。

這個結構是linux內核匯總最重要的數據結構,下面我們會詳細的介紹。

這個結構的主要信息:

1、進程狀態 ,將紀錄進程在等待,運行,或死鎖

2、調度信息, 由哪個調度函數調度,怎樣調度等

3、進程的通訊狀況

4、因為要插入進程樹,必須有聯系父子兄弟的指針, 當然是task_struct型

5、時間信息, 比如計算好執行的時間, 以便cpu 分配

6、標號 ,決定改進程歸屬

7、可以讀寫打開的一些文件信息

8、 進程上下文和內核上下文

9、處理器上下文

10、內存信息

以下圖片都來自於相關鏈接上的資料。

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

1. 進程狀態(State)

進程執行時,它會根據具體情況改變狀態 。進程狀態是調度和對換的依據。Linux中的進程主要有如下狀態

內核表示

含義

TASK_RUNNING

可運行

TASK_INTERRUPTIBLE

可中斷的等待狀態

TASK_UNINTERRUPTIBLE

不可中斷的等待狀態

TASK_ZOMBIE

僵死

TASK_STOPPED

暫停

TASK_SWAPPING

換入/換出 Linux進程的狀態


·可運行狀態

處於這種狀態的進程,要麽正在運行、要麽正準備運行。正在運行的進程就是當前進程(由current所指向的進程),而準備運行的進程只要得到CPU就可以立即投入運行,CPU是這些進程唯一等待的系統資源。系統中有一個運行隊列(run_queue),用來容納所有處於可運行狀態的進程,調度程序執行時,從中選擇一個進程投入運行。在後面我們討論進程調度的時候,可以看到運行隊列的作用。當前運行進程一直處於該隊列中,也就是說,current總是指向運行隊列中的某個元素,只是具體指向誰由調度程序決定。

·等待狀態

處於該狀態的進程正在等待某個事件(event)或某個資源,它肯定位於系統中的某個等待隊列(wait_queue)中。Linux中處於等待狀態的進程分為兩種:可中斷的等待狀態和不可中斷的等待狀態。處於可中斷等待態的進程可以被信號喚醒,如果收到信號,該進程就從等待狀態進入可運行狀態,並且加入到運行隊列中,等待被調度;而處於不可中斷等待態的進程是因為硬件環境不能滿足而等待,例如等待特定的系統資源,它任何情況下都不能被打斷,只能用特定的方式來喚醒它,例如喚醒函數wake_up()等。

·暫停狀態

此時的進程暫時停止運行來接受某種特殊處理。通常當進程接收到SIGSTOP、SIGTSTP、SIGTTIN或 SIGTTOU信號後就處於這種狀態。例如,正接受調試的進程就處於這種狀態。

·僵死狀態

進程雖然已經終止,但由於某種原因,父進程還沒有執行wait()系統調用,終止進程的信息也還沒有回收。顧名思義,處於該狀態的進程就是死進程,這種進程實際上是系統中的垃圾,必須進行相應處理以釋放其占用的資源。

2.那進程狀態是如何轉化的呢?

技術分享圖片

該圖片來源網絡截圖

3.進程是如何調度?

在現代操作系統中,我們是不能夠通過讓一個進程去對應一個核心,這就表示這時候管理進程就需要添加一個能夠控制它的管理單元。即是進程調度器。

調度器分配的CPU時間不能太長,否則會導致其他的程序響應延遲,難以保證公平性。

調度器分配的時間也不能太短,每次調度會導致上下文切換,這種切換開銷很大。

調度器的結構:

技術分享圖片

進程調度並不是什麽時候都可以,前面也說過,系統會有一個周期調度器,根據頻率自動調用schedule_tick函數。其主要作用就是根據進程運行時間觸發調度;在進程遇到資源等待被阻塞也可以顯示的調用調度器函數進行調度;另外在有內核空間返回到用戶空間時,會判斷當前是否需要調度,在進程對應的thread_info結構中,有一個flag,該flag字段的第二位(從0開始)作為一個重調度標識TIF_NEED_RESCHED,當被設置的時候表明此時有更高優先級的進程,需要執行調度。另外目前的內核支持內核搶占功能,在適當的時機可以搶占內核的運行。

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

4.對於Linux系統進程模型的看法:

每個系統都相似之處也·有其不同之處。LINUX的核心就是UNIX。UNIX還有很多其他的分衍操作系統

系統進程的狀態就在各種不同的小狀態中不斷的切換,不斷喚醒或者停止某一個狀態。還有不可能讓一個進程去對一個核心,這樣就得需要一小助手去幫助管理一下即進程調度器,想要了解更多還的深入研究。

參考鏈接

https://www.cnblogs.com/ck1020/p/6089970.html

https://www.cnblogs.com/hanxiaoyu/p/5549212.html

https://blog.csdn.net/wodeqingtian1234/article/details/54178770

https://blog.csdn.net/myarrow/article/details/7035684

技術分享圖片

第一次作業:深入分析Linux系統進程