20135302魏静静——linux课程第六周实验及总结
生活随笔
收集整理的這篇文章主要介紹了
20135302魏静静——linux课程第六周实验及总结
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
linux課程第六周實驗及總結
實驗及學習總結
1.進程描述符task_struct數據結構?
- 進程的作用:
將信號、進程間通信、內存管理和文件系統聯系起來
- 操作系統的三大功能:
進程管理、內存管理、文件系統
-
內核通過唯一的進程標識PID來區別每個進程
- Linux為每個進程分配一個8KB大小的內存區域,用于存放該進程兩個不同的數據結構:Thread_info和進程的內核堆棧
-
task_struct結構的大體框架:
- 進程描述符中的state域描述了進程的當前狀態:
- task_running
- task_interruprtion
- task_uninterruption
- task_traced
- task_stopped
2.進程的創建
fork、vfork和clone三個系統調用都可以創建一個新進程,而且都是通過調用do_fork來實現進程的創建1號進程是所有用戶態進程的祖先,0號進程是所有內核線程的祖先
-
進程的創建大致步驟:
- 調用dup_task_struct()為新進程分配內核棧,task_struct等,其中的內容與父進程相同。
- check新進程(進程數目是否超出上限等)
- 清理新進程的信息(比如PID置0等),使之與父進程區別開。
- 新進程狀態置為 TASK_UNINTERRUPTIBLE
- 更新task_struct的flags成員。
- 調用alloc_pid()為新進程分配一個有效的PID
- 根據clone()的參數標志,拷貝或共享相應的信息
- 做一些掃尾工作并返回新進程指針
-
從堆棧來看:
???????????
-
?那么上圖中的schedule_tuil做了什么呢?我們可以從實驗中看到:
???????
-
創建一個新進程在內核中的執行過程
- 復制一個PCB——task_struct,見copy_process內部
-
err?=?arch_dup_task_struct(tsk,?orig);
-
-
給新進程分配一個新的內核堆棧
-
ti?=?alloc_thread_info_node(tsk,?node);
-
tsk->stack?=?ti;
-
setup_thread_stack(tsk,?orig);?//這里只是復制thread_info,而非復制內核堆棧。
-
-
從用戶態的代碼看fork():函數返回了兩次,即在父子進程中各返回一次
- *childregs?=?*current_pt_regs();?//復制內核堆
- childregs->ax?=?0;?//為什么子進程的fork返回0,這里就是原因!
- p->thread.sp?=?(unsigned?long)?childregs;?//調度到子進程時的內核棧頂
- p->thread.ip?=?(unsigned?long)?ret_from_fork;?//調度到子進程時的第一條指令地址
?
轉載于:https://www.cnblogs.com/20135302wei/p/5329518.html
總結
以上是生活随笔為你收集整理的20135302魏静静——linux课程第六周实验及总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IE edge是怎么了??
- 下一篇: Oracle Quality --- S