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环境不是特别熟悉,所以刚上手时有一定难度,但建立双向链表的过程较为基础。