nachos下双向量表的设计(含并发错误)1

来源:互联网 发布:js调用android摄像头 编辑:程序博客网 时间:2024/05/16 12:29

                  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文件中修改相关代码,具体如下:
voidThreadTest1(){    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环境不是特别熟悉,所以刚上手时有一定难度,但建立双向链表的过程较为基础。