试验一体验nachos下的并发程序设计.docx
- 文档编号:29916844
- 上传时间:2023-08-03
- 格式:DOCX
- 页数:15
- 大小:30.79KB
试验一体验nachos下的并发程序设计.docx
《试验一体验nachos下的并发程序设计.docx》由会员分享,可在线阅读,更多相关《试验一体验nachos下的并发程序设计.docx(15页珍藏版)》请在冰豆网上搜索。
试验一体验nachos下的并发程序设计
实验一体验nachos下的并发程序设计
实验目的
1.阅读nachos相关文档,加强自学能力;
2.对nachos进行熟悉,并初步体验在nachos下的并发程序设计
实验内容
用C++实现双向有序链表;
在nachos系统中使用你所写的链表程序并演示一些并发错误
三实验步骤
1.实验前阅读:
CODEMAKEFILE
CODEMAKEFILE.DEP
NACHOS3.4/
NACHOS3.4/
NACHOS3.4/CODEMAKEFILE.COMMON
NACHOS3.4/CODETHREADSMAKEFILE
初步了解各Makefile的构成和相互关系。
阅读NACHOS3.4/CODETHREADSMAIN.CC了解NACHOS如何开始。
DEBUG相关的部分及
阅读NACHOS3.4/CODETHREADSSYSTEMCC的INITIALIZE函数中与
NACHOS3.4/CODETHREADSUTILITY.CC了解DEBUG勺实现与使用,以此进一步熟悉NACHO系
统。
阅读NACHOS3.4/CODETHREADSTHREADTESTCC,了解NACHO沖线程的概念及其运作方式。
2.首先编写dllist.h,dllist.cc,dllist-driver.cc文件。
其中,dllist.h是定义双向链
表的头文件。
Dllist.cc是实现双向链表的基本功能。
而dllist-driver.cc中含有两个
函数,分别实现插入N个元素和删除N个元素。
3.将必要的链表文件拷贝到NACHOS3.4/CODETHREADS中,修改
NACHOS3.4/CODEMAKEFILE.COMMON^的THREAD_HTHREAD_CTHREAD_Q
T三=»./threads/copyright../threads/list.h
.匸hreads/dlllBt;.h
THREAD_C=・・/threads/main.cc
*»/threads/li^c.cc
../threads/dllisl:
.cc
.*/threads/dllist-driver*cc
THREADO=nkain.alis匸・□dllist.odllist-driver・d
[c30S38@6@c58threads]$makedepend
g++-I../threads-I../machine-DTHREADS-DHOST_i3S6-DCHANGED-H-./tlireads/inain*cc**/threads/list-cc.*/chreads/dllisc,cc.*/thread3/dllist-driver*cc*./chreads/scheduler-cc-Vchreada/synch,cc»,/threada/synchlistcc.»/threads/system.cc
../tlneads/ttireaci.cc../ttueada/urility.cc../threads/ttireadtest.cc../maciiine/interrupc.cc・”/machine/sysdep*ce・./machine/scats・uu.»/machine/timer.cc>makedep
echo'严*DONOTDELETETHISLINE/+2,5df>eddep
echo'$rmakedep1»eddep
echo'wr»eddep
ed-Makefil皀 ttqeddepmatedep echo・#DEPENDED亡工ESMUSTENDATENDOFFILE1»Makefileecho"#IFYOUPUTSTUFFHEREITWILLGOAWAY1»Makefileecho'*#seemakedependabove1»Makefile Lcs0a38fl€@es8threads]$[] [csQS38S6@cs8threads]$make g++-g-Wall-Wshadow-tiadltional-I../threads-I../machine-DCTHREADS-DHOST_i386-DCHANQED-c*・/^hre^df/main»cc g++irain.olist.odllist.odllist-driver.qscheduler.asyncli.osynctilist.□syst已m.ochxead.outilitychreadtestinterrupt□syadep,otimer.aswitch・o7nachos (cs0fl38fl6@cs8threads]$[] 在NACH033.4/CODE/THREADS/目录中依次执行MAKEDEPEND禾口MAKE 实现两个线程调用链表功能 Threadnum,Nodenum,Flagj? ] Thread_nini=N□de_nuiiL=: Flag;if(argc<} { printf{,rAr return; } Thread^uitt^acoi(argv[]};N□de_num=atoi(argv[J);Flag=atol(argv[]}; 5.修改NACHOS-3.4/CODE/THREADSTHREADTESTCC,在适当位置插入CURRENTTHREAD->YIELD() 调用以强制线程切换 DLLlstL; void SimpleThreadwhicii} < LisrInsert(Node_num,±Lrwhich};if(Flay—} {printf(currentThread->Yield{); 1 ListRemove(Nodenum,which}; 6.程序运行./nachos进程数插入节点数错误号' 0)./nachos220 无并发错误 [€3063886^058 threads]? ,/nachos220 Thread0: Insert: 4 Item: 139391304 TJiread0: Insert: 40 rhread0: Remove: 弓 It;em: 13939130^ 0: Remove: 40 Item: 139416040 Tinead1: Insert: 0 Item: 13541£00a rhread1: Insert: 30 It;eni: 139416aao rhread1: Remove: 0 Item: 139416000 Thiead1: Remove: 80 Item: 1354OSO NotBreadsreadyorrunnable> andnopendinginterrupts, kssumingthe programcompleted ^achxneh且1匸zng! 1)./nachos221 并发错误1: 线程0在插入2个元素后被线程1说抢占插入2个元素,然后线程0进行删除2咯元素的操作,而由于插入时时按照大小顺序插的,导致了线程0删除的不是自己 插入的2个元素 void SimpleThread(intwhich) { ListInsert(Node_num,&L,which); if(Flag==1) { printf("\tSimpleThreadInterrupt\n"); currentThread->Yield(); } ListRemove(Nodenum,&L,which); } (csO03886@cs0threads]$*/nachos221 Thread0: InsertHOItem: 1^8263240 Thread0: Insert: 76Item14BZS7976 SiinpLeThreadInterrupt Thread1: Insert: 16Item: 1^0280016 Thread1: Insert: 56Itemi140^86056 SimpleThreadInterrupt Thread0: Remove: 16Item: 1^8288016 Thread0: Remove: 40Item: 1^0^63240 Thread1: Remove: SfiItem: 148208056 Thread1: Remove: 76Item: 1^8287976 Nothreadsreadyorrunnable,andnopendincrinterrupts. AssuiLingtheprograincorcple匸皀d- Machinehalting! 2)./nachos222 并发错误2: 线程0插入1个元素后,被线程1抢占,线程1插入一个元素后,又被线程0抢占插入,直至两个线程完成插入过程。 由于插入时时按大小排序插入的,故导致,在删除时,两个线程没能正确的删除它们自己插入的元素 voidListInsert(intn,DLList*list,intt_num) void*item; intkey; for(inti=0;i! =n;i++) { item=newint(rand()); key=(int)item%100; printf("Thread%d: \tInsert: %d\tltem: %d\n",t_num,key,(int)item);list->Sortedlnsert(item,key); if(Flag==2) { printf("\tInsertInterrupt\n");currentThread->Yield(); } } } [C3083SB€@cs3threads1$»/nachos222 Thread 0: Insert: 44 Irem: 1408B«344 Insert Interrupt Thread 1: Insert: 80 Item: 14O9L10B0 Insert Interrupc Thread 0: Inserti68 Iremil4O861560 Insert Interrupt Thread 1: Insert: 0 Item: 14O0616OS Insert Interrupt Thread 0; Remove: 8 Item;140B6160B Thread 0: Remove: 44 Item: 140Ba€344 Thread. 1: Remove: 63 Item: 140861S68 Thread 1: Remove: 30 Item: HO9L1OB0 Nothreadsreadyorrunnable, andnopendinginEerrupts” AssuiEJ.ngrheprograiccompleted : halting! 3)./nachos223 并发错误3: 线程0插入2个元素后,删除完一个元素后被线程1抢占,线程1插入2 个元素后,删除完一个元素后,又被线程0抢占,此时线程0要完成剩下的删除。 由于 插入时按大小排序插入的,故导致,线程0在删除时没能删除正确的元素,而线程0删除一个元素后,又被线程1抢占。 这样交替删除。 两个线程没能正确的删除它们自己插 入的元素 voidListRemove(intn,DLList*list,intt_num) { void*item; intkey; inti=0; while(! (list->lsEmpty())&&i! =n) if((item=list->Remove(&key))) printf("Thread%d: \tRemove: %d\tltem: %d\n",t_num,key,(int)item); i++;if(Flag==3) { printf("\tRemoveInterrupt'n");currentThread->Yield(); } [qsO83386&csEthreadsJ$»/nachos223 Thread 0: Insert: 44 Itein: 156041544 Thread 0: Insert: 80 Item: 156066280 Thread 0: Remave: <€ Item: 156041544 Remove Interrupt Thread 1: Insert.: 20 Irem: 156066320 Thread 1: Insert: 36 Item: 156066336 Thread 1: Remove: 20 Itein: 156066320 Remove Interru.pt Thread 0: Remove: 36 Item: 156066336 Remove Interrupt Thread 1: Remove: 80 lTLem: 1560662aO Remove Intermpl; Nothreadsreadyorrumiatjle,andnopendinginterrup匸吕- Assumingtheprogramcompleted. Machine ? halting! 4)./nachos224 并发错误4: 在0号线程找到插入第二个元素的位置时,被线程1抢占,而同样当线程1找到第二个元素的的插入位置时,又被线程0抢占。 此时线程0完成第二个插入动作, 然后完成删除动作。 接着交给线程1完成剩余的动作。 此时线程1要完成原来的插入动作。 而由于,线程0清空了链表。 故此时造成线程1要插入的元素指针为悬垂指针,故 造成了段错误。 voidDLList: : Sortedlnsert(void*item,intsortKey) { DLLElement*element=newDLLElement(item,sortKey);if(IsEmpty()) { first=last=element; } else { if(first->key>sortKey) if(Flag==4) { printf("\tSortedlnserInterrupt\n");currentThread->Yield(); } element->next=first; first->prev=element; element->prev=NULL;first=element; } else { DLLElement*head=first;while(head->next! =NULL){ if(sortKey { if(Flag==4) { printf("\tSortedInserInterrupt\n");currentThread->Yield(); } element->next=head->next; element->prev=head; head->next->prev=element; head->next=element;return; } else head=head->next; } if(Flag==4) { printf("\tSortedInserInterrupt\n");currentThread->Yield(); } head->next=element;element->prev=head;element->next=NULL;last=last->next; (csO83BS6@C36 threadsJ$*/nachos 224 Thread 0: Insert: 0 Item: 1^4712008 Thread 0: Inseru: ^4 Item;144736744 SortedlnserInterrupt Thread 1: Insert: 84 工匸Em: 144736734 SortedlnserInterrupt Thread 0: Remove: 3 Item: 144712008 Thread 0: Remove: 44 Item: 14473^744 段堵逞 5)./nachos225 并发错误5: 当0线程找到要删除的节点时,被1线程抢占插入。 导致两个线程要删除 同一个节点,而0线程又已经把该节点删除,最终导致错误。 void*DLList: : SortedRemove(intsortKey) { if(lsEmpty())returnNULL; /*if(first->key==sortKey) { DLLElement*rm=first; void*thing=first->item; first=first->next; first->prev=NULL; deleterm; returnthing; } else {*/ DLLElement*head1=first; DLLElement*head2=first; while((head1! =NULL)&&(head1->key! =sortKey)){ head2=head1;head1=head1->next; } if(Flag==5) { printf("\tSortedRemoveInterrupt'n"); currentThread->Yield(); (C3O83B660C35thready]$./nachog225 Thread Tliread Item: 1616^4872Item: 161669€0E C: Insert: 72 0: insert: 8 Sort皀已只电mcrv已Intirrupt 1: Insert: 48 1: Insert: 8S SortecLReniQveInterrupt C: Remove: 8 5orteclReniQveInterrupt ***glibcdetected***./nachos: doublefreeor Thread Thread Thread Item: 1616€964E Item: 161669668 Icem: 161669608 corruption(fasttop};Cx09a2elf9 =Backtrace;== /lib/libc.so.E[Dx4a51e0] /lito/litoc.3o・6(_iibc_free+0x77>[0x^a572b] /usr/lib/libstdc++.so.6{_2dlPv+0x21}[0x6bd0a9]./nachog[Dx30495ilb] ./nachaa[0x804962d] ./nachos[Ox8O490fe] ・/nachos[0xfl04a«34] ./nachos|[0x804cl78] ・/nachos[0x804cl70] ===Memorymap: 0a04e000-0e04f000 iwxp OOOOSDOO 0fl: 01 14451955 [vdso] /lib/ld-2.3.6.3O /lib/ld-2.3,6.so /lib/ld-2.3,6.吕。 /lib/libc-2.3.€.aa/lib/libc^2,3/lit)/libc-2,3.6.so /lib/libni-2.3.€,so /lib/iihiL-2.3.€.so /lib/libm-2.3.€*so /lii)/libgcc_s-4.0.2-20051126.so /li±)/libgcc_3-4.0.2-20051126.so /usr/lib/1j_t>3tdc-F+.so.6.0.7/U3r/lib/lib3tdc++・曰o*E+O・7 /hcir.e/csOfl/csOSSBfle/nacliDs/nacli/hame/csOfl/cs083B&€/naclios/riacii 四•实验感想 1通过两个礼拜的对Nachos的自主学习和资料的寻找,大致了解了整个实验的体系和平台, 熟悉了nachos的安装和相关原理; 2、参照老师提供的实验 文件夹中的makefile 3、在编写链表的代码时,运行;这让我们意识到 4、实验分工: ppt上所提供的实验步骤做下来,大致能理解本次实验中的code 等文件的功能,并运用了makedepend和make命令; 由于在c++语言上仍有不足,故出现的冋题较多,最后成功编译 C++是要补的; 1、实验平台和背景各自了解,并讨论本次实验的重点和难点,之后进行分工; 2、3886任智宇负责了用C++实现双向有序链表的部分;任智宇与3890邵海东共同完成 了在nachos系统中调试和使用所写的链表程序;其中过程中出现了部分的错误一同解决。 其中重新编译threads子系统过程中出现的多种情形较为复杂。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 试验 体验 nachos 并发 程序设计