進程控制塊(PCB)結構
阿新 • • 發佈:2017-11-01
adding pid cpu ren ppa 多參數 tro swap vcs
調度數據成員:
1) vo latile long state
表示進程的當前狀態。進程運行時, 它會根據具體情況改變狀態。進程狀態總共有TASK RUNN ING ( 可運行狀態)、TASK INTERRUPT IBLE ( 可中斷的等待狀態)、TASK UNINTERRUPT IBLE(不可中斷的等待狀態)、TASK ZOMB IE( 僵死狀態)、TASK STOPPED(暫停狀態) 等5種。 2) long pr io rity進程優先級, prio rity 的值給出了進程每次獲取CPU 後, 可使用的時間片長度( 單位是jiffies)。 3) unsigned long rt_priority rt_priority 的值給出了實時進程的優先級, rt_priority
1000給出進程每次獲取CPU 後, 可使用的時間片長度(單位是jiffies)。 4) long counter在輪轉法調度時counter表示當前進程還可運行多久。在進程開始時被賦為priority的值, 以後每隔一個時鐘中斷遞減1,減到0時引起新一輪調度。 5) unsigned long policy表示該進程的進程調度策略。調度策略有: SCH ED_OTHER 0, 非實時進程, 用基於優先權的輪轉法。 SCH ED_FIFO 1, 實時進程, 用先進先出算法。
SCH ED_RR 2, 實時進程, 用基於優先權的輪轉法 進程隊列指針: 1) struc t task_struct* next_task, * prev_task
在Linux 中所有進程(以PCB 的形式)組成一個雙向鏈表,
next_task和prev_task是鏈表的前後向指針。 2) struct task_struct* p_opptr, * p_pptr
struct task_struc t* p_cptr, * p_ysptr, * p_osptr
以上分別是指向該進程的原始父進程、父進程、子進程和新
老兄弟進程的指針。 3) struct task_struct* pidhash_next
struct task_struct** pidhash_pprev
用於鏈入進程hash表的前後指針。系統進程除了鏈入雙
向鏈表外, 還被加到hash表中。 進程標識: uid_t uid gid_t gid uid和gid分別是運行進程的用
戶標識和用戶組標識。 pid_t pid pid_t pgrp pid和pgrp分別是運行進程的
進程標識號和進程組標識號 時間數據成員: long per_cpu_utime [ NR_CPUS ] per_cpu_stime
[ NR_CPUS]
per_cpu_utime 是用戶態進程運行的時間, per_cpu_
stime是內核態進程運行的時間 進程創建時間unsigned long start_time
文件系統數據成員: struct fs_struct* fs
fs保存了進程本身與VFS( 虛擬文件系統)的關系信息。
struct fs_struct
{
atom ic_t count;
rw lock_t lock;
int umask;
struct dentry* root, * pwd, * altroot;
struct vfsm ount* rootmnt, * pwdmnt, * altrootmnt;
}
其中root、rootm nt是根目錄的dentry 和其mount點的vfsmount。
pwd、pwdmnt 是當前工作目錄的dentry 和其mount 點的vfs..
mount。altroot、altrootmnt是保存根節點被替換之後原來根目標
的dentry和其mount點的vfsmount。 內存數據成員: 1) struct mm_struct* mm
在Linux 中, 采用按需分頁的策略解決進程的內存需求。
task_struct的數據成員mm 指向關於存儲管理的mm_truc t結
構。 2) struct mm_struct* active_mm
active_mm 指向活動地址空間。 3) mm_segm ent_t addr_ lim it
表示線程空間地址。
用戶線程空間地址: 0..0xBFFFFFFF。
內核線程空間地址: 0..0xFFFFFFFF 4) spinlock_t alloc_ lock
用於申請空間時用的自旋鎖。自旋鎖的主要功能是臨界區
保護。 頁面管理: 1) int swappable: 1
進程占用的頁面是否可換出。swappab le為1表示可換出。
2) unsigned long min_flt, maj_ flt
該進程累計minor缺頁次數和major缺頁次數。
3) unsigned long nswap
該進程累計換出頁面數。
4) unsigned long swap_cnt
下一次循環最多可換出的頁數。
一、進程控制塊(PCB)結構
進程控制塊(PCB)是系統為了管理進程設置的一個專門的數據結構。系統用它來記錄進程的外部特征,描述進程的運動變化過程。同時,系統可以利用PCB來控制和管理進程,所以說,PCB(進程控制塊)是系統感知進程存在的唯一標誌。
Linux系統的PCB包括很多參數,每個PCB約占1KB多的內存空間。用於表示PCB的結構task_struct簡要描述如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
include/linux/sched.h
struct task_struct {
volatile long state;
struct thread_info *thread_info;
atomic_t usage;
unsigned long flags;
unsigned long ptrace;
int lock_depth;
int prio, static_prio;
struct list_head run_list;
prio_array_t *array;
unsigned long sleep_avg;
long interactive_credit; unsigned long long timestamp;
int activated;
unsigned long policy;
cpumask_t cpus_allowed;
unsigned int time_slice, first_time_slice;
struct list_head tasks;
struct list_head ptrace_children;
struct list_head ptrace_list;
struct mm_struct *mm, *active_mm;
...
struct linux_binfmt *binfmt; int exit_code, exit_signal;
int pdeath_signal;
...
pid_t pid;
pid_t tgid;
...
struct task_struct *real_parent;
struct task_struct *parent;
struct list_head children;
struct list_head sibling;
struct task_struct *group_leader;
...
struct pid_link pids[PIDTYPE_MAX];
wait_queue_head_t wait_chldexit;
struct completion *vfork_done;
int __user *set_child_tid;
int __user *clear_child_tid;
unsigned long rt_priority;
unsigned long it_real_value, it_prof_value, it_virt_value;
unsigned long it_real_incr, it_prof_incr, it_virt_incr;
struct timer_list real_timer;
unsigned long utime, stime, cutime, cstime;
unsigned long nvcsw, nivcsw, cnvcsw, cnivcsw;
u64 start_time;
...
uid_t uid,euid,suid,fsuid;
gid_t gid,egid,sgid,fsgid;
struct group_info *group_info;
kernel_cap_t cap_effective, cap_inheritable, cap_permitted;
int keep_capabilities:1;
struct user_struct *user;
...
struct rlimit rlim[RLIM_NLIMITS];
unsigned short used_math;
char comm[16];
...
int link_count, total_link_count;
...
struct fs_struct *fs;
...
struct files_struct *files;
...
unsigned long ptrace_message;
siginfo_t *last_siginfo;
...
};
|
表示進程的當前狀態。進程運行時, 它會根據具體情況改變狀態。進程狀態總共有TASK RUNN ING ( 可運行狀態)、TASK INTERRUPT IBLE ( 可中斷的等待狀態)、TASK UNINTERRUPT IBLE(不可中斷的等待狀態)、TASK ZOMB IE( 僵死狀態)、TASK STOPPED(暫停狀態) 等5種。 2) long pr io rity進程優先級, prio rity 的值給出了進程每次獲取CPU 後, 可使用的時間片長度( 單位是jiffies)。 3) unsigned long rt_priority rt_priority 的值給出了實時進程的優先級, rt_priority
1000給出進程每次獲取CPU 後, 可使用的時間片長度(單位是jiffies)。 4) long counter在輪轉法調度時counter表示當前進程還可運行多久。在進程開始時被賦為priority的值, 以後每隔一個時鐘中斷遞減1,減到0時引起新一輪調度。 5) unsigned long policy表示該進程的進程調度策略。調度策略有: SCH ED_OTHER 0, 非實時進程, 用基於優先權的輪轉法。 SCH ED_FIFO 1, 實時進程, 用先進先出算法。
SCH ED_RR 2, 實時進程, 用基於優先權的輪轉法 進程隊列指針: 1) struc t task_struct* next_task, * prev_task
在Linux 中所有進程(以PCB 的形式)組成一個雙向鏈表,
next_task和prev_task是鏈表的前後向指針。 2) struct task_struct* p_opptr, * p_pptr
struct task_struc t* p_cptr, * p_ysptr, * p_osptr
以上分別是指向該進程的原始父進程、父進程、子進程和新
老兄弟進程的指針。 3) struct task_struct* pidhash_next
struct task_struct** pidhash_pprev
用於鏈入進程hash表的前後指針。系統進程除了鏈入雙
向鏈表外, 還被加到hash表中。 進程標識: uid_t uid gid_t gid uid和gid分別是運行進程的用
戶標識和用戶組標識。 pid_t pid pid_t pgrp pid和pgrp分別是運行進程的
進程標識號和進程組標識號 時間數據成員: long per_cpu_utime [ NR_CPUS ] per_cpu_stime
[ NR_CPUS]
per_cpu_utime 是用戶態進程運行的時間, per_cpu_
stime是內核態進程運行的時間 進程創建時間unsigned long start_time
文件系統數據成員: struct fs_struct* fs
fs保存了進程本身與VFS( 虛擬文件系統)的關系信息。
struct fs_struct
{
atom ic_t count;
rw lock_t lock;
int umask;
struct dentry* root, * pwd, * altroot;
struct vfsm ount* rootmnt, * pwdmnt, * altrootmnt;
}
其中root、rootm nt是根目錄的dentry 和其mount點的vfsmount。
pwd、pwdmnt 是當前工作目錄的dentry 和其mount 點的vfs..
mount。altroot、altrootmnt是保存根節點被替換之後原來根目標
的dentry和其mount點的vfsmount。 內存數據成員: 1) struct mm_struct* mm
在Linux 中, 采用按需分頁的策略解決進程的內存需求。
task_struct的數據成員mm 指向關於存儲管理的mm_truc t結
構。 2) struct mm_struct* active_mm
active_mm 指向活動地址空間。 3) mm_segm ent_t addr_ lim it
表示線程空間地址。
用戶線程空間地址: 0..0xBFFFFFFF。
內核線程空間地址: 0..0xFFFFFFFF 4) spinlock_t alloc_ lock
用於申請空間時用的自旋鎖。自旋鎖的主要功能是臨界區
保護。 頁面管理: 1) int swappable: 1
進程占用的頁面是否可換出。swappab le為1表示可換出。
2) unsigned long min_flt, maj_ flt
該進程累計minor缺頁次數和major缺頁次數。
3) unsigned long nswap
該進程累計換出頁面數。
4) unsigned long swap_cnt
下一次循環最多可換出的頁數。
二、makefile
makefile定義了一系列的規則來指定,哪些文件需要先編譯,哪些文件需要後編譯,哪些文件需要重新編譯,甚至於進行更復雜的功能操作,makefile帶來的好處就是——“自動化編譯”,一旦寫好,只需要一個make命令,整個工程完全自動編譯,極大的提高了軟件開發的效率。make是一個命令工具,是一個解釋makefile中指令的命令工具.
Makefile來告訴make命令如何編譯和鏈接這幾個文件。規則是:
1)如果這個工程沒有編譯過,那麽我們的所有C文件都要編譯並被鏈接。
2)如果這個工程的某幾個C文件被修改,那麽我們只編譯被修改的C文件,並鏈接目標程序。
3)如果這個工程的頭文件被改變了,那麽我們需要編譯引用了這幾個頭文件的C文件,並鏈接目標程序。
下面舉一個簡單的例子:(進度條的實現)
1.vim proc.c寫入(進度條的實現)
2、vim Makefile寫入
第一行中並沒有任何參數,只是在冒號(:)後列出編譯中所需的文件,當第一行中的任何文件中更改時,make就知道需要重新編譯了。
其中.PHONY意思表示clean是一個“偽目標”,清除 所有 .o文件 ,.o文件就是目標文件
3、執行make指令就可以編譯proc.c這個程序
進程控制塊(PCB)結構