?? fanyi .txt
字號:
3.1 實驗一 并發進程間的沖突
這個實驗由兩部分組成。第一部分,用C++寫一個程序,實現對一個具有優先級排序的雙向鏈表進行創建,添加結點,移動結點。然后用這段程序去熟悉NACHOS,熟悉一個工作線程的的代碼。在隨后的實驗中,你要用到這個線程。但是現在,你僅僅用它提供的體驗并發進程的樂趣即可。
class DLLElement {
public:
DLLElement( void *itemPtr, int sortKey ); // initialize a list element,構造函數
DLLElement *next; // next element on list,and NULL if this is the last
DLLElement *prev; // previous element on list,and NULL if this is the first
int key; // priority, for a sorted list
void *item; // pointer to item on the list
};
class DLList {
public:
DLList(); // initialize the list
~DLList(); // de-allocate the list
void Prepend(void *item); // add to head of list (set key = min_key-1)
void Append(void *item); // add to tail of list (set key = max_key+1)
void *Remove(int *keyPtr); // remove from head of list
// set *keyPtr to key of the removed item
// return item (or NULL if list is empty)
bool IsEmpty(); // return true if list does't have elements
void SortedInsert(void *item, int sortKey);// routines to put/get items on/off list in order (sorted by key)
void *SortedRemove(int sortKey); // remove the first item with key==sortKey
// return NULL if no such item exists
private:
DLLElement *first; // head of the list, NULL if empty
DLLElement *last; // last element of the list, NULL if empty
};
3.1.1 具有優先級的排序雙向鏈表
這個雙向鏈表根據一個整數key對items進行排序(插入操作不會帶入關鍵字變量,它分配關鍵字的值是一致的)。你的代碼將包含于三個文件中:dllist.h, dllist.cc, dllist-driver.cc. 前兩個文件應該提供上面兩個類的定義和完備。第三個文件包括兩個函數:第一個用任意整數關鍵字形成N個items(or to aid debugging,你能控制輸入順序,就可以形成一個認真選擇的關鍵字順序)然后,把它們插入到一個雙向鏈表;第二個函數從鏈表開始移動N個items,然后將這幾個items打印出來到控制臺上。兩個函數都應把整數N和指向列表的指針當作參數。
為了證實你確實正確地寫好類和驅動函數,建立一個單獨的文件包括你程序的主函數。在這個主函數中,首先分配一個列表,然后調用上面的驅動函數,進行正確的傳參。你所需證實的是你的移動函數能正確移動你按順序插入的items。你也需做其他測試證實你的實現完成了一個雙向鏈表。
即使你能在任何平臺上寫出,編譯,運行上面的程序,我還是希望你能將它發展到Solaris SPARC平臺或是Linux/x86 平臺,用gcc來確定你的程序能在這個實驗的下個部分和Nachos相互作用。
3.1.2 熟悉Nachos并明白它的線程系統
在實驗的第二個部分,你需要明白Nachos線程系統是如何工作的(它的功能將擴展到隨后的實驗中)。一般,Nachos線程基元只是用在Nachos操作系統內核的內部,不直接被程序實用;事實上,這些基元和現實操作系統內核中管理過程的內部基元相似。然而,為了明白他們是如何工作的,在這個實驗和實驗三中,我們將用線程基元直接運行簡單的并發程序,在Unix (Solaris)的應用中 。如果你發現你很迷惑,不要擔心。
用make命令構建一個可執行的Nachos。運行make(不帶參數)在代碼目錄下;這個可執行Nachos儲存在thread的子目錄下。一旦你處于這個線程子目錄,你就可以運行一個簡單的Nachos測試,通過輸入nachos命令(if that doesn't work, try ./nachos ).
如果你測試threads/main.cc,你會發現你正在threadtest.cc 中執行函數ThreadTest。ThreadTest是并行程序的一個簡單的例子。在這種情形下,兩個獨立的線程可以同時控制執行和并在一個過程中獲得同樣的數據。你的第一個目標就是通過這個程序理解線程基元,然后做一些試驗幫你理解運行時多個線程間發生了什么。為了理解執行路徑,通過追蹤用于測試的簡單情況即可。閱讀2.2 Tracing(追蹤) and Debugging Nachos Programs。
你的下個目標是,在運行時,用各種并發代碼能打亂給定的未確定的線程執行順序。通過揭露一些陷阱,當你期望他們時,他們更不可能出人意料地咬到你當你認為你的代碼是正確的,在這個學期末時。這個實驗要創建你自己的ThreadTest變體,由T線程開始存取一個特別具有共享的數據結構:在這個實驗的第一部分你完成的異步優先排序的雙向鏈表。通過異步,我們的意思是你的ThreadTest和列表完成不需要使用信號燈,互斥 ,中斷禁用,或其他同步機制,你將了解它們在學期末。這些機制在于阻止一些問題(你在這個實驗中會猜想和經歷)
test program完成后,確認和舉例出各種不正確或是不期望的動作。在你的記錄中,你要向大家展現一些執行時的特殊交錯。
modify 修改 interleavings 交錯 illustrate 舉例說明 analogous 類似的 enumerate 枚舉
outline 描述要點 thorough 徹底的,完全的 exhaustive 無遺漏的 substantially 實質上,本質上
2 working with Nachos
make sense to 講得通,理解 browse 瀏覽
2.1 Installing and Building Nachos
demo 呈現,展示 submit 遞交,呈送 idiot 白癡 whereas 然而
2.2 Tracing(跟蹤) and Debugging(調試) Nachos Programs
3種追蹤的方法:1.printf or fprintf 2. 選擇一些調試器:gdb等 3.把Nachos提供的calls插入到debug功能中
invest 花費,投資 synchronously 同步地,同時地 buffers 設置系統的磁盤緩存塊數
character 字符 peek 偷看
2.3 Controlling the Order of Execution in Nachos
concurrent 并發的 interleaving 交錯 multiprocessor 多處理機 arbitrarily 任意的
uniprocessor-based 單處理機 context switches 上下文切換 exhaustively 用盡一切地
explicitly 明白地,明確地 hog 獨占 simulated 模擬的 specified指定的
main.cc
bootstrap code 引導程序代碼
atoi 功能:把字符串轉換成整型數
ASSERT(argc > 1) 確定(argc > 1),否則跳出
Flag == 5 printf("\tRemove interrupt!\n");
3 SortedInsert interrupt!
4 SortedRemove interrupt!
1 Begin interrupt!
2 End interrupt!
6 SimpleThread interrupt!
if( Flag == 1 && rand() % 2 == 0 )
{
printf("\tBegin interrupt!\n");
currentThread->Yield();
}
currentThread->Yield()調用以強制線程切換(注意相應文件中應該包含對外部變量currentThread的聲明并include thread.h),
for( i = 1; i < Thread_num; i++ )
{
Thread *t = new Thread("forked thread");
t->Fork(SimpleThread, i);
}
SimpleThread(0);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -