剛開始學習MINIX3,把學到的一些東西寫下來,留作筆記。
MINIX3的內核文件中的/kernel/proc.h中定義了proc結構體:
/*進程結構體*/
struct proc {
struct stackframe_s p_reg; /* process' registers saved in stack frame */
reg_t p_ldt_sel; /* selector in gdt with ldt base and limit */
struct segdesc_s p_ldt[2+NR_REMOTE_SEGS]; /* CS, DS and remote segments */
proc_nr_t p_nr; /* number of this process (for fast access) */
struct priv *p_priv; /* system privileges structure */
char p_rts_flags; /* SENDING, RECEIVING, etc. */
char p_priority; /* current scheduling priority */
char p_max_priority; /* maximum scheduling priority */
char p_ticks_left; /* number of scheduling ticks left */
char p_quantum_size; /* quantum size in ticks */
struct mem_map p_memmap[NR_LOCAL_SEGS]; /* memory map (T, D, S) */
clock_t p_user_time; /* user time in ticks */
clock_t p_sys_time; /* sys time in ticks */
struct proc *p_nextready; /* pointer to next ready process 指向下一個ready狀態的進程 */
struct proc *p_caller_q; /* head of list of procs wishing to send 待接收消息進程隊列*/
struct proc *p_q_link; /* link to next proc wishing to send */
message *p_messbuf; /* pointer to passed message buffer */
proc_nr_t p_getfrom; /* from whom does process want to receive? 該進程希望從哪個進程獲得消息?*/
proc_nr_t p_sendto; /* to whom does process want to send? 該進程希望向哪個進程發送消息?*/
sigset_t p_pending; /* bit map for pending kernel signals */
char p_name[P_NAME_LEN]; /* name of the process, including \0 */
};
其中,值得注意的是:
1、進程優先級:p_priority。它反映的是該進程當前的優先級,但是隨着進程不斷的調度,優先級是會有變化的,而p_max_priority就是該進程所能達到的最高優先級。優先級的大小與初始狀態、進程類型、調度算法有關。
2、發送給自己消息的進程隊列隊頭:p_caller_q。
3、p_q_link是指當該進程自己給其他進程發消息時,若自己處在其他進程的消息隊列時,它所指向的下一個隊列成員。