1. 程式人生 > >第一次作業:深入源碼分析xv6進程模型

第一次作業:深入源碼分析xv6進程模型

back one swa ould ping fff git number 中斷

1.進程

1.1 進程的概念

1) 狹義定義:進程是正在運行的程序的實例。

2) 廣義定義:進程是一個具有一定獨立功能的程序關於某個數據集合的一次運行活動。它是操作系統動態執行的基本單元,在傳統的操作系統中,進程既是基本的分配單元,也是基本的執行單元。

1.2 進程的組成

技術分享圖片

1.3 進程控制塊

技術分享圖片

引用來自:https://blog.csdn.net/hgnuxc_1993/article/details/54847732

2.操作系統如何組織進程

  • 在這裏把組織進程理解為管理和控制進程
  • 操作系統通過PCB來管理和控制進程,每個進程創建時,操作系統為其生成一個PCB,同時通過唯一的PID標註一個唯一進程,則可通過PCB了解該進程的狀態;當進程結束時,操作系統銷毀進程對應的PCB。  
  • xv6PCB結構, 見附錄


3.進程狀態如何轉換

技術分享圖片

4.進程是如何調度的

當前進程通過調用yield函數,進行進程切換。yield函數調用sched函數,sched函數啟動swtch函數完成進程切換。整個流程是這樣的:

yield => sched => swtch

sched是一個死循環,該循環不斷在進程表中掃描,選擇一個RUNNABLE的進程調度,即從scheduler切換器轉換到新選擇的進程

swatch函數任務:1. 保存當前(old)進程的上下文。 2. 加載新進程(new)的上下文到機器寄存器中。

參考網址:https://blog.csdn.net/Swartz2015/article/details/61615603

函數見附錄

5.談談自己對該操作系統進程模型的看法

在學習進程部分時,沒有註意該次作業要求,更側重機器上電到進程創建部分,實模式與保護模式等部分,對計算機的概況有了進一步了解,而沒有關註到進程的調度這塊,所以匆匆補充這塊知識,對調度方面沒有深刻的體會。

附上一些閱讀筆記,見附錄。

6.參考文獻

  • https://legacy.gitbook.com/book/th0ar/xv6-chinese/details
  • https://pdos.csail.mit.edu/6.828/2012/xv6/xv6-rev7.pdf
  • https://pdos.csail.mit.edu/6.828/2012/xv6/book-rev7.pdf

7.附錄

  • PCB結構

struct proc {

uint sz; // 進程的內存大小(以byte計)
pde_t* pgdir; // 進程頁路徑的線性地址。
char *kstack; // 進程的內核棧底
enum procstate state; // 進程狀態
volatile int pid; // 進程ID
struct proc *parent; // 父進程
struct trapframe *tf; // 當前系統調用的中斷幀
struct context *context; // 進程運行的入口
int killed; // 當非0時,表示已結束
struct file *ofile[NOFILE]; // 打開的文件列表
struct inode *cwd; // 進程當前路徑
char name[16]; // 進程名稱
};

  • void scheduler(void)

{

struct proc *p;

for(;;)

{

// Enable interrupts on this processor.

sti();

// Loop over process table looking for process to run.

acquire(&ptable.lock);

for(p = ptable.proc; p < &ptable.proc[NPROC]; p++)

{

if(p->state != RUNNABLE)

continue;

// Switch to chosen process. It is the process‘s job

// to release ptable.lock and then reacquire it

// before jumping back to us. proc = p;

switchuvm(p); p->state = RUNNING;

swtch(&cpu->scheduler, proc->context);

switchkvm(); // Process is done running for now.

// It should have changed its p->state before coming back.

proc = 0;

}

release(&ptable.lock);

}

}

  • swtch的函數代碼如下

技術分享圖片

技術分享圖片

技術分享圖片

第一次作業:深入源碼分析xv6進程模型