版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
《操作系统原理》
实验报告班级: 姓名: 学号: 指导老师: 目录:实验题目:实验一线程创建与撤销 错误!未定义书签实验题目:实验二线程同步 错误!未定义书签实验题目:实验三线程互斥 错误!未定义书签实验题目:实验四进程通信 错误!未定义书签实验题目:实验五读者-写者问题 错误!未定义书签实验题目:实验六进程调度 错误!未定义书签实验题目:实验七存储管理之动态链接库 错误!未定义书签实验题目:实验八存储管理之内存分配 错误!未定义书签实验题目:实验九存储管理之页面置换算法 错误!未定义书签实验题目:实验十设备管理 错误!未定义书签实验题目:实验十一文件管理之文件读写 错误!未定义书签实验题目:实验一线程创建与撤销完成人:XXX报告日期:2018年3月31日一、实验内容简要描述(1)熟悉VC++VisualStudio开发环境。(2)使用相关函数创建和撤销线程。(3)在一个进程中创建3个线程,名字分别为threada、threadb、threadc。threada输出“helloworld!threadb输出“Mynameis。threadc输出“Pleasewait…”,然后sleep5秒钟,接着输出“Iwakeup”。二、 程序设计1、设计思路该函数创建一个在调用进程的地址空间中执行的线程。2、主要数据结构HANDLECreateThread(LPSECURITY_ATTRIBUTESIpThreadAttributes,DWORDdwStackSize,LPTHREAD_START_ROUTINEIpStartAddress,LPVOIDlpParameter,DWORDdwCreationFlags,LPDWORDlpThreadId);VOIDExitThread(DWORDdwExitCode);VOIDSleep(DWORDdwMilliseconds);VOIDSleep(DWORDdwMilliseconds);三、实验结果1、基本数据lpThreadAttributes:指向一个SECURITY_ATTRIBUTES勾,该结构决定了返回的句柄是否可被子进程继承。若lpThreadAttributes为NULL则句柄不能被继承。在WindowsNT^该结构的lpSecuhtyDescriptor 成员定义了新进程的安全性描述符。若lpThreadAttributes为NULL则线程获得一个默认的安全性描述符。dwStackSize:定义原始堆栈提交时的大小(按字节计)。系统将该值舍入为最近的页。若该值为0,或小于默认时提交的大小,默认情况是使用与调用线程同样的大小。更多的信息,请看ThreadStackSize。IpStartAddress:指向一个LPTHREAD_START_ROUTlNE的应用定义的函数,该线程执行此函数。该指针还表示溃程进程中线程的起始地址。该函数必须存在于远程进程中。IpParameter:定义一个传递给该迸程的32位值。dwCreationFIags:定义控制进程仓U建的附力口标志。若定义了CREATE_SUSPENDED标志,线程创建时处于挂起状态,并且直到ResumeThread®数调用时d能运行。若该值为0,则该线程在创建后立即执行。lpThreadId:指向一个32位值,它接收该线程的标识符。2.源程序代码行数完成该实验投入的时间(小时数)与其他同学讨论次数31113、测试结果分析口百格动磁星\i乍,提作案统解殂bin\Debug\testexeflellaWorld!我的专字:孙婷我的孚号114134820?Pleasewait.--Iuakeup_Pi^ocessreturned4683872<0x^778executiontime:5.029sPressanykeytocontinue.四、实验体会1、实验体会和收获深入理解了线程与进程的概念,熟悉了在Windows环境下何时使用进程,何时使用线程,怎么创建和撤销线程。五、源代码#include<>#include<iostream>usingnamespacestd;DWORDWINAPIta(LPVOIDargv){cout<<"HelloWorld!\n";}DWORDWINAPItb(LPVOIDargv){cout<<"我的名字:孙婷\n";cout<<"我的学号:9\n";}DWORDWINAPItc(LPVOIDargv){cout<<"Pleasewait...\n";Sleep(5000);cout<<"Iwakeup.\n";}intmain(){HANDLEthreada,threadb,threadc;DWORDTEST;threada=CreateThread(NULL,0,ta,NULL,0,0);threadb=CreateThread(0,0,tb,0,0,0);threadc=CreateThread(0,0,tc,0,0,0);ExitThread(TEST);ExitThread(TEST);ExitThread(TEST);return0;}实验题目:实验二 线程同步完成人:XXX报告日期:2018年4月7日一、 实验内容简要描述1)在程序中使用CreateSemaphore(NULL,0,1,"SemaphoreNam31)创建一个名为SemaphoreName的信号量,其初值为0。2)使用OpenSemaphore(SYNCHRONIZE]SEMAPHORE__MODIFY_STATE,NULL,"SemaphoreName1)打开该信号量。3)创建一个子线程,主线程创建子线程后调WaitForSingleObject(hHandle,INFINITE),这里等待时间设置为INFINITE表示要一直等待下去,直到该信号量被唤醒为止。4)子线程sleep5秒钟,然后输出“Iamover.”结束,调用ReleaseSemaphore(hHandle1,1,NULL)释放信号量,使信号量的值加1。二、 程序设计1、设计思路A)等待一个对象WaitForSingleObjects 函数决定等待条件是否被满足。如果等待条件并没有被满足,调用线程进人一个高效的等待状态,当等待满足条件时占用非常少的处理器时间。在运行前,一个等待函数修改同步对象类型的状态。修改仅发生在引起函数返回的对象身上。例如,信号的计数减l。WaitForSingleObject函数能等待的对象包括:Changenotification改变通告);Consoleinput(控制台输入);Event(事件);Job(作业);Mutex(互斥对象);Process(进程);Semaphore(信号量);Thread(线程);Waitabletimer(可等待定时器)。当使用等待函数或代码直接或间接创建窗口时, 一定要小心。如果一个线程创建了任何窗口,它必须处理进程消息。消息广播被发送到系统的所有窗口。 一个线程用没有超时的等待函数也许会引起系统死锁。 间接创建窗口的两个例子是DDE和COMCoInitialize。因此,如果用户有一个创建窗口的线程,用MsgWaitForMultipleObjects或MsgWaitForMultipleObjectsEx函数,而不要用SignalObjectAndWait函数。B)等待多个对象WaiForMultipleObjects 函数当下列条件之一满足时返回:(1)任意一个或全部指定对象处于信号态;(2)超时间隔已过。C)创建信号量如果成功就传回一个handle,否则传回NULL不论哪一种情况,GetLastError都会传回一个合理的结果。如果指定的Semaphore名称已经存在,则函数还是成功的,GetLastError会传回ERROR_ALREADY_EXISTSD)打开信号量为现有的一个已命名信号机对象创建一个新句柄。E)增加信号量的值该函数将指定信号对象的计数增加一个指定的值。2、主要数据结构DWORDWaitForSingleObject(HANDLEhHandle,DWORDdwMilliseconds);DWORDWaitForMultipleObjects(DWORDnCountCONSTHANDLE*lpHandlesBOOLfWaitAll,DWORDdwMilliSeconds)HANDLECreateSemaphore(LPSECURITY_ATTRIBUTESlpAttributes,LONGlInitialCount,LONGlMaximumCountLPCTSTRlpName);HANDLEOpenSemaphore(DWORDdwDesiredAccessC:\U5ers\jsj\De5kt。p\testl\bin\Debug\tMtl.exeSendplioreCreateSuccess*SenaploreOpenSuccess!riiFeadlcreateSucchee*NouInThread!Ianouei*_ReleaseSemApLoFeei*F=87SenaplioveIReleaseSuccess!fc=1WaitForBin3leObjecterr=0UfiIT_OBJECT»d«eS=0我的名字,孙婷我的学号:141240209Procesereturned0<0x0> execu^ion(ime:8.005sPressanyMeytocontinue.);rc=ReleaseSemaphore(hHandle1,1,NULL);Often,acriticalsectionobjectisusedtoprotectsharedresources 。通过定义在数据段中的——个CRITICAL_SECTION吉构实现。CRITICAL_SECTIONmyCritical;并且在任何线程使用此临界区对象之前必须对它进行初始化。void InitializeCriticalSection(LPCRITICAL_SECTIONlpCriticalSection);之后,任何线程访问临界区中数据的时候,必须首先调用EnterCriticalSection函数,申请进入临界区(又叫关键代码段,使用共享资源的任何代码都必须封装在此)。在同一时间内,Windows只允许一个线程进入临界区。所以在申请的时候,如果有另一个线程在临界区的话,EnterCriticalSection 函数会一直等待下去,直到其他线程离开临界区才返回。EnterCriticalSection 函数用法如下:voidEnterCriticalSection(LPCRITICAL_SECTIONlpCriticalSection);当操作完成的时候,还要将临界区交还给 Windows以便其他线程可以申请函数来完成使用。这个工作由LeaveCriticalSection函数来完成voidLeaveCriticalSection(LPCRITICAL_SECTIONIpCriticalSection);当程序不再使用临界区对象的时候,必须使用DeleteCriticalSection函数将它删除。voidDeleteCriticalSection(LPCRITICAL_SECTIONlpCriticalSection);b.使用互斥锁(Interlocked)提供一种手段来保证值的递增(减)能够以原子操作方式来进行,也就是不中断地进行。LONGInterlockedIncrement(LPLONGlpAddend);试结果分析C:\LI&ers\j可\Des匕Dp\test\t)in\Debug\test.exeThreadlcreatesuccess!TlipeadScreatesuccess!countinfunc2=6countinfund=7Processreturned0<0x0>execirtiontine:1„0095Pj'e£& tocontinue.四、实验体会1、实验体会和收获熟练了Windows系统环境下线程的创建与撤销,熟悉了Windows系统提供的线程互斥API,使用Windows系统提供的线程互斥API解决实际问题。五、源代码#include<>#include<>#include<>staticintcount=5;epuei*PipeCreate£u.ccesetep-uftp-PipeConnectSuccess!er-uer-PipeRead.SuccessfftTAFaneClientis=He1Lo!Mynunber:141340209*Mynane:・孙婷LcascInputToSend.©Iio,孙瘴,eruerPipeWriteSuccess?eruerPipeConnectSuccess*erverPipeReadSucces!AiIAfi*onClient19=endIonsei*-uebeEND*1nputDataPLea&e?H&Llo!raunbei?:141340239.Mynane=-于卜婷WaitPipeSugga尊寸GallPipeSuccess!Dataff»Sfepu&risH.llo!孙婷!1raputDataPlease?endH*帕Client:tobeEND?pipe\\myPipe";charInBuffer[50]="";charOutBuffer[50]="";DWORDBytesRead,BytesWrite;hPipeHandle=CreateNamedPipe((LPCTSTR)lpName,PIPE_ACCESS_DUPLEX|FILE_FLAG_OVERLAPPED|WRITE_DAC,PIPE_TYPE_MESSAGE|PIPE_READMODE_BYTE|PIPE_WAIT,1,20,30,NMPWAIT_USE_DEFAULT_WAIT,(LPSECURITY_ATTRIBUTES)NULL); \pipe\\myPipe";charInBuffer[50]="";charOutBuffer[50]="";DWORDBytesRead;intnRetCode=0;interr=0;while(1){strcpy(InBuffer,"");strcpy(OutBuffer,"");printf("InputDataPlease!\n");scanf("%s",InBuffer);if(!strcmp(InBuffer,"end")){CallNamedPipe(lpName,InBuffer,sizeof(InBuffer),OutBuffer,sizeof(OutBuffer),&BytesRead,NMPWAIT_USE_DEFAULT_WAIT);break;}rc=WaitNamedPipe(lpName,NMPWAIT_WAIT_FOREVERg读者拥有临界区的所有权,写者都阻塞在临界区对象write上。当写者拥有临界区对象所有权时,第一个判断完readcount==1后,其余的读者由于等待对readcount的判断,阻塞在Mutex上!写者优先:写者优先和读者优先有相同之处,不同的地方在:一旦有一个写者到来时,应该尽快让写者进行写,如果有一个写者在等待,则新到的读者操作不能读操作,为此添加一个整型变量writecount,记录写者的数目,当writecount=0时才可以释放读者进行读操作!为了实现对全局变量writecount的互斥访问,设置了一个互斥对象Mutex3。为了实现写者优先,设置一个临界区对象 read,当有写者在写或等待时,读者必须阻塞在临界区对象read上。读者除了要一个全局变量readcount实现操作上的互斥外,还需要一个互斥对象对阻塞在read这一个过程实现互斥,这两个互斥对象分别为 mutexl和mutex2。3、主要数据结构voidRP_ReaderThread(void*p)读者线程信息voidRP_WriterThread(void*p)写者线程信息voidReaderPriority(char*file)读者优先处理函数voidWP_ReaderThread(void*p)读者线程信息voidWriterPriority(char*file)写者优先处理函数三、实验结果1、测试结果分析A.读者优先运行ReaderPriopity:Readerthread1sent?thereadingrequire•Readerthread1beginstopeadfile.WritertllHBjd2Sent£tlieurltIngrequire_Keaderthread3Sentstlie1*6adIngrequire_Kea.de户thread3beginstoreadfile.Wi'itepthread5sentsthewritingpequire■R&aderthread4sentsthereadingrrequireRfintierthread4beginstoreadflie.Readerthread3finishertreadingfile.n^adcrthread1Finishedreadingfile.Hed.derthread4Finisbed1k停ad£ngfile.Writertlnread2beyinstoVritet。the£ile.Wi'iterthread2finishedWritingtothefileteptfii?ead5beginstoUrite七t>theFlie,Wi'iterthread5FinishedWritingtothefile11readerandwaiterhavefinishedoperatinressAnyKeyToContinue:B.写者优先运行n",m_serial);n",m_serial);TiterPvioi'ity:WriterMyiterMritei*WriterUviterWriterWriterthreadthreadthreadthreadthl'fe^dthreadthread1sentsthew尸五七]WriterMyiterMritei*WriterUviterWriterWriterthreadthreadthreadthreadthl'fe^dthreadthread1sentsthew尸五七]ngr-E(£iJiireIjegin寻to27entsthebeginsto3sentstheS£ent£the4sentstheWritetothefile,writin^iE(tuii*€*Uritetothefile,writiieccuire.unitingrequire.uritinffr-E(iuirE.WriterWriterWriterWriterWritel*Writerthread;thi'eadthreadthreadthreadthi"eadlWritertJir'ead
WriterthreadfinigticdWritingtQthefile.WriterWriterWriterWriterWritel*Writerthread;thi'eadthreadthreadthreadthi"eadlWritertJir'ead
Writerthread力egin写tQUritetothefile.finishingrWritin^|tothefileheginstoU^itetot)«efile.finishedUi'itIngtothe£ile.beginstoUritet:othefiLe-Finish±n;rWptotliefile
finishedWritingtothefile.H11readerAndwriterhavefinishedoperatingPressarhyKeifToContinue四、实验体会1、实验体会和收获Windows2000/XP提供了互斥量(mutex)、信号量(semapore)、事件(event)等三种同步对象和相应的系统调用,用于线程的互斥与同步。通过对读者写者问题的调试,了解Windows2000/XP中的同步机制。五、源代码#include""#include<>#include<>#include<>#include<>#include<>#include<>#defineREADER'R'n",m_serial);#defineREADER'R'n",m_serial);n",m_serial);Sleep(m_persist);n",m_serial);n",m_serial);n",m_serial);Sleep(m_persist);n",m_serial);erial;inFile>>thread_info[n_thread].entity;inFile>>thread_info[n_thread].delay;inFile>>thread_info[n_thread++].persist;();}for(inti=0;i<(int)(n_thread);i++){if(thread_info[i].entity==READER||thread_info[i].entity=='R'){h_Thread[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(RP_ReaderThread),&thread_info[i],0,&thread_ID);n");}n",m_serial);wait_for_mutex1=WaitForSingleObject(h_Mutex1,-1);Sleep(m_persist);n",m_serial);n",m_serial);n",m_serial);Sleep(m_persist);n",m_serial);erial;inFile>>thread_info[n_thread].entity;inFile>>thread_info[n_thread].delay;inFile>>thread_info[n_thread++].persist;();}for(inti=0;i<(int)(n_thread);i++){if(thread_info[i].entity==READER||thread_info[i].entity=='R'){n");}试结果分析g\testexe«C;\Usurs\jsJ\Dcktop\tus,g\testexe要创建的进理数目:输入选程的调度万玄:<P/R)器入迸程名字和进岸所需时现13143546进程名2优先级46轮数8cps时间需要时间0 4进程状态U计数器03450Q 5U044400 6U014760 3R0进程名优先级轮数cpu时间需要时间进程状态计数器34500 5W94144440RQ 61 2UU01O4680 4R0进程名优先级抡数cpu时间需要时间进程状态计数器444UU 6U14401 2W124301 3U134500 5R0进程名优先级论数CP11时间需要时间进程状态计数器14401 2U1243n1 3U134201 4U144400 6R0进程名优先级论数cpu时间需要时间进程状态计数器24301 3U1142n1 4U114101 5U114401 2B1进程名优先级轮数cpu时|用需要时间进程状态计数器342n1 4U144161 SU114102 12243U1 3K1进程名优先级筋cpu时村需要时间讲程状态计的器441R1 5U114162 1U224082 2W234201 4R1阳聆优先级轮数CDU时间需要时间讲程状态计数器14102 1U224002 2W233702 3W244101 5R1进程名优先级轮数「P,时间需要时间进程状态计数器94002 2U233902 3W2438U2 4U214102 1R2进程名优先级轮数cpu时间需要时间进程状态计数器33902 3U2438U2 4W213803 0F3C!\Uae图国XOfrsktopt.且H\b«n\Defaug,t@ct自检能程名程七扣々不土P程日程日优先级38373819优先级373b38判优先级363E38羽先线J53834流先级333834需先级32加3d程名花丸级38程书骄呈名2G卷先级383436■先级343gZb•pu时闾22 、Lpa时间3 、cpu时间434gcpu时间444cpu时间4CRU时间34cpu时间34需要时间41S需要时间14需要时间23n3要时间3需要时间1Q3需要时间2同B需要时间0阿0署要对间0S01需要时间noe工验入।141?朝如9,孙婷「口匚匕s写reLuriitiil0<0x0>exccutlunLineressanyJkeytocontinue«送程状态F法超状态F)程状态F也程状态WFF立程状态UFF能桂状态U1FF程状态FFF近程状态FFF*程状态F.79fs四、实验体会,,回iJ1、实验过程中遇到的问题及解决过程(1)本次试验,思路设计不难,主要还是在利用指针处理时感觉很困难,实验中设计了结构指针用来指向PCB计PC叫构中又有链表指针。为此必须时时防止出现野指针,程序崩溃。(2)在建立优先数就绪队列时主要运用,链表插入模型。但是由于本题是从建立、到完成一个就绪对列,所以必须分多种情况讨论。2、实验体会和收获(1)本次试验后对优先数调度算法和时间片轮转调度算法实现的过程,有了很清楚的认识、理解。设计计数器来对进程执行状态的时间分析, 使得进程调度这一抽象模型得到具体化。之后,便是对进程的插入(执行完,插入到完成队列,否则插入到就绪)和再次调度(当改进程再次满足条件时,从就绪队列调度到执行队列)重复过程。(2)通过设计PC叫构,模拟进程调度,加深了对进程的理解。(3)提高了C语言编程动手能力,在设计就绪队列时,通过优先数将新进程插入就绪队列中的适当位置。要做多重判断,但实际又是“链表插入”模型的运用,无论多复杂的问题,都可以分化成简单的问题在已有的模型上处理。五、源代码#include<>#include<>#include<>typedefstructnode{charname[20];/* 进程的名字*/intprio;/*进程的优先级*/intround;/*分配CPU的时间片*/intcputime;/*CPU执行时间*/intneedtime;/*进程执行所需要的时间*/intcputime;/*CPU执行时间*/intneedtime;/*进程执行所需要的时间*/charstate;/*进程的状态,W--就绪态,R——执彳T态,F——完成态*/intcount;/*记录执行的次数*/structnode*next;/*intcount;/*记录执行的次数*/structnode*next;/*链表指针*/}PCB;PCB*ready=NULL,*run=NULL,*finish=NULL;/*定义三个队列,就绪队列,执行队列和完成队列*/执行队列和完成队列*/intnum;voidGetFirst();/*从就绪队列取得第一个节点*/voidOutput();/*输出队列信息*/voidInsertPrio(PCB*in);/*创建优先级队列,规定优先数越小,优先级越高*/voidInsertTime(PCB*in);/*时间片队列*/voidInsertFinish(PCB*in);/*时间片队列*/voidPrioCreate();/*优先级输入函数voidGetFirst();/*从就绪队列取得第一个节点*/voidOutput();/*输出队列信息*/voidInsertPrio(PCB*in);/*创建优先级队列,规定优先数越小,优先级越高*/voidInsertTime(PCB*in);/*时间片队列*/voidInsertFinish(PCB*in);/*时间片队列*/voidPrioCreate();/*优先级输入函数*/voidTimeCreate();/*时间片输入函数*/voidPriority。; voidPriority。; /*按照优先级调度*/voidRoundRun();/*时间片轮转调度voidRoundRun();/*时间片轮转调度*/intmain(void)charchose;printf(” 请输入要创建的进程数目:\n");scanf("%d”,&num);getchar();printf(" 输入进程的调度方法:(P/R)\n");scanf("%c”,&chose);switch(chose){case'P':case'p':PrioCreate();Priority。;break;case'R':case'r':TimeCreate();RoundRun();break;default:break;}Output();printf("\n");printf("实验人:9,孙婷\n");return0;}voidGetFirst()/* 取得第一个就绪队列节点*/{run=ready;if(ready!=NULL){run->state='R';while(p!=NULL)while(p!=NULL)while(p!=NULL)while(p!=NULL)ready=ready->next;run->next=NULL;}}voidOutput()/*输出队列信息*/{PCB*p;p=ready;printf("进程名\t优先级\t轮数\tcpu时间\t需要时间\t进程状态\t计数器\n");while(p!=NULL){printf("%s\t%d\t%d\t%d\t%d\t\t%c\t\t%d\n",p->name,p->prio,p->round,p->cputime,p->needtime,p->state,p->count);p=p->next;}p=finish;while(p!=NULL){printf("%s\t%d\t%d\t%d\t%d\t\t%c\t\t%d\n",p->name,p->prio,p->round,p->cputime,p->needtime,p->state,p->count);p=p->next;}p=run;{{{{printf("%s\t%d\t%d\t%d\t%d\t\t%c\t\t%d\n",p->name,p->prio,p->round,p->cputime,p->needtime,p->state,p->count);p=p->next;}}voidInsertPrio(PCB*in)/* 创建优先级队列,规定优先数越小,优先级越低*/{PCB*fst,*nxt;fst=nxt=ready;if(ready==NULL)/* 如果队列为空,则为第一个元素*/{in->next=ready;ready=in;}else/* 查到合适的位置进行插入*/{if(in->prio>=fst->prio)/* 比第一个还要大,则插入到队头*/{in->next=ready;ready=in;}elseif(ready==NULL)if(ready==NULL)if(ready==NULL)if(ready==NULL)while(fst->next!=NULL)/*移动指针查找第一个别它小的元素的while(fst->next位置进行插入*/{nxt=fst;fst=fst->next;}if(fst->next==NULL)/* 已经搜索到队尾,则其优先级数最小,将其插入到队尾即可*/{in->next=fst->next;fst->next=in;}else/*插入到队列中*/{nxt=in;in->next=fst;}}}}voidInsertTime(PCB*in)/* 将进程插入到就绪队列尾部*/{PCB*fst;fst=ready;{{while(fst->next!=NULL)while(fst->next!=NULL){{while(fst->next!=NULL)while(fst->next!=NULL)in->next=ready;ready=in;}else{while(fst->next!=NULL){fst=fst->next;}in->next=fst->next;fst->next=in;}}voidInsertFinish(PCB*in)/* 将进程插入到完成队列尾部*/{PCB*fst;fst=finish;if(finish==NULL){in->next=finish;finish=in;}else{{{{{fst=fst->next;}in->next=fst->next;fst->next=in;}}voidPrioCreate()/* 优先级调度输入函数*/{PCB*tmp;inti;printf("输入进程名字和进程所需时间:\n");for(i=0;i<num;i++){if((tmp=(PCB*)malloc(sizeof(PCB)))==NULL){perror("malloc");exit⑴;}scanf("%s",tmp->name);getchar();/*吸收回车符号*/scanf("%d”,&(tmp->needtime));tmp->cputime=0;tmp->state='W;tmp->prio=50-tmp->needtime;/* 设置其优先级,需要的时间越多,优先级越低*/tmp->round=0;tmp->count=0;InsertPrio(tmp);/* 按照优先级从高到低,插入到就绪队列*/}}voidTimeCreate()/* 时间片输入函数*/{PCB*tmp;inti;printf(" 输入进程名字和进程时间片所需时间:/n");for(i=0;i<num;i++){if((tmp=(PCB*)malloc(sizeof(PCB)))==NULL){perror("malloc");exit⑴;}scanf("%s",tmp->name);getchar();scanf("%d”,&(tmp->needtime));tmp->cputime=0;tmp->state='W;tmp->prio=0;tmp->round=2;/* 假设每个进程所分配的时间片是2*/tmp->count=0;InsertTime(tmp);}voidPriority。/* 按照优先级调度,每次执行一个时间片*/{intflag=1;GetFirst();while(run!=NULL)/*当就绪队列不为空时,则调度进程如执行队列执行*/{Output();/* 输出每次调度过程中各个节点的状态*/while(flag){run->prio-=3;/* 优先级减去三*/run->cputime++;/*CPU 时间片加一*/run->needtime--;/* 进程执行完成的剩余时间减一*/if(run->needtime==0)/* 如果进程执行完毕,将进程状态置为 F,将其插入到完成队列*/{run->state='F';run->count++;/* 进程执行的次数加一*/InsertFinish(run);flag=0;}else/* 将进程状态置为W入就绪队列*/run->state='W;run->count++;/*进程执行的次数加一*/InsertTime(run);flag=0;}}flag=1;*/GetFirst();/* 继续取就绪队列队头进程进入执行队列*/}}voidRoundRun()/* 时间片轮转调度算法*/{intflag=1;GetFirst();while(run!=NULL){Output();while(flag){run->count++;run->cputime++;进程执行完毕*/进程执行完毕*/if(run->needtime==0)/*{run->state='F';InsertFinish(run);flag=0;}elseif(run->count==run->round)/* 时间片用完*/{run->state='W;run->count=0;/* 计数器清零,为下次做准备*/InsertTime(run);flag=0;}}flag=1;GetFirst();}}实验题目:实验七存储管理之动态链接库完成人:XXX报告日期:2018年5月12日实验内容简要描述1)编写动态链接库实现如下功能:①求两个数的最大值和最小值;②求1+2+3+4+-+n(n作为一个参数)。2)编写程序,通过隐式链接和显式链接调用动态链接库。程序设计4、设计思路动态链接库入口函数DllMain()函数是动态链接库的入口函数,函数原型如下:BOOLAPIENTRYDllMain(HANDLEhModuleDWORDul_reason_for_call,LPVOIDlpReserved)hModule:动态链接库的句柄;reason_for_call:指明系统调用该函数的原因;lpReserved:动态链接库是否需要动态加载或卸载。动态链接库的导入与导出在动态链接库源程序中声明导出函数的代码如下:_declspec(dllexport)MyDllFunction(intx,inty);其中关键字_declspec(dllexport)表示要导出其后的函数MyDllFunction()。如果一个动态链接文件中的函数还需要调用其他动态链接库,此时,动态链接库文件除了导出函数外,还需要一个导入函数,声明导入函数的代码如下:_declspec(dllimport)DllFunction(intx,inty);动态链接库的两种链接方式:隐式链接和显式链接。隐式链接应用程序的源代码只引用动态链接库中包含的符号,当应用程序运行时,加载程序隐式地将动态链接库装入到进程的地址空间中。显式链接应用程序运行时使用LoadLibrary()显式地加载所需要的动态链接库,并显式地链接需要的输出符号表。5、主要数据结构BOOLAPIENTRYDllMain(HANDLEhModule,DWORDul_reason_for_call,LPVOIDlpReserved){returnTRUE;}intMax(intx,inty); 求最大值intMin(intx,inty); 求最小值intSum(intn);求和实验结果.测试结果分析四、实验体会1、实验体会和收获一开始用编译时头 文件#include"”一直编译不通过所以换成 MicrosoftVisualStudio2010编译,实践理解了动态链接库的原理,学会使用动态库编写简单程序,最终完成实验。五、源代码Dll:#include""#include""extern"C"_declspec(dllexport)intMax(intx,inty);/Debug/")extern"C"_declspec(dllexport)intMax(int,int);.+1=%d",Sum(100));getchar();}实验题目:实验八 存储管理之内存分配完成人:XXX报告日期:2018年5月19日实验内容简要描述1)编写一个程序,创建两个线程,一个用于内存分配,另一个用于跟踪内存的分配情况并打印信息。2)将VirtualAlloc函数的参数ftAllocahonType分别改为MEM_RES或MEM_TOP_DOWNnProtect参数分另改为PAGE_GUARPAGE_NOACCESSPAGE_NOCACHE进行本实验的各项操作,以及查看内存分配的各个结果,分析原因。3)尝试调换分配、回收、内存复位、加锁、解锁、提交、回收的次序,查看结果,并分析原因。程序设计6、设计思路1)查看系统信息2)查看系统内存信息3)虚拟内存分配4)释放虚拟空间5)虚拟空间加锁6)虚拟空间解锁Windows进程的虚拟地址空间中也有三种状态的页面:空闲页面、保留页面和提交页面。空闲(Free)页面:空闲页面是指那些可以保留或提交的可用页面。保留(Reserved)页面:保留页面是逻辑页面已分配但没有分配物理存储的页面。设置这种状态的效果是可以保留一部分虚拟地址,这样,如果不预先释放这些地址,就不能被其他应用程序(如Malloc,LocalAlloc等)的操作所使用。试图读或写空闲页面或保留页面将导致页面出错异常。保留页面可被释放或提交。提交(Committed)页面:提交页面是物理存储(在内存中或磁盘上)已被分配的页面。可对它加以保护,不许访问或允许只读访问,或允许读写访问。提交也可以被回收以释放存储空间,从而变成保留页面。在本实验中,首先创建工程makefile生成随机输入文件,其中包含对内存要求作的各种操作;然后创建工程MemoryAllocation,实现输入文件所要求的各项内存管理操作。7、主要数据结构VOIDGetSystemInfo(LPSYSTEM_INFOIpSystemInfo);该函数返回当前系统的信息VOIDGlobalMemoryStatus(LPMEMORYSTATUSlpBuffer);该函数可以获得计算机系统中当前使用的物理内存和虚拟内存的信息。LPVOIDVirtualAlloc(LPVOIDlpAddress,DWORDdwSize,DWORDflAllocationType,DWORDflProtect);该函数可以在调用进程的虚拟地址中保留或提交页面。除非设置了MEM_RESET志,否则被这个函数分配的内存单元被自动初始化为00BOOLVirtualFree(LPVOlDlpAddress,DWORDdwSizeDWORDdwFreeType);可以释放或注销调用进程虚拟空间中的页面。BOOlVirtualLocK(LPVOIDlpAddress,DWORDdwSize);该函数可以将进程虚拟空间中的内存加锁。以确保后面的对该区域的存取操作不会产生页面失败。BOOlVirtualUnLock(LPVOIDlpAddress,DWORDdwSize);该函数可以将进程虚拟空间指定范围内的页面解锁,从而系统在必要时可以将这些页面换出到页面文件中。三、实验结果1、基本数据源程序代码行数完成该实验投入的时间(小时数)与其他同学讨论次数231402、实验结果文做^ 格式查注M*劭(H)TOC\o"1-5"\h\z0dwActiveProQ0&5QfMask 15dwAllocationGranularity 65536dwNumberOfProc6SSor& AdwOemld0dwPageSize4096dwProcesso<Type586ipMaximumApplicationAddress t)x7FFEFFFFIpMinimumApphcationAddress0x00010000wProcessorArchitecture0wProc&ssorLevel6wProGessorReviwn10759wReseived0*曹离****,曹*曹**青*河育*******前*,曹,哀喉曾曹曹河**河河河**才■清鸯'苒*再■、f*—,号*鲁号曹书曹河*河,曹事长奇立力,—dwAvailPageFile 2377965568dwAvailPhys 900399104dwAvaiMrtual 21375344&4dwLength32dwMemorytoad 56dwTotaiPageFiie 418646960dwTotalPhys 2082324480dwTotafVirtual 2147352576&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&।&&&&&&&&&&&&&&&AlocaiionBase0x00010000AlocationProtect4BaseAddress 0x00010000Protect4RegionSize 65536State4096Type262144四、实验体会1、实验体会和收获本次试验让我们从不同侧面了解Windows系统对用户进程的虚拟内存空间的管理和分配方法,同时了解跟踪程序的编写方法 (与被跟踪程序保持同步,使用Windows提供的信号量),对Windows分配虚拟内存、改变内存状态,以及对物理内存和页面文件状态查询的API函数的功能、参数限制、使用规则等有了进一步了解。五、源代码1)tart=VirtualAlloc(NULL,*,MEM_RESERVE,PAGE_NOACCESS);traceArray[index++].size=*;cout<<"startingaddress:"<<traceArray[index-1].start<<"\t"<<"size:"<<traceArray[index-1].size<<endl;break;}case1:tart=VirtualAlloc(traceArray[index].start,traceArray[index].size,MEM_COMMIT,temp);index++;cout<<"startingaddress:"<<traceArray[index-1].start<<"\t"<<"size:"<<traceArray[index-1].size<<endl;break;}case2:tart<<"size:"<<traceArray[index].size<<endl;if(!VirtualLock(traceArray[index].start,traceArray[index++].size))cout<<GetLastError()<<endl;tart<<"\t"<<"size:<<traceArray[index].size<<endl;if(!VirtualUnlock(traceArray[index].start,traceArray[index++].size))cout<<GetLastError()<<endl;break;}tart<<"\t"<<"size:"<<traceArray[index].size<<endl;if (! VirtualFree(traceArray[index].start,traceArray[index++].size,MEM_DECOMMIT))cout<<GetLastError()<<endl;break;}tart<<"\t"<<"size:"<<traceArray[index].size<<endl;if (!VirtualFree(traceArray[index++].start,0,MEM_RELEASE))cout<<GetLastError()<<endl;break;}default:cout<<"error"<<endl;}ReleaseSemaphore(trac,1,NULL);n=i;pl[i].pfn=INVALID; 示该页不在主存中pl[i].counter=0; ime=-1; ext=&pfc[i+1];fn=i; ext=NULL;pfc[total_pf-1].pfn=total_pf-1;freepf_head=&pfc[0]; fn==INVALID)
ime&&pl[j].pfn!=INVALID)MinT=pl[j].time;MinPn=j;}}freepf_head=&pfc〔pl[MinPn].pfn];fn=INVALID;ime=-1;fn=freepf_head->pfn;ime=CurrentTime;ime=CurrentTime;fn==INVALID)fn!=INVALID)fn!=INVALID&&pl[page[j]].counter==0)dist[page[j]]==100000)ounter=1;fn=INVALID;fn!=INVALIDounter=0;ime&&pl[j].pfn!=INVALID)MinT=pl[j].time;MinPn=j;}}freepf_head=&pfc〔pl[MinPn].pfn];fn=INVALID;ime=-1;fn=freepf_head->pfn;ime=CurrentTime;ime=CurrentTime;fn==INVALID)fn!=INVALID)fn!=INVALID&&pl[page[j]].counter==0)dist[page[j]]==100000)ounter=1;fn=INVALID;fn!=INVALIDounter=0;&&fn];}pl[page[i]].pfn=freepf_head->pfn;fn==lNVALID)fn=INVALID;swap=1;if(use[pnext->pfn]==0){fn=pnext->pfn;fn]=1;fn==lNVALID)fn=INVALID;fn=pnext->pfn;swap=1;fn=pnext->pfn;if(use[pnext->pfn]==0){«C:\Users\jsj\Desktop\test\bin\Debug\test.exeI::Winders=121601.rackspercylinder=255ectopspertrack=63iytespersector■512I:I)1000202273280CBytes>=95386?Cttb>I)processreturned1C0xl> executiontime;0.013sIg>essanykeytocontinue.IgrleaseSelectReadorUritefInput'R'roread..fU*toUrlXfj.'Q'tocult9PleAseEoputtheSecCorNumberCoReadPorR:;or>tcnt:TextContent:>NTLDR<$130 0r摩foffi^confirsf饶of麽rof诜&fnuafd-,dfwwofmof^jrnornQf♦师ormef.nROfm0r凫 r6<^J王?x睾 fm司益 c赴?af?ef<TO? 8"f蛤Ag,B+9fCr^8Fnb6,fffTOfDfOArff3^|2$fOfOf♦♦八OfOf?2O〜r?<>s4肋鸵▲&(uF?Fer?aT]Qr岫btoo彳卓9raF?:b?4F?bt?re柚f卢*frDffHexTextContcot2,bb54sqe0di092010240«l9e33030»0fffffffOb63。86OHffffFffeb12fffrff90fffffff9M00H»HH0RRRRflffffFfF8cFffffffcSffffFffSoffFfff£d8fFffffFclfffFfffed4FfffFffaffFfff&btretft^nettetffh””门。总ar”*"。"rfttrefh76b046frtfettbiioIa66fffffff7ffffffe366fffffffa34e266ffffff8be4R0ffffff80fffffff?BfrrffFfsr。erFrprrr6rfrrrrd9frrrm>eiaee66rfrrffd3fFf/rFoafrrrrcb8ffffff9B66ffffff<il4c266fffffff7ffffffcl66ffffffa352266ffffffiebh6633frrrff<i26Grffffpf?rpfffrrajrrFfrf«32rrrrr/es714ggffffffllb04G266ffffff8?e222663o52266fffffffVV。262663o5226,FfffffS9e2a2663«S2266fffrfff89e3a2663eS2266ffffff89e422,6ffffFfb8ffffFf9BB0R66ffffff8bo222FfffrfoS966bffffffedffFffFB457fffffffs66ffffff2e266ffFffFb8FFFffffaH00066Ffffff8be262:”手“•846946 322“fff/ffbfi 000“ e2a2F”Ffe834966ffffffa336266ffffffal2e266bfffffffcMfffrfff8424fffffffff6.7frrrrfee78 8rfffrrrfesibturrtfe67*rrrfffedsaiot7342 4 s ggfffffFfb6-18c 66FfffffB? e62Z6766ffrfff8b -18866ffffff87cSo 2 66 ffTffal5e266fftfCffbVebO33ffffffd2GGfffffFffIffFL“,6266ffffffAl 4WZ6636 5©266fffffff«3462 66ffffffr833c322B f fffffH4IdH66ffTfffB33e362 Rrfffffr84ffrCFfcS fFfffrfd66rfffff8l>Le 36 2s766fffffff9b3。46266ffffff0l2«2fffFff99ffffffbeX“fffffFfb?。9I66ffffffM22R0fffffFfeSffFfffffe766bfffffFc0fFFfFfff84fffffFfa896.766.tttfttth0le766 3。3a2tttfffoA31666 3a2tffttt>b2B0a066ffffffb?«HHH66ffffffbaBB0Bffffffc8ffffffd6B66ffffffasftfFftcQtfrrrrres23aerffff^ia«2“ffffffbbfrrrrrea0。0“ffrrfb?«»00,loatoSelec1Recd01*UriCef1nouC'R'a*o 'U'CoUrifg.'Q'to<1uil?50 954-44S5294g24649(I33B3。00ffffffeU«80««000008060000»00»00(10000000000«80«0()00000080080000ffffFfeb12rffffF90£”「"900000000000000000fffffffScffffffcSffffffSe(FFTffd8fffffFelffFFffeO4fffffffaFFfFff8bffffffcBffffffffbffffffc83fffffffc66f 6b066fffffffb61cd0 66ffffff^4e266tftfHQbe4。。0fFfffffSfeQffFffffGffFfffd966FfFFffb810B066fFffffd3fffffFe0JFffffeb8fffFff9866ffffFfal4e266(ffffff?ffffffel66ffffffa352266fffffffb7leb06633ffffffd266fffffff? 66f£fff£s3562ffffffeS71466£fFPfF8be4a266fFFfff89e222663e52266£F「ff£89e262663e52268fFffff89e2a26€3eS2266Ffffff89e3a2663e52266fFffffS9e42266ffffffb8ffffff908a066ffffff8be222ffffffeS5f966bffffffcBffffff;8457fFfffffe66ffffffa32e266ffffffb8ffffffafl00066ffffff8be262ffffffcB46.966fffffF&332266FfffffbSfffFffhB00HffffFfSbe2a2ffffffe834966fFffffa336266ffffffal2。266bffffffcBfffffff8424fffffffB67ffffff8078 8Bfffffff85lbffffFffe6766ffffff8d501067342 4 67 66fFfffffM.48e 66fFFfff89 e6226766fffFFFSb 48866ffffff89« 2 66 fffffFal50266fffffFFb?eb06633ffffffd266fffffff?fffffffl66FffffFa366266ffffffal 4226636 Sc266ffffff«3勺62 66fffffff&33e3228 f ffffff84Id。66ffffrf833o362 RfFffffr84ffffFfcS FFfffffd66fffffffible 36 2le766ffffff8b3c46266FffffFal2a2ffffffe8ffffffbc166fffffFfb?e0266ffffffbfi220Bffffffc8ffffffffe?66bffffffc®fffffff84ffffffaS267£6rff/ffftb0le766fffrffflb3e3a2Pffr/feft31666"ffff"3a266ffffffbb2000066Ffffffb9000066fffffFba0000FrffffeSffffffdG866ffffff85ffffffcBfffffff8523066ffffffal3a266fffffffbbffffff8B00066fffffff)906。。PleaseSelectReadorUritcfInput1R1roreA<lr9U1toUrite.'Q'to(£uit9JleaseInputtheSectorHunbertoWriteto:ontent:>lea5eInputtheContenttoUnitetoDiskA:1ENGJIleaseSelectReadorUriteMnput'R'ro to toleaseInputtheSectorMwnbertoReadFoe:TextContentZ涝涝涝涝?例HoxTextContent;:d454。474a-490ffffffccffffffccffffrFccffffffccffffffccffffffccffFFffcffffffccffffffccffffffccffffffccffffffccffffffccffffffccffffffccfffffccffffffccffffffccffffffccffffffccffffffccffffffccffffffccffffffccfffffeeffffffccfrffffccrFffffccffffFFccfrffffccffffffccffffffccffPFffccFffffecffffffFceffffffccFfffffccffffffccffffffccffffffccffffffccffffffccfffffeeffffffccffffffccffffffccffffffccffffffccffffffccffffffccffffffccfffff”fffffffc
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 医疗信息化建设与大数据应用
- 急诊科应对能力与流程优化
- 心血管护理风险防范策略
- 2026年安徽黄梅戏艺术职业学院单招职业技能考试备考题库带答案解析
- 2026年渤海理工职业学院单招综合素质笔试备考试题带答案解析
- 2026年川南幼儿师范高等专科学校单招综合素质考试备考试题带答案解析
- 2026年大连汽车职业技术学院单招综合素质笔试备考试题带答案解析
- 呼吸道疾病患者护理策略
- 护理专业实习实习基地管理
- 移动医疗与健康监测应用
- 《基于杜邦分析法的公司盈利能力研究的国内外文献综述》2700字
- 华东师大版一课一练八年级数学第一学期答案上海增强版答案
- 寒假作业一年级上册《数学每日一练》30次打卡
- 中职数学基础模块上册第3章函数复习课课件
- JTS 206-2-2023 水运工程桩基施工规范
- 2021年新湘教版九年级数学中考总复习教案
- 施工技术部门的安全生产责任制
- 上海亲子司法鉴定机构名录
- 德佑地产二手房买卖合同
- 《中外园林史》课程标准
- JJF 2024-2023能量色散X射线荧光光谱仪校准规范
评论
0/150
提交评论