姬夢馨node
原創博客linux
《Linux內核分析》MOOC課程http://mooc.study.163.com/course/USTC-1000029000c#
1.操做系統的三大管理功能包括:進程管理、
內存管理、
文件系統。
bash
2.PCB task_struct中包含:進程狀態、
進程打開的文件、
進程優先級信息
。
dom
3: 進程的狀態不一樣於操做系統函數
一個即在的進程調用fork建立一個新的進程。 進程被高優先級搶佔。 do_exit 進程退出。 事件發生或資源可用,可被喚醒進入隊列。 TASK_RUNNING具體是就緒仍是執行,要看系統當前的資源分配狀況
4.函數的分析與理解ui
struct task_struct { :運行狀態
volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */ void *stack; :內核堆棧;進程運行堆棧. atomic_t usage; unsigned int flags; :進程標識符 unsigned int ptrace; #ifdef CONFIG_SMP :條件編譯,多處理器 struct llist_node wake_entry; int on_cpu; struct task_struct *last_wakee; unsigned long wakee_flips; unsigned long wakee_flip_decay_ts; int wake_cpu; #endif
struct list_head tasks; 雙向進程鏈表 #ifdef CONFIG_SMP struct plist_node pushable_tasks; struct rb_node pushable_dl_tasks; #endif struct mm_struct *mm, *active_mm; 地址空間 #ifdef CONFIG_COMPAT_BRK unsigned brk_randomized:1; #endif
struct task_struct __rcu *parent; /* recipient of SIGCHLD, wait4() reports
/* 進程父子關係
* children/sibling forms the list of my natural children
*/
struct list_head children; /* list of my children */
struct list_head sibling; /* linkage in my parent's children list */
struct task_struct *group_leader; /* threadgroup leader */
/* CPU-specific state of this task */ CPU相關狀態,進程切換 struct thread_struct thread /* filesystem information */ 文件相關,打開描述列表 struct fs_struct *fs; /* open file information */ struct files_struct *files; /* namespaces */ 調用 struct nsproxy *nsproxy; /* signal handlers */ 信號處理 struct signal_struct *signal; struct sighand_struct *sighand;
1. forkthis
fork系統調用在父進程和子進程各返回一次 子進程中返回的是0,父進程中返回值是子進程的pid。
2. 建立一個新進程在內核中的執行過程atom
fork、vfork和clone三個系統調用均可以建立一個新進程,並且都是經過調用do_fork來實現進程的建立。
建立新進程是經過複製當前進程實現的。 do_fork主要是複製了父進程的task_struct,獲得子進程.
do_fork()
copy_process
,將當前進程複製一份出來給子進程,而且爲子進程設置相應地上下文信息。wake_up_new_task
,將子進程放入調度器的隊列中,此時的子進程就能夠被調度進程選中運行。要修改複製過來的進程數據,好比pid、進程鏈表等。
3. 子進程系統調用處理過程spa
fork出來的子進程是從ret_from_fork
開始執行的,而後跳轉到syscall_exit
,從系統調用中返回。
2.gdb調試fork命令 : qemu -kernel linux-3.18.6
停在了父進程
Linux經過複製父進程來建立一個新進程,經過調用do_ fork來實現併爲每一個新建立的進程動態地分配一個task_ struct結構。
子進程是從ret_ from_ fork開始執行的。