linux 程序 一 基本概念

2021-06-20 14:29:17 字數 2703 閱讀 9753

1,程序的基本概念

簡單來說程序就是執行期的程式,但是同時程序也不至於此,它還包括了其它資源(如開啟的檔案,掛起的訊號等等)

linux是乙個多工多使用者作業系統,乙個任務(task)就是乙個程序(process),即程序=任務,在linux系統中,程序和執行緒共享一系列的資源(位址空間,檔案,訊號,名字空間等)

程序的task_struct結構體中tgid代表的是程序id, pid代表的是執行緒id或者程序id

2,程序的標識;

每個程序都有乙個獨一無二的結構體即struct task_struct,乙個程序相關的所有資訊都可以在該結構體裡標識,每乙個程序的task_struct又組成了乙個任務佇列,用雙向鍊錶表示:另外每乙個程序還對應乙個獨一無二的數字,即pid,pid最大值為32767(32768=8*4096,32位系統乙個頁是4096位元組,每個位元組為8bit),後乙個程序建立的pid是前乙個程序pid加1,當pid到達最大值後又從最小值開始,linux用pidmap_array點陣圖來知道哪些pid被使用,乙個程序中所有執行緒使用的pid是相同的,但是有各自不同的執行緒id,執行緒id只在該程序環境中有效,程序的pid在整個系統是唯一的,

struct task_struct

task_struct結果體是如何分配的?slab分配器?

3,核心如何訪問當前的程序:

#define current get_current()

static inline struct task_struct *get_current(vold)

對每個程序來說,linux把兩個不同的資料結構放在核心的乙個動態儲存區,大小為8k,乙個是struct thread_info,乙個是核心堆疊,在arm處理器上,核心通過sp暫存器指標獲得當前cpu正在執行程序的thread_info結構位址,在thread_info.h檔案.

如何檢視thread_info結構體的資訊

#define task_thread_info(task)    ((struct thread_info *)(task)->stack)

v.v (struct thread_info*)(0xe9a1c000 & ~(8192-1))

4,程序的狀態:

就緒態,阻塞態,執行態

核心將程序的狀態儲存在struct task_struct的state欄位中:

struct task_struct

程序的殭屍狀態:

程序的殭屍狀態:表示程序結束但尚未消亡的一種狀態。此時程序已經結束執行並釋放掉大部分資源(放棄了幾乎所有記憶體空間,沒有任何可執行**,也不能被排程),但尚未釋放task_struct(只剩下它了,所以稱為殭屍),記載該程序的退出狀態等資訊供其他程序收集,除此之外,殭屍程序不再占有任何記憶體空間。

子程序在退出的過程中,核心會給其父程序傳送乙個訊號(預設是sigchld,但是在通過clone系統呼叫建立子程序時,可以設定這個訊號),通知父程序來"收屍"。父程序可以通過wait系列的系統呼叫(如wait4、waitid)來等待某個或某些子程序的退出,並獲取它的退出資訊。然後wait系列的系統呼叫會順便將子程序的屍體(task_struct)也釋放掉 如果他的父程序沒安裝sigchld訊號處理函式呼叫wait或waitpid()等待子程序結束,又沒有顯式忽略該訊號,那麼它就一直保持殭屍狀態,子程序的屍體(task_struct)也就無法釋放掉

如何處理殭屍程序:找出父程序號,然後殺死父程序,在android下,子程序一起被殺死

核心中設定某個程序狀態的函式: set_task_sate(task,state);

5,程序的優先順序:

在task_struct中有四個變數和程序的優先順序相關:

sched.h

struct task_struct

① prio指的是任務當前的動態優先順序,其值影響任務的排程順序。

② normal_prio指的是任務的常規優先順序,該值基於static_prio和排程策略計算。

③ static_prio指的是任務的靜態優先順序,在程序建立時分配,該值會影響分配給任務的時間片的長短和非實時任務動態優先順序的計算。範圍是120+nice值,nice值範圍是-20到19

④ rt_priority指的是任務的實時優先順序。若為0表示是非實時任務,[1, 99]表示實時任務,值越大,優先順序越高。

對於非實時任務,prio = normal_prio = static_prio

實時程序:prio = normal_prio = max_rt_prio – 1 – rt_priority

子程序的靜態優先順序繼承父程序的靜態優先順序,子程序的動態優先順序繼承自父程序的普通優先順序~

6,各個程序關係

linux系統程序存在乙個繼承關係,系統中每個程序都有父程序,init(pid為1,由idle程序(pid為0建立))程序是所有使用者程序的祖先,而kthreadd是所有核心程序的祖先程序關係除了父子兄度,可能還存在其它關係,如程序組,登入會話等等。程序如何從pid匯出task_struct結構體:核心主要根據pid tgid pgrp session四個不同含義用到了四個hash表。

;

Linux 程序的基本概念

在了解程序之前先要知道作業系統的基本原理。作業系統是管理計算機硬體與軟體資源的電腦程式,是計算機系統的核心與基石。簡單理解就是,作業系統包括核心與其他程式兩部分。設計作業系統就是方便使用者與硬體進行互動,幫助使用者管理軟硬體資源。那麼怎麼管理呢?例如 學生 班長 班主任,學生被班長管理,班長又受班主...

程序基本概念

程式在計算機上的一次執行過程。即進行中的程式。程序 是活的,動態的。有生命週期。只能對應乙個程式。程式 是死的,靜態的。指令的集合。可以對應多個程序。就緒 程序已獲得除cpu以外的所有必要的資源 獲得cpu立即執行。執行 程式正在cpu上執行。阻塞 等待某個事件發生而無法執行時 放棄cpu。task...

一 Linux基本概念

linux 核心最初只是由芬蘭人林納斯 托瓦茲 linus torvalds 在赫爾辛基大學上學時出於個人愛好而編寫的。linux 是一套免費使用和自由傳播的類 unix 作業系統,是乙個基於 posix 和 unix 的多使用者 多工 支援多執行緒和多 cpu 的作業系統。linux 能執行主要的...