nachos下双向量表的设计(含并发错误)1
来源:互联网 发布:js调用android摄像头 编辑:程序博客网 时间:2024/05/16 12:29
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文件中修改相关代码,具体如下:
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);}
- 运行时在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环境不是特别熟悉,所以刚上手时有一定难度,但建立双向链表的过程较为基础。
- nachos下双向量表的设计(含并发错误)1
- nachos下双向量表的设计(通过锁机制排除1的错误)2
- nachos下双向量表的设计(通过锁机制排除1的错误)2
- nachos操作系统学习(1)在windows下向eclipse导入nachos源代码
- 5-1 设计三角形周长和面积的类(含错误)
- 关于stm32(cotex-m3)向量表初始化的总结笔记(含一个未解决问题)
- 高并发下的系统设计(偏数据库设计)
- nachos下的线程编程3 电梯的实现
- Ubuntu下安装Nachos所需要的MIPS交叉编译器
- 【nachos】山东大学操作系统课设实验nachos系统(1):线程初探
- 设计高并发下的读服务?
- nachos的测试
- 基于TCP的Socket文件双向传输(可并发)
- Nachos 课程设计task1.1
- Nachos指南(一)
- 新总账功能(二)-新总账下的现金流量表实现
- (含头指针以及尾指针)循环双向链表各类功能的实现
- STM32L4xx下bootloader重设中断向量表的一个问题
- 编制模拟“五个哲学家”问题的线程实现(unix操作系统系)---6
- UDP通信之网络打洞【转】
- unix命令行的个人心得
- asterisk chan_sip.c代码分析(转…
- 向前走
- nachos下双向量表的设计(含并发错误)1
- nachos下双向量表的设计(通过锁机制排除1的错误)2
- nachos下的线程编程3 电梯的实现
- 锁,信号量,条件变量-unix课程的个人体会
- 可变参数宏__VA_ARGS__(转载)
- 改造nachos内核以支持多道程序4(转)
- 弯曲评论
- 嵌入式编程资源
- JSONObject与JSONArray的使用