本次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 互斥體的使用。互斥體用於保護共享的易變 也就是全域性或靜態資料。這樣的資料必須通過互斥體進行保護,以防止它們在多個執行緒...