📄 1143.html
字号:
8, 进程上下文和内核上下文<br>
<br>
9,处理器上下文<br>
<br>
10,内存信息<br>
<br>
因为每一个PCB都是这样的, 只有这些结构, 才能满足一个进程的所有要求.<br>
<br>
打开/include/linux/sched.h 找到task_struct 的定义<br>
<br>
struct task_struct {<br>
<br>
/* these are hardcoded - don't touch */<br>
<br>
这里是一些硬件设置对程序原来说是透明的. 其中state 说明了该进程是否可以执行,<br>
<br>
还是可中断等信息. Flage 是进程号, 在调用 fork() 时给出,addr_limit 是区分内核进程<br>
<br>
与普通进程在内存存放的位置不同<br>
<br>
volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */<br>
<br>
unsigned long flags; /* per process flags, defined below */<br>
<br>
int sigpending;<br>
<br>
mm_segment_t addr_limit; /* thread address space:<br>
<br>
0-0xBFFFFFFF for user-thead<br>
<br>
0-0xFFFFFFFF for kernel-thread<br>
<br>
*/<br>
<br>
struct exec_domain *exec_domain;<br>
<br>
long need_resched;<br>
<br>
<br>
<br>
/* various fields */<br>
<br>
count 是 计数器 priorrity 是优先级<br>
<br>
long counter;<br>
<br>
long priority;<br>
<br>
cycles_t avg_slice;<br>
<br>
/* SMP and runqueue state */<br>
<br>
为多处理机定义的变量.<br>
<br>
int has_cpu;<br>
<br>
int processor;<br>
<br>
int last_processor;<br>
<br>
int lock_depth; <br>
<br>
/* Lock depth. We can context switch in and out of holding a syscall kernel lock... */ <br>
<br>
为了在进程树中排序, 定义的父子,兄弟指针<br>
<br>
struct task_struct *next_task, *prev_task;<br>
<br>
struct tas74k_struct *next_run, *prev_run;<br>
<br>
<br>
<br>
/* task state */<br>
<br>
定义可 task 运行的状态, 以及信号<br>
<br>
struct linux_binfmt *binfmt;<br>
<br>
int exit_code, exit_signal;<br>
<br>
int pdeath_signal; /* The signal sent when the parent dies */<br>
<br>
/* 定义可进程的用户号,用户组以及进程组*/<br>
<br>
unsigned long personality;<br>
<br>
int dumpable:1;<br>
<br>
int did_exec:1;<br>
<br>
pid_t pid;<br>
<br>
pid_t pgrp;<br>
<br>
pid_t tty_old_pgrp;<br>
<br>
pid_t session;<br>
<br>
/* boolean value for session group leader */<br>
<br>
是不是进程组的头文件<br>
<br>
int leader;<br>
<br>
/* <br>
<br>
* pointers to (original) parent process, youngest child, younger sibling,<br>
<br>
* older sibling, respectively. (p->father can be replaced with <br>
<br>
* p->p_pptr->pid)<br>
<br>
*/<br>
<br>
父子进程的一些指针<br>
<br>
struct task_struct *p_opptr, *p_pptr, *p_cptr, *p_ysptr, *p_osptr;<br>
<br>
<br>
<br>
/* PID hash table linkage. */<br>
<br>
在调度中用的一些hash 表<br>
<br>
struct task_struct *pidhash_next;<br>
<br>
struct task_struct **pidhash_pprev;<br>
<br>
<br>
<br>
/* Pointer to task[] array linkage. */<br>
<br>
struct task_struct **tarray_ptr;<br>
<br>
<br>
<br>
struct wait_queue *wait_chldexit; /* for wait4() 等待队列 */<br>
<br>
struct semaphore *vfork_sem; /* for vfork() */<br>
<br>
unsigned long policy, rt_priority;<br>
<br>
unsigned long it_real_value, it_prof_value, it_virt_value; <br>
<br>
进程的性质因为实时进程与普通进程的调度算法不一样所以应有变量区分<br>
<br>
下面是进程的一些时间信息<br>
<br>
unsigned long it_real_incr, it_prof_incr, it_virt_incr;<br>
<br>
struct timer_list real_timer;<br>
<br>
struct tms times;<br>
<br>
unsigned long start_time;<br>
<br>
long per_cpu_utime[NR_CPUS], per_cpu_stime[NR_CPUS];定义了时间片的大小<br>
<br>
/* mm fault and swap info: this can arguably be seen as either mm-specific or thread-specific */<br>
<br>
内存信息<br>
<br>
unsigned long min_flt, maj_flt, nswap, cmin_flt, cmaj_flt, cnswap;<br>
<br>
int swappable:1;<br>
<br>
/* process credentials */<br>
<br>
uid_t uid,euid,suid,fsuid;<br>
<br>
gid_t gid,egid,sgid,fsgid;<br>
<br>
int ngroups;<br>
<br>
gid_t groups[NGROUPS];<br>
<br>
kernel_cap_t cap_effective, cap_inheritable, cap_permitted;<br>
<br>
struct user_struct *user;<br>
<br>
以下英文注释很清楚<br>
<br>
/* limits */<br>
<br>
struct rlimit rlim[RLIM_NLIMITS];<br>
<br>
unsigned short used_math;<br>
<br>
char comm[16];<br>
<br>
/* file system info */<br>
<br>
int link_count;<br>
<br>
struct tty_struct *tty; /* NULL if no tty */<br>
<br>
/* ipc stuff */<br>
<br>
<br>
<br>
struct sem_undo *semundo;<br>
<br>
struct sem_queue *semsleeping;<br>
<br>
/* tss for this task */<br>
<br>
struct thread_struct tss;<br>
<br>
/* filesystem information */<br>
<br>
struct fs_struct *fs;<br>
<br>
/* open file information */<br>
<br>
struct files_struct *files;<br>
<br>
/* memory management info */<br>
<br>
struct mm_struct *mm;<br>
<br>
<br>
<br>
/* signal handlers */<br>
<br>
spinlock_t sigmask_lock; /* Protects signal and blocked */<br>
<br>
struct signal_struct *sig;<br>
<br>
sigset_t signal, blocked;<br>
<br>
struct signal_queue *sigqueue, **sigqueue_tail;<br>
<br>
unsigned long sas_ss_sp;<br>
<br>
size_t sas_ss_size;<br>
<br>
};<br>
<br>
在分析完 这个结构之后, 还有很多问题要想, 也许不能读 但框架要搞好.需要向的问题有以下几个<br>
<br>
1,在task_struct 中用的常量在那里定义呢, 如最大进程个数, 最多支持的cpu 个数,等等<br>
<br>
2,在调用fork() 时, 系统是分配一块内存 会是这样么<br>
<br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -