1. 程式人生 > >進程控制塊(PCB)結構

進程控制塊(PCB)結構

adding pid cpu ren ppa 多參數 tro swap vcs

一、進程控制塊(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; ... };
調度數據成員: 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
下一次循環最多可換出的頁數。

 

二、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)結構