linux程序管理與排程(一)

2021-08-03 23:39:03 字數 3360 閱讀 1455

程序的管理與排程是所有作業系統的核心功能。從核心的角度來看,程序是核心分配資源(cpu,memory)的重要單元,是計算機用來管理這些資源的一種抽象。從本節開始,將對linux核心的程序管理與排程子系統進行分析,其中使用的核心版本是4.4。

在linux核心中,每乙個程序唯一對應乙個struct task_struct結構體,核心通過這些task_struct的管理實現對程序的管理。此資料結構定義在./include/linux/sched.h中,結構太過龐大,下面作為例項只列出了前面幾行。

struct task_struct
按照結構成員的用途,大體上分成了如下的類別,

(1) 基本資訊。comm, pid, tgid, uid, gid, stack, on_cpu, on_rq, in_execve, in_iowait…

(2) 程序關係。real_parent, children, sibling…

(3) 狀態相關。state, exit_state, exit_code…

(4) 使用記憶體。mm, active_mm, min_flt, maj_flt…

(5) 排程相關。prio, static_prio, normal_prio, rt_prio, sched_class, se, policy…

(6) 事件相關。utime, stime, start_time, real_start_time…

(7) 訊號相關。signal, sighand, blocked, real_blocked, pending…

(8)檔案系統。fs, files, nameidata…

(9) misc

程序的狀態定義如下所示,

#define task_running        0    //r態,程序正在執行或在rq中等待執行

#define task_interruptible 1 //s態,阻塞等待資源或者訊號

#define task_uninterruptible 2 //d態,阻塞等待資源

#define __task_stopped 4 //暫停狀態

#define __task_traced 8 //跟蹤狀態

/* in tsk->exit_state */

#define exit_dead 16

#define exit_zombie 32

#define exit_trace (exit_zombie | exit_dead)

/* in tsk->state again */

#define task_dead 64

#define task_wakekill 128

#define task_waking 256

#define task_parked 512

#define task_noload 1024

#define task_state_max 2048

狀態轉換的狀態機如圖所示,

程序的初始化是在start_kernel中的reset_init中實現的,建立了兩個程序init和kthreadd。

kernel_thread(kernel_init, null, clone_fs);  //init程序建立

pid = kernel_thread(kthreadd, null, clone_fs | clone_files); //kthread核心執行緒建立

建立的init程序再通過解析init.rc等檔案進行使用者程序的建立。

static int __ref kernel_init(void *unused)

建立的kthreadd核心執行緒通過遍歷kthread_create_list建立核心執行緒。

int kthreadd(void *unused)

spin_unlock(&kthread_create_lock);

}return

0;}

kthreadd與核心執行緒的關係如下:

kthreadd-+-vsertestwq

|-adaptive_ts_wor

|-agdsp_access

|-ata_sff

|-aud_sblock-1-3

|-aud_sblock-1-4

|-binder

|-bioset

|-bm_perf

|-carveout_camera

|-carveout_fb

|-carveout_mm

|-carveout_overla

|-cfg80211

|-cfinteractive

|-compr drain

|-compr monitor

|-crypto

|-deferwq

|-devfreq_wq

|-dhd_dpc

|-dhd_rxf

|-dhd_watchdog_th

…常用的程序建立方法如下:

fork—————–使用者程序

pthread_create—- 使用者執行緒

kthread_create —-核心執行緒

do_fork

thread_info儲存了特定體系結構的彙編**段需要訪問的那部分程序的資料。核心棧供使用者程序的核心**或核心執行緒使用。arm 32bit 處理器thread_info和核心棧task->stack合用2頁記憶體空間。

union thread_union ;
常用的current指標指向了當前的thread_info的task成員。

#define get_current() (current_thread_info()->task)

#define current get_current()

static

inline

struct thread_info *current_thread_info(void)

current_thread_info就是當前sp遮蔽掉低12位。

Linux程序管理與排程

核心版本 架構作者 github csdn 2016 07 21 linux 4.6 x86 arm gatieme linuxdevicedrivers linux程序管理與排程 專案描述 kernelinkernel 乙個執行在linux上的小巧核心,修改了linux kernel的start ...

記憶體管理與程序排程

一 記憶體管理 1 核心 使用alloc pages申請物理頁幀 使用kmalloc申請專用 通用記憶體塊 vmalloc申請物理不連續,邏輯相連記憶體 使用kmap建立高階位址對映 外碎片 空閒記憶體零散分布,無法滿足大記憶體需求 夥伴系統解決 內碎片 申請一塊記憶體真正使用的只有小部分 slab...

程序管理 程序排程

一 概念 1 處理機管理是作業系統的主要功能之一。處理機管理的實現策略決定了作業系統的型別,其演算法好壞直接影響整個系統的效能 2 程序排程 通過某種規則或演算法從就緒 等待 程序佇列中選出乙個程序投入執行 3 排程是乙個基本的作業系統功能。cpu排程是作業系統設計的核心問題 二 cpu排程程式 1...