nachos下雙向量表的設計(含併發錯誤)1
nachos下雙向量表的設計
一. 實驗目的
本次實驗的目的在於對nachos進行熟悉,並初步體驗nachos下的併發程式設計。
二. 實驗內容
安裝nachos;
用C++實現雙向有序連結串列;
在nachos系統中使用你所寫的連結串列程式並演示一些併發錯誤
三. 實驗執行例項
一. 實驗相關步驟
- 實驗需要編寫三個相關檔案,它們是dllist.h、dllist.cc、dllist-driver.cc,在dllist.h定義了雙向連結串列,即定義了兩個類,element和dllist,其具體程式碼如下:
class element { public: int key; element *prev; element *next; element(int this_key); element(); ~element(); }; class dllist { public: dllist(); ~dllist(); dllist(int key); element *head; element *end; void sortedinsert(int key); void sortedremove(); void remove(int this_key);void printfN(); };
void dllist::sortedremove() {//刪除連結串列中的第一個資料直到沒有資料了。 element *temp=NULL; element *temp_next=NULL; // printf("aa\n"); if(head->next!=NULL&&head->next->key!=101) // if(head->next!=NULL) { // printf("bb\n");if( head->next->next!=NULL) { temp=head->next; temp_next=temp->next; printf("%d\n",temp->key); // printf("gg\n"); free(temp); // printf("hh\n"); if(flag!=6&&flag!=7) head->next=NULL; if(flag==5||flag==6||flag==7) { printf("five-interrupt\n"); currentThread->Yield(); } head->next=temp_next; temp_next->prev=head; } else{ temp=head->next; printf("%d\n",temp->key); // printf("ii\n"); free(temp); // printf("jj\n"); if(flag==5||flag==6) { printf("five-interrupt\n"); currentThread->Yield(); } // printf("jj\n"); head->next=NULL; } } else if(head->next==NULL) printf("\n連結串列已經沒有資料\n"); // printf("ee\n":); temp=head; // printf("a"); /* while(temp->next!=NULL) { printf("%d\n",temp->key); temp=temp->next; } printf("%d\n",temp->key); printf("b");*/ }
dllist.cc中實現了雙向連結串列的相關功能,包括element的建構函式、解構函式以及dllist的建構函式、解構函式和sortedinsert()、printfN()、sortedremove()、remove()等。而在dllist-driver.cc中實現了插入N個元素和刪除N個元素,具體實現如下:
- 完成程式碼編寫後需要在nachos-3.4/code/Makefile.common中新增相關路徑,在THREAD_H中加入dllist.h, 在THREAD_C中dllist.cc和dllist-driver.cc、THREAD_O中加入dllist.o和dllist-driver.o。
- 接著,在nachos-3.4/code/threads/下執行make depend和make命令。
- 另外,還要在threadtest.cc檔案中修改相關程式碼,具體如下:
void ThreadTest1() { DEBUG('t', "Entering ThreadTest1"); for(int i=0;i< Thread_num;i++) //Thread_num個執行緒做插入和刪除//N個元素的工作 { Thread *t = new Thread("forked thread"); t->Fork(SimpleThread,i); }
- 執行時在nachos-3.4/code/threads/下輸入./nachos Thread_num Node_num Flag,其中引數分別為執行緒數,節點數,錯誤標誌,當錯誤標誌位0是代表正常情況。
二.說明
此次實驗通過對併發執行緒的設計對雙向連結串列的操作,更清晰地瞭解執行緒間的執行情況。還通過多執行緒對雙向連結串列操作所產生錯誤的演示,加強了我們執行緒工作原理的認識。
此外,多執行緒對雙向連結串列的操作所產生的錯誤,主要有如下幾種,當錯誤標誌為1 時,會發生如下所述錯誤:執行緒0在插入N個元素後被執行緒1說搶佔插入N個元素,然後執行緒0進行刪除N咯元素的操作,而由於插入時時按照大小順序插的,導致了執行緒0刪除的不是自己插入的N個元素。
當錯誤標誌位2時,有如下錯誤:執行緒0插入1個元素後,被執行緒1搶佔,執行緒1插入一個元素後,又被執行緒0搶佔插入,直至兩個執行緒完成插入過程。由於插入時時按大小排序插入的,故導致,在刪除時,兩個執行緒沒能正確的刪除它們自己插入的元素。
本次實驗作為作業系統本學期的第一次實驗,由於對nachos環境不是特別熟悉,所以剛上手時有一定難度,但建立雙向連結串列的過程較為基礎。