1. 程式人生 > >nachos下雙向量表的設計(含併發錯誤)1

nachos下雙向量表的設計(含併發錯誤)1

                  nachos下雙向量表的設計

一.           實驗目的

本次實驗的目的在於對nachos進行熟悉,並初步體驗nachos下的併發程式設計

二.           實驗內容

安裝nachos;

用C++實現雙向有序連結串列;

在nachos系統中使用你所寫的連結串列程式並演示一些併發錯誤

三.           實驗執行例項

一.           實驗相關步驟

  1. 實驗需要編寫三個相關檔案,它們是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個元素,具體實現如下:

  1. 完成程式碼編寫後需要在nachos-3.4/code/Makefile.common中新增相關路徑,在THREAD_H中加入dllist.h, 在THREAD_C中dllist.cc和dllist-driver.cc、THREAD_O中加入dllist.o和dllist-driver.o。
  2. 接著,在nachos-3.4/code/threads/下執行make depend和make命令。
  3. 另外,還要在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);

}
  1. 執行時在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環境不是特別熟悉,所以剛上手時有一定難度,但建立雙向連結串列的過程較為基礎。