nachos lab1 執行緒機制

2021-07-15 22:11:49 字數 4006 閱讀 1872

本次lab的主要內容是拓展nachos的執行緒機制,在nachos的執行緒模型中新增tid和uid,並新增相應的管理機制。

本次lab的重要知識點在於對nachos中線程具體實現方式的理解,

exercise 1 –> y

exercise 2 –> y

exercise 3 –> y

exercise 4 –> y

調研linux或windows中程序控制塊(pcb)的基本實現方式,理解與nachos的異同。

linux中的pcb包含以下的內容

pid特徵資訊

程序狀態

優先順序通訊狀態

現場保護區

資源需求、分配控制資訊

程序實體資訊

其他(工作單位、工作區、檔案資訊)

nachos中的pcb實現

pcb的實現thread.h中,其中僅包含以下資訊:

stacktop and stack, 表示當前程序所佔的棧頂和棧底

machinestate, 保留未在cpu上執行的程序的暫存器狀態

status, 表示當前程序的狀態

仔細閱讀下列源**,理解nachos現有的執行緒機制

1. code/threads/main.cc和code/threads/threadtest.cc

2. code/threads/thread.h和code/threads/thread.cc

thread.cc中實現了thread類的一系列成員函式,包含如下幾種:

thread();//thread的建構函式

~thread();//thread的析構函式

chechoverflow();//檢查執行緒的棧是否溢位

finsh();//當fork執行結束後由threadroot呼叫,呼叫sleep,並準備將當前程序銷毀

yield();//如果有其他程序在等待,則讓當前程序下cpu

sleep();//當前程序由於被阻塞而下cpu

......

threadtest.cc是乙個簡單的執行緒除錯程式,在main中呼叫threadtest()函式,並完成一些可自定義的測試方法。

增加「使用者id、執行緒id」兩個資料成員,並在nachos現有的執行緒管理機制中增加對這兩個資料成員的維護機制。

思路

維護乙個標識陣列tid_flag,用以表明當前flag是否被分配,每次建立程序時去表中找到第乙個未被分配的tid,將其分配給這個陣列。當刪除乙個程序時,則將程序對應的tid_flag置為0

新增資料

thread.h中,對thread類新增以下內容:

private:

int tid;

int uid;

public:

int gettid()

int getuid()

資料成員的維護機制

system.h中,宣告外部變數:

extern int tid_flag[128];
同時在system.cc中宣告變數, 並在initialize()中對變數進行初始化:

//變數宣告

int tid_flag[128];

//in initialize()

for(int i = 0;i < 128; ++i)

更改thread::thread(char* threadname):

thread::thread(char* threadname)

}

#ifdef user_program

space = null;

#endif

printf("thread %d created!\n", this->tid);

}

更改thread::~thread():

thread::~thread()

在nachos中增加對執行緒數量的限制,使得nachos中最多能夠同時存在128個執行緒;

仿照linux中ps命令,增加乙個功能ts(threads status),能夠顯示當前系統中所有執行緒的資訊和狀態。

思路

在thread中新增static thread* getinstance(char* threadname)方法,每次建立新的thread時首先呼叫該方法,若當前程序數未超過限制,則正常建立,並返回新建立指標的指標,否則,提示出錯,返回null

對於ts(),維護tid_flag陣列時維護乙個thread* tid_pointer[128]的陣列,該陣列初始化為null,儲存tid對應的thread的指標,在ts中,通過指標得到thread的對應資訊

新增變數threadnum

記錄當前的執行緒數,定義類似於tid_flag,故不贅述

更改thread::thread()屬相

thread::thread()由public改為private

新增thread::getinstance()方法

thread* thread::getinstance(char* threadname)else

}

ts函式
//ts, print the thread status

void ts()

}printf("-------------------------------------\n");

}

最大執行緒數

testnum = 130

threadtest()中迴圈呼叫testnum次threadtest1()

ts函式

threadtest()最後呼叫

我遇到了以下兩個問題:

1. uid的管理機制

在向thread類中新增了uid後,我並不清楚應該怎麼獲得userid,所以並不知道uid的初始化應該如何完成

解決方法:

通過和同學討論,我們一致認為當前的lab並不涉及使用者程序,所有程序都是跑在核心態,故並不需要對userid程序分析,可以在初始化時將uid設定乙個預設值

2. 最大程序數的實現

我一開始並不明確應該用什麼方法實現這個功能,所以做了一些嘗試。

我最初的實現方法是在thread::thread(char* threadname)中判定當前是否有可分配的tid,若有則正常分配,否則將其tid設為預設值128,在對執行緒程序**時根據tid判定,若為128則將其**

但是後來思考發現,可以通過getinstance的方式,首先判斷條件,然後再根據情況返回指向thread的指標或者null。

其實我最終的實現方法有個問題,因為並不能呼叫thread::thread()新建乙個程序,給人感覺並不直觀,甚至有點奇怪。而且我不確定這種方式對後續的lab是否有影響。

通過這次lab,我覺得我最大的收穫在於對nachos的執行緒機制以及對作業系統內部程序的管理機制的理解更加深刻。

暫無[1] andrew s. tanenbaum著.陳向群 馬洪兵 譯 .現代作業系統[m].北京:機械工業出版社,2011:47-95.

[2] nachos doc:

Windows執行機理 執行緒的機制 1

1.執行緒的工作方式執行緒是 windows 95 的新特徵,乙個執行緒就是乙個執行程式的事例。執行緒允許乙個程式同時在多於乙個以上的地方執行,這有些像多個 cpu,每乙個 cpu執行程式的一部分。在單處理器系統中 window 95 只支援單處理器系統 只有同時處理時才出現執行緒。windows ...

ACE執行緒管理機制 併發控制 1

ace lock類屬 鎖類屬包含的類包裝簡單的鎖定機制,比如互斥體 訊號量 讀 寫互斥體和令牌等。這裡我就以互斥體為例簡單的介紹一下其使用方法,對其它的鎖類進行一些簡單的說明。1 互斥體的使用。互斥體用於保護共享的易變 也就是全域性或靜態資料。這樣的資料必須通過互斥體進行保護,以防止它們在多個執行緒...

ACE執行緒管理機制 併發控制 1

ace lock類屬 鎖類屬包含的類包裝簡單的鎖定機制,比如互斥體 訊號量 讀 寫互斥體和令牌等。這裡我就以互斥體為例簡單的介紹一下其使用方法,對其它的鎖類進行一些簡單的說明。1 互斥體的使用。互斥體用於保護共享的易變 也就是全域性或靜態資料。這樣的資料必須通過互斥體進行保護,以防止它們在多個執行緒...