操作系統(tǒng)B實(shí)驗(yàn)(華北電力大學(xué)科技學(xué)院)_第1頁(yè)
操作系統(tǒng)B實(shí)驗(yàn)(華北電力大學(xué)科技學(xué)院)_第2頁(yè)
操作系統(tǒng)B實(shí)驗(yàn)(華北電力大學(xué)科技學(xué)院)_第3頁(yè)
已閱讀5頁(yè),還剩20頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、課程設(shè)計(jì)報(bào)告(2011- 2012 年度第1學(xué)期)名 稱: 操作系統(tǒng)原理課程設(shè)計(jì) B 院 系:信息工程系班 級(jí):軟件09k2學(xué)號(hào):091909020227學(xué)生姓名:閆雪峰指導(dǎo)教師:郭豐娟 張琦設(shè)計(jì)周數(shù):1成 績(jī):日期:2011年11月25日操作系統(tǒng)原理課程設(shè)計(jì)B課程設(shè)計(jì)任務(wù)書(shū)一、目的與要求1. 理解和掌握操作系統(tǒng)的基本概念、基本組成與工作原理;2. 理解和掌握操作系統(tǒng)中主要功能模塊的工作原理及其實(shí)現(xiàn)算法;3. 掌握軟件模塊設(shè)計(jì)技能;熟悉并能較好地利用軟件開(kāi)發(fā)環(huán)境獨(dú)立編程、調(diào)試和分析程序運(yùn)行情況,逐漸形成創(chuàng)新思維和從事系統(tǒng)軟件的研究和開(kāi)發(fā)能力。二、主要內(nèi)容采用某種程序設(shè)計(jì)語(yǔ)言, 設(shè)計(jì)與開(kāi)發(fā)一個(gè)仿

2、真操作系統(tǒng),要求具備進(jìn)程調(diào)度、 存儲(chǔ)器管理、文件及設(shè)備管理等基本功能,具體內(nèi)容包括:1. 模擬單處理器系統(tǒng)的進(jìn)程調(diào)度,加深對(duì)進(jìn)程的概念及進(jìn)程調(diào)度算法的理解;2. 編寫(xiě)一個(gè)多線程程序,加深對(duì)現(xiàn)代操作系統(tǒng)中線程的理解;3. 編寫(xiě)和調(diào)試一個(gè)銀行家算法程序,加深了解有關(guān)資源申請(qǐng)、避免死鎖等概念,并體會(huì)和了解死鎖和避免死鎖的具體實(shí)施方法;4. 用可變分區(qū)算法模擬主存的分配和回收,加深對(duì)存儲(chǔ)器管理的理解,熟悉各種主存 分配方法;5. 模擬虛擬存儲(chǔ)管理中缺頁(yè)中斷及頁(yè)面置換算法,加深對(duì)虛擬存儲(chǔ)器管理的理解,熟 悉各種頁(yè)面淘汰算法;模擬設(shè)備的分配與回收,加深對(duì)設(shè)備管理的理解;模擬文件 管理的工作過(guò)程,從而對(duì)各種

3、文件操作命令的實(shí)質(zhì)內(nèi)容和執(zhí)行過(guò)程有比較深入的了解;模擬磁盤(pán)調(diào)度的過(guò)程,加深對(duì)磁盤(pán)存儲(chǔ)器管理的理解,熟悉各種磁盤(pán)調(diào)度算法。6. 綜合以上實(shí)驗(yàn)的結(jié)果,并進(jìn)行集成與設(shè)計(jì),開(kāi)發(fā)出一個(gè)小型虛擬操作系統(tǒng)。對(duì)以上課程設(shè)計(jì)內(nèi)容,將根據(jù)學(xué)生的專(zhuān)業(yè)與實(shí)際情況進(jìn)行調(diào)整,某些題目為選作題目。三、進(jìn)度計(jì)劃序號(hào)設(shè)計(jì)(實(shí)驗(yàn))內(nèi)容完成時(shí)間備注1熟悉開(kāi)發(fā)環(huán)境及程序設(shè)計(jì)語(yǔ)言1天2系統(tǒng)的分析、設(shè)計(jì)2天3調(diào)試與集成1天4驗(yàn)收,提交實(shí)驗(yàn)報(bào)告1天四、設(shè)計(jì)(實(shí)驗(yàn))成果要求至少完成主要內(nèi)容中的 3項(xiàng),統(tǒng)一使用課程設(shè)計(jì)報(bào)告書(shū),文字清楚、工整。五、考核方式實(shí)驗(yàn)結(jié)果(60%) +實(shí)驗(yàn)報(bào)告(30%) +實(shí)驗(yàn)過(guò)程表現(xiàn)(10%)學(xué)生姓名:指導(dǎo)教師:20

4、11年11月25日、課程設(shè)計(jì)(綜合實(shí)驗(yàn))的目的與要求1. 理解和掌握操作系統(tǒng)的基本概念、基本組成與工作原理;2. 理解和掌握操作系統(tǒng)中主要功能模塊的工作原理及其實(shí)現(xiàn)算法;3. 掌握軟件模塊設(shè)計(jì)技能;熟悉并能較好地利用軟件開(kāi)發(fā)環(huán)境獨(dú)立編程、調(diào)試和分析程序運(yùn)行情況,逐漸形成創(chuàng)新思維和從事系統(tǒng)軟件的研究和開(kāi)發(fā)能力。、設(shè)計(jì)正文實(shí)驗(yàn)1單處理器系統(tǒng)的進(jìn)程調(diào)度1.1實(shí)驗(yàn)?zāi)康脑诓捎枚嗟莱绦蛟O(shè)計(jì)的系統(tǒng)中,往往有若干個(gè)進(jìn)程同時(shí)處于就緒狀態(tài)。當(dāng)就緒進(jìn)程個(gè)數(shù)大于處理器數(shù)時(shí),就必須依照某種策略來(lái)決定哪些進(jìn)程優(yōu)先占用處理器。本實(shí)驗(yàn)?zāi)M在單處理器情況下的處理器調(diào)度,幫助學(xué)生加深了解處理器調(diào)度的工作。1.2實(shí)驗(yàn)要求1 設(shè)計(jì)一

5、個(gè)按時(shí)間片輪轉(zhuǎn)法實(shí)現(xiàn)處理器調(diào)度的程序,每個(gè)程序由一個(gè)PCB表示。2 程序執(zhí)行中應(yīng)能在屏幕上顯示出各進(jìn)程的狀態(tài)變化,以便于觀察調(diào)度的整個(gè)過(guò)程。1.3實(shí)驗(yàn)原理和設(shè)計(jì)進(jìn)程控制塊PCB的格式為:指針一一進(jìn)程按順序排成循環(huán)隊(duì)列,用指針指出下一個(gè)進(jìn)程的進(jìn)程控制塊的首地 址,最后一個(gè)進(jìn)程的指針指出第一個(gè)進(jìn)程的進(jìn)程控制塊首地址。要求運(yùn)行時(shí)間一一假設(shè)進(jìn)程需要運(yùn)行的單位時(shí)間數(shù)。已運(yùn)行時(shí)間一一假設(shè)進(jìn)程已經(jīng)運(yùn)行的單位時(shí)間數(shù),初始值為“0”狀態(tài)有兩種狀態(tài),“就緒”和“結(jié)束”,初始狀態(tài)都為“就緒”,用0表示。當(dāng) 一個(gè)進(jìn)程運(yùn)行結(jié)束后,它的狀態(tài)為“結(jié)束”,用1表示。(1) 運(yùn)行處理器調(diào)度程序前,輸入進(jìn)程數(shù)并且為每個(gè)進(jìn)程設(shè)置所

6、需的服務(wù)時(shí)間;(2) 把各個(gè)進(jìn)程按順序排成循環(huán)隊(duì)列,用指針指出隊(duì)列連接情況;由于是模擬程序,在時(shí)間片輪轉(zhuǎn)的前提下,每次使得相應(yīng)進(jìn)程:執(zhí)行時(shí)間=已執(zhí)行時(shí)間+1 ;(4)輸出運(yùn)行細(xì)節(jié)。1.4實(shí)驗(yàn)結(jié)果就緒隊(duì)列情況進(jìn)程名字需要時(shí)間運(yùn)行時(shí)間狀態(tài)1 1B2 50R3 50E第2次運(yùn)行:當(dāng)前運(yùn)行的程序?yàn)?就緒隊(duì)列情況進(jìn)程名字離要時(shí)間運(yùn)行時(shí)間狀態(tài)2 51n3 5&B141E實(shí)驗(yàn)2:主存儲(chǔ)器空間的分配和回收2.1實(shí)驗(yàn)?zāi)康囊粋€(gè)好的計(jì)算機(jī)系統(tǒng)不僅要有一個(gè)足夠容量的、存取速度高的、穩(wěn)定可靠的主存儲(chǔ)器,而且要能合理地分配和使用這些存儲(chǔ)空間。當(dāng)用戶提出申請(qǐng)存儲(chǔ)器空間時(shí),存儲(chǔ)管理必須根據(jù)申請(qǐng)者的要求,按一定的策略分

7、析主存空間的使用情況,找出足夠的空閑區(qū)域分配給申請(qǐng)者。當(dāng)作業(yè)撤離或主動(dòng)歸還主存資源時(shí),則存儲(chǔ)管理要收回作業(yè)占用的主存空間或歸還部分主存空間。主存的分配和回收的實(shí)現(xiàn)雖與主存儲(chǔ)器的管理方式有關(guān) 的,通過(guò)本實(shí)驗(yàn)幫助學(xué)生理解在不同的存儲(chǔ)管理方式下應(yīng)怎樣實(shí)現(xiàn)主存空間的分配和回 收。22實(shí)驗(yàn)要求1 在可變分區(qū)管理方式下采用最先適應(yīng)算法實(shí)現(xiàn)主存分配和實(shí)現(xiàn)主存回收。2打印空閑區(qū)說(shuō)明表的初始狀態(tài),作業(yè) 4的申請(qǐng)量以及為作業(yè) 4分配后的空閑區(qū) 說(shuō)明表狀態(tài);再依次打印作業(yè) 3和作業(yè)2的歸還量以及回收作業(yè) 3,作業(yè)2所占主存后 的空閑區(qū)說(shuō)明表。2.3實(shí)驗(yàn)原理和設(shè)計(jì)1.可變分區(qū)方式是按作業(yè)需要的主存空間大小來(lái)分割分區(qū)的

8、。當(dāng)要裝入一個(gè)作業(yè) 時(shí),根據(jù)作業(yè)需要的主存量查看是否有足夠的空閑空間,若有,則按需要量分割一個(gè)分區(qū)分配給該作業(yè);若無(wú),則作業(yè)不能裝入。隨著作業(yè)的裝入、撤離,主存空間被分成許 多個(gè)分區(qū),有的分區(qū)被作業(yè)占用,而有的分區(qū)是空閑的。例如:05k10k14k26k其中,起址指出一個(gè)空閑區(qū)的主存起始地址。長(zhǎng)度指出從起始地址開(kāi)始的一個(gè)連續(xù)空閑的長(zhǎng)度。2.4運(yùn)行結(jié)果請(qǐng)主_ FT ,=2入時(shí)分裝東少霽10多 畑澈址la煜W囂林忒名始sites 龍Bfc黑簫訝鶴 內(nèi)將內(nèi)賣(mài)進(jìn)進(jìn)逬進(jìn)進(jìn)進(jìn)進(jìn)進(jìn) 入入入入入入入出入入入岀寸5 5 r*n 的間小 禽存 :0入行內(nèi)Z1入行內(nèi) 一養(yǎng)運(yùn)的宀黨運(yùn)的的間小存時(shí)丈KS存2:0存:1詹

9、翦嘗耳麒菸進(jìn)程占用內(nèi)存大技】空間說(shuō)明表當(dāng)前內(nèi)存分區(qū)表總大小為4個(gè)袤項(xiàng)長(zhǎng)度2實(shí)驗(yàn)3:多線程游戲(貪吃蛇)3.1實(shí)驗(yàn)?zāi)康模? )任何語(yǔ)言,實(shí)現(xiàn)多線程游戲,如龜兔賽跑,搖獎(jiǎng)機(jī)等。3.2實(shí)驗(yàn)原理和設(shè)計(jì)(1)vb實(shí)現(xiàn)貪吃蛇游戲,用到timer控件實(shí)現(xiàn)多線程的控制,實(shí)現(xiàn)貪吃蛇的基本功能(2)連接access數(shù)據(jù)庫(kù),將最高分信息存到數(shù)據(jù)庫(kù)。3.2實(shí)驗(yàn)結(jié)果八斗yjito固三、課程設(shè)計(jì)(綜合實(shí)驗(yàn))總結(jié)通過(guò)本次課程綜合實(shí)驗(yàn),我對(duì)存儲(chǔ)器內(nèi)部進(jìn)程調(diào)度、空間管理和頁(yè)面置換等相關(guān)算法有 了更加深刻的理解,同時(shí)鍛煉了動(dòng)手能力,為以后更加深入地學(xué)習(xí)操作系統(tǒng)這門(mén)課程打下了 良好的基礎(chǔ)。值得一提的是,本次實(shí)驗(yàn)對(duì)設(shè)計(jì)多線程游戲有了

10、些許心得,興趣所致,今后當(dāng)加強(qiáng)這方面的學(xué)習(xí),開(kāi)發(fā)出一些好玩的小游戲。計(jì)算機(jī)相關(guān)的學(xué)科離不開(kāi)上機(jī)實(shí)踐,只有通過(guò)實(shí)踐,才能更好地掌握知識(shí),自己以后當(dāng)主動(dòng)上機(jī)實(shí)踐相關(guān)理論知識(shí)。四、參考文獻(xiàn)1 計(jì)算機(jī)操作系統(tǒng),西安電子科技大學(xué)出版社,2007年5月第3版;湯小丹 梁紅兵哲鳳屏湯子嬴編著。2 游戲開(kāi)發(fā)教程附錄實(shí)驗(yàn)一/ timer.cpp :定義控制臺(tái)應(yīng)用程序的入口點(diǎn)#include "stdafx.h"int _tmain( int argc, _TCHAR* argv)return 0;#include<stdio.h>#include<stdlib.h>

11、#include <malloc.h>#define TIME 1typedef struct procuderint chrName;/進(jìn)程名字int intRoundTime;int intRunningTime; /已經(jīng)運(yùn)行時(shí)間char chrFlag;struct procuder *pointerNext; procuder;int main()int intTotal;/ 進(jìn)程總數(shù)int i;int intCounter=1; / 計(jì)數(shù)標(biāo)記procuder *pNew; /新申請(qǐng)的節(jié)點(diǎn)procuder *pPointer; / 當(dāng)前程序指針procuder *pPrev

12、ious; /當(dāng)前指針的前一個(gè)指針procuder *pPrint; /輸出打印的指針pPointer=(procuder *)malloc( sizeof(procuder);/初始化指針節(jié)點(diǎn) pPrevious=pPointer; /將倆個(gè)指針初始化在一起printf("請(qǐng)輸入總數(shù) total:");scanf("%d",&intTotal);for(i=1;iv=intTotal;i+) /初始化各個(gè)進(jìn)程pNew=(procuder *)malloc( sizeof(procuder);/ 申請(qǐng)新節(jié)點(diǎn) pPrevious->point

13、erNext=pNew; 將新申請(qǐng)節(jié)點(diǎn)與前一個(gè)節(jié)點(diǎn)連接起來(lái) pPrevious=pNew;將指示指針移到新申請(qǐng)的指針printf("請(qǐng)輸入第d進(jìn)程名字:",i);scanf('%d",&(pNew->chrName);printf("請(qǐng)輸入第4要求運(yùn)行時(shí)間:",i);scanf('%d",&(pNew->intRoundTime);pNew->chrFlag= 'R' pNew->intRunningTime=O; 初始化標(biāo)記為和運(yùn)行時(shí)間 pPrevious-&g

14、t;pointerNext=pPointer->pointerNext; /設(shè)成循環(huán)隊(duì)歹廿 pPointer=pPointer->pointerNext;while (pPointer->pointerNext!=pPointer) /運(yùn)行完剩一個(gè)進(jìn)程結(jié)束pPointer->intRunningTime=pPointer->intRunningTime+TIME; / 模擬進(jìn)程運(yùn)行/輸出當(dāng)前的狀態(tài),代碼自己寫(xiě)把printf(” 第d次運(yùn)行:當(dāng)前運(yùn)行的程序?yàn)?dn",intCounte葉+,pPointer->chrName);printf(&quo

15、t;n 就緒隊(duì)列情況nn進(jìn)程名字需要時(shí)間運(yùn)行時(shí)間狀態(tài)n");if (pPointer->intRunningTime<pPointer->intRoundTime) 判斷當(dāng)前進(jìn)程是否完成未完成pPointer=pPointer->pointerNext; /輪轉(zhuǎn)至U下一個(gè)時(shí)間片 pPrevious=pPrevious->pointerNext; /previous后移else 完成了將當(dāng)前節(jié)點(diǎn)剔除pPointer->chrFlag= 'E'/ 設(shè)置標(biāo)志位pPrevious->pointerNext=pPointer->p

16、ointerNext; /剔除當(dāng)前節(jié)點(diǎn) pPointer=pPointer->pointerNext; /運(yùn)行指針后移pPrint=pPrevious;while(pPrint->pointerNext!=pPrevious) /輸出各個(gè)進(jìn)程的狀態(tài)printf(" %d %d%d%cn",pPrint->chrName,pPrint->intRoundTime,pPrint->intRunningTime,pPrint->chrFlag);pPrint=pPrint->pointerNext; /后移printf(" %d

17、 %d%d%cn",pPrint->chrName,pPrint->intRoundTime,pPrint->intRunningTime,pPrint->chrFlag); printf("n");換行while (pPointer->intRunningTime<pPointer->intRoundTime)pPointer->intRunningTime=pPointer->intRunningTime+TIME; / 模擬進(jìn)程運(yùn)行printf("第 %d次運(yùn)行:當(dāng)前運(yùn)行的程序?yàn)?%dn&quo

18、t; ,intCounte葉+,pPointer->chrName);printf( "n 就緒隊(duì)列情況nn進(jìn)程名字需要時(shí)間運(yùn)行時(shí)間狀態(tài)n");printf(" %d %d%d%cnn",pPointer->chrName,pPointer->intRoundTime,pPointer->intRunningTime,pPointer->chrFlag)Jsystem("pause");return 0;實(shí)驗(yàn)二/ MemoryControl.cpp :定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。#include &quo

19、t;stdafx.h"int _tmain( int argc, _TCHAR* argv)return 0;#include<stdio.h>#include<stdlib.h>#include<malloc.h>typedef struct memorytable/空間去說(shuō)明表結(jié)構(gòu)體int intStartAddress;/ 起始地址int intLength; /空間長(zhǎng)度int intFlag; 標(biāo)記為為空表目為未分配memorytable;struct process/進(jìn)程的屬性包括名字所需時(shí)間以運(yùn)行時(shí)間int intName;int iE

20、ndFlag;/標(biāo)記為標(biāo)記是否已經(jīng)卸載過(guò)int iSuccessfullyFitMemory; 是否成功分配內(nèi)存標(biāo)記int intStartTime;int intNeedTime;int intRoundTime;int intNeedMemorySize;int intStartAddress;struct process *sNext;int PrintMemoryTable( struct memorytable sSubMemoryTable, struct process *sSubPointer,int intSubTotal)/輸出空間說(shuō)明表的情況int i;int iCoun

21、ter=0; /計(jì)數(shù)器計(jì)算總共有多少個(gè)自由表項(xiàng)printf("n空間說(shuō)明表:當(dāng)前內(nèi)存分區(qū)表總大小為d個(gè)表項(xiàng)nn",intSubTotal*2);printf('欄目地址 長(zhǎng)度 狀態(tài)n");for(i=0;i<intSubTotal*2;i+) /循環(huán)輸出當(dāng)前空間說(shuō)明表中所有表目相if(sSubMemoryTFlag=1) iCounte葉+; /計(jì)數(shù)器 +有一個(gè)自由表項(xiàng)計(jì)數(shù)器加一printf( "%d %d %d%dn" ,i,sSubMemoryTStartAddress,sSubMemory

22、TLength,sSubMemoryTFlag);printf("當(dāng)前共有%d個(gè)能分配表目,分別從 d號(hào)內(nèi)存欄目n" ,iCounter,iCounter-1);return 0;int Crimple( struct memorytable sSubMemoryTable, struct process *sSubPointerjnt intSubTotal)/內(nèi)存縮緊代碼 int i,j;計(jì)數(shù)器for(i=0;i<intSubTotal;i+)for(j=i+1;j<2*intSubTotal;j+)if (sSubMem

23、oryTFlag=1) /如果 i不是空表目if(sSubMemoryTFlag=1)&&(sSubMemoryTStartAddress>sSubMemoryTStartAddress)/若j不為空表目且j的開(kāi)始地址小于i的開(kāi)始地址,交換sSubMemoryTable2*intSubTotal=sSubMemoryTablei; sSubMemoryTablei=sSubMemoryTablej;sSubMemoryTablej=sSubMemoryTable2*intSubTotal;else/i

24、為空表目,交換i和j的值if(sSubMemoryTFlag=1) 且j 不是空表目sSubMemoryTable2*intSubTotal=sSubMemoryTablei; sSubMemoryTablei=sSubMemoryTablej;sSubMemoryTablej=sSubMemoryTable2*intSubTotal;/打印輸出代碼PrintMemoryTable(sSubMemoryTable,sSubPointer,intSubTotal);return(0);int FitMemory( struct memorytable sSubMemoryTab

25、le, struct process *sSubPointer,int intSubTotal)int i=-1;/ 計(jì)數(shù)器while (+i<(2*intSubTotal) /循環(huán)找出滿足要求的內(nèi)存塊if(sSubMemoryTFlag=1) /判斷是否表項(xiàng)為未分配if (sSubMemoryTLength>sSubPointer->intNeedMemorySize) 判斷當(dāng)前欄的大小是否能放下進(jìn)程printf(”將%d號(hào)內(nèi)存起始地址%d,內(nèi)存大小%d 分配給%d進(jìn)程占用內(nèi)存大 小 dn" ,i,sSubMemoryTable

26、StartAddress,sSubMemoryTLength,sSubPointer->intName,sSubPoin ter->intNeedMemorySize);sSubPointer->intStartAddress=sSubMemoryTStartAddress;sSubMemoryTStartAddress=sSubMemoryTStartAddress+sSubPointer->intNeedMemory Size;sSubMemoryTLength=sS

27、ubMemoryTLength-sSubPointer->intNeedMemorySize;/輸出空間說(shuō)明表PrintMemoryTable(sSubMemoryTable,sSubPointer,intSubTotal);return 1;if(sSubMemoryTLength=sSubPointer->intNeedMemorySize) /剛好相等printf("將%d號(hào)內(nèi)存起始地址%d,內(nèi)存大小%d 分配給%d進(jìn)程占用內(nèi)存大 小 %dn" ,i,sSubMemoryTStartAddress,sS

28、ubMemoryTLength,sSubPointer->intName,sSubPoin ter->intNeedMemorySize);sSubPointer->intStartAddress=sSubMemoryTStartAddress;sSubMemoryTFlag=0;sSubMemoryTStartAddress=0;sSubMemoryTLength=0;縮緊分區(qū)說(shuō)明表,輸出空間說(shuō)明表Crimple(sSubMemoryTable,sSubPointer,intSubTo

29、tal);return 2;printf("內(nèi)存分配失敗%d號(hào)進(jìn)程:需要內(nèi)存空間為%d在內(nèi)存空閑說(shuō)明表中無(wú)滿足要求者 n",sSubPointer->intName,sSubPointer->intNeedMemorySize); /內(nèi)存分配失敗PrintMemoryTable(sSubMemoryTable,sSubPointer,intSubTotal); sSubPointer->iSuccessfullyFitMemory=0; /內(nèi)存分配失敗回受時(shí)不回收 return 0;int RemoveMemory( struct memorytable

30、sSubMemoryTable, struct process *sSubPointer,int intSubTotal)/從內(nèi)存 卸載函數(shù)int i;/計(jì)數(shù)器int j;int intFlag=0; / 標(biāo)位位int intStartAddress;int intLength; /定義起始地址和長(zhǎng)度臨時(shí)變量intStartAddress=sSubPointer->intStartAddress;intLength=sSubPointer->intNeedMemorySize; /初始化長(zhǎng)度f(wàn)or(i=intSubTotal*2-1;i>=0;i-)if(sSubMemory

31、TFlag=1)&&(sSubMemoryTStartAddress=intStartAddress+intLength)如果有與歸還區(qū)下臨的空閑分區(qū)表printf("有與%d號(hào)進(jìn) 程下鄰 的空閑 分區(qū)表%d號(hào)內(nèi)存起 始地址%d,長(zhǎng)度dn" ,sSubPointer->intName,i,sSubMemoryTStartAddress,sSubMemoryTLength);intLength+=sSubMemoryTLength;intFlag=1; /設(shè)置標(biāo)記位

32、for(j=i-1;j>=0;j-) /判斷是否有與當(dāng)前表目上臨的空閑去if(sSubMemoryTFlag=1) /上臨的區(qū)域不為空表目if(sSubMemoryTStartAddress+sSubMemoryTLength=intStartAddress)有上林空閑區(qū)有上鄰空閑區(qū)代碼,將下鄰空閑區(qū)置為空表目,修改上鄰空閑區(qū)的長(zhǎng)度printf("有與%d號(hào)進(jìn)程上鄰的空閑分區(qū)表 %d號(hào)內(nèi)存起始地址 %d,長(zhǎng)度%dn" ,sSubPointer->intName,j,sSubMemoryTSt

33、artAddress,sSubMemoryTLength);sSubMemoryTFlag=0;sSubMemoryTLength=0;sSubMemoryTStartAddress=0; /將下鄰空閑表目初始化sSubMemoryTLength+=intLength;Crimple(sSubMemoryTable,sSubPointer,intSubTotal); /縮緊代碼return(1);/無(wú)上鄰空閑區(qū)代碼,修改下鄰空閑區(qū)的起始地址和長(zhǎng)度printf("無(wú)與4號(hào)進(jìn)程上鄰的空閑分區(qū) n&q

34、uot; ,sSubPointer->intName);sSubMemoryTStartAddress=intStartAddress;sSubMemoryTLength=intLength;Crimple(sSubMemoryTable,sSubPointer,intSubTotal);return (2);/無(wú)上鄰空閑區(qū)沒(méi)有有與歸還區(qū)下臨的空閑分區(qū)表if(intFlag=O)printf("無(wú)與4號(hào)進(jìn)程下鄰的空閑分區(qū) n",sSubPointer->intName);for(i=0;i<intSubTotal*2;i

35、+)if(sSubMemoryTFlag=1)&&(sSubMemoryTStartAddress+sSubMemoryTLen gth=intStartAddress) /判斷是否有與歸還區(qū)上鄰的空閑區(qū)printf(”有與%d號(hào)進(jìn)程上鄰的空閑分區(qū)表目%d號(hào)內(nèi)存起始地址%d,長(zhǎng) 度%dn" ,sSubPointer->intName,i,sSubMemoryTStartAddress,sSubMemoryTLength);sSubMemoryTLength

36、+=intLength;Crimple(sSubMemoryTable,sSubPointer,intSubTotal); /return(3);有與歸還區(qū)上鄰的空閑區(qū)printf("無(wú)與d號(hào)進(jìn)程上鄰的空閑分區(qū)表目n",sSubPointer->intName,i);for(i=intSubTotal*2-1;i>0;i-) 查找表找到一個(gè)空表目if (sSubMemoryTFlag=0)sSubMemoryTFlag=1;sSubMemoryTStartAddress=intStartAddress;sSu

37、bMemoryTLength=intLength;Crimple(sSubMemoryTable,sSubPointer,intSubTotal);return(4);沒(méi)有歸還區(qū)上鄰的空閑區(qū)/回收失敗printf( "sorry 回收失敗 n");return(0);int main()int i;/計(jì)數(shù)器int intMemorySize;int intTotal;/內(nèi)存分成N份int intStartAddress;/ 內(nèi)存起始地址int intProcessTotal;/ 進(jìn)程總數(shù)int intTime=0;int intEndTime; / 結(jié)束時(shí)

38、間struct memorytable sMemoryTable100; 定義空間說(shuō)明變總共有個(gè)空間struct memorytable *sTemp; / 定義變量struct process *sHead;struct process *sPointer; 定義進(jìn)程數(shù)據(jù)struct process *sNew;for (i=0;i<100;i+) /初始化說(shuō)明表sTemp=(memorytable *)malloc( sizeof(struct memorytable); /申請(qǐng)新空間if (!sTemp) exit(1);/判斷是否申請(qǐng)成功sMemoryTablei=*sTemp;

39、sMemoryTFlag=0;sMemoryTLength=0;sMemoryTStartAddress=0;n分請(qǐng)讓內(nèi)存大printf("請(qǐng)輸出內(nèi)存大小*KB:" );/輸入內(nèi)存總大小,本程序采用固定分配即將內(nèi)存等分成 小能整除分區(qū)的個(gè)數(shù)scanf("%d",&intMemorySize);printf("請(qǐng)輸入將內(nèi)存等分成多少分:");/內(nèi)寸等分成n分scanf("%d",&intTotal);printf("請(qǐng)輸入內(nèi)存起始地址:&

40、quot;);/輸入內(nèi)存起始地址scanf("%d",&intStartAddress);printf("請(qǐng)輸入共有多少個(gè)進(jìn)程要裝入內(nèi)存:");/輸入進(jìn)程數(shù)scanf("%d",&intProcessTotal);printf("請(qǐng)輸入程序運(yùn)行的最終結(jié)束時(shí)間:");/輸入運(yùn)行時(shí)間scanf("%d",&intEndTime);/初始化內(nèi)存數(shù)組的代碼for(i=0;i<intTotal;i+)sMemoryTFlag=1;sMemoryTablei.

41、intLength=intMemorySize/intTotal; sMemoryTStartAddress=intStartAddress+i*sMemoryTLength;/初始化進(jìn)程的一些屬性,sHead為進(jìn)程隊(duì)列的頭指針sHead=(struct process *)malloc( sizeof(struct process);sPointer=sHead;for(i=0;i<intProcessTotal;i+)sNew=(struct process *)malloc( sizeof(struct process);/ 新建一個(gè)節(jié)點(diǎn)if(!

42、sNew) exit(1);sPointer->sNext=sNew;sPointer=sNew;sPointer->sNext=NULL;以下為初始化進(jìn)程的屬性printf(”請(qǐng)輸入進(jìn)程 d的名字:",i);scanf('%d",&(sPointer->intName);printf("請(qǐng)輸入進(jìn)程d開(kāi)始裝入內(nèi)存的時(shí)間:",i);scanf('%d",&(sPointer->intStartTime);printf("請(qǐng)輸入進(jìn)程4將要運(yùn)行的時(shí)間:",i);scanf(&

43、#39;%d",&(sPointer->intNeedTime);printf("請(qǐng)輸出進(jìn)程4需要的內(nèi)存大小:",i);scanf('%d",&(sPointer->intNeedMemorySize);sPointer->intRoundTime=0;sPointer->iEndFlag=0;sPointer->iSuccessfullyFitMemory=1; /默認(rèn)成功分配內(nèi)存標(biāo)記為能分配分配失敗時(shí)置零/開(kāi)始模擬將程序裝入內(nèi)存,注視進(jìn)程開(kāi)始時(shí)間必須大于while什+intTime) /運(yùn)行一次時(shí)

44、間加一sPointer=sHead初始化隊(duì)列指針while(sPointer=sPointer->sNext)!=NULL)if(sPointer->intStartTime=intTime) 如果到了開(kāi)始時(shí)間裝入內(nèi)存代碼printf("n 正在裝入 d號(hào)進(jìn)程,當(dāng)前邏輯時(shí)間 dn",sPointer->intName,intTime);/printf(”%d 號(hào) 進(jìn) 程 所 需 內(nèi) 存 大 小為dn",sPointer->intName,sPointer->intNeedMemorySize); 打印進(jìn)程信息FitMemory(sMe

45、moryTable,sPointer,intTotal);if (intTime>=sPointer->intStartTime )&&(sPointer->intRoundTime<sPointer->intNeedTime) / 若程序已經(jīng)裝入,并且為運(yùn)行完模擬時(shí)間加一sPointer->intRoundTime+; /已經(jīng)運(yùn)行時(shí)間加一if (sPointer->intRoundTime=sPointer->intNeedTime)&&(sPointer->iEndFlag=0)/ 時(shí) 間到 達(dá)從內(nèi)訓(xùn)卸載

46、進(jìn)程從內(nèi)訓(xùn)卸載代碼printf( "n 正在卸載d號(hào)進(jìn)程【裝入時(shí)間%d需要時(shí)間%d運(yùn)行時(shí)間%d】,當(dāng)前邏輯時(shí) 間 dn" ,sPointer->intName,sPointer->intStartTime,sPointer->intNeedTime,sPointer->intRoundTime,intTime);sPointer->iEndFlag=1;設(shè)置進(jìn)程完成運(yùn)行標(biāo)記位為即運(yùn)行結(jié)束 if(sPointer->iSuccessfullyFitMemory=1) /判斷分配內(nèi)存是否成功,若分配成功才回收 printf(”%d號(hào)進(jìn)程從%d

47、地址開(kāi)始,占用內(nèi)存大小為%dn" ,sPointer->intName,sPointer->intStartAddress,sPointer->intNeedMemorySize); /打印進(jìn)程信息 RemoveMemory(sMemoryTable,sPointer,intTotal);elseprintf( "%d號(hào)進(jìn)程:需內(nèi)存空間為%d分配時(shí)未能成功分配此處不回收 n",sPointer->intName,sPointer->intNeedMemorySize);此處添加跳出運(yùn)行代碼if(intTime>intEndTim

48、e) break;system("pause");return 0;/主函數(shù)結(jié)束實(shí)驗(yàn)三Dim Score As IntegerDim Speed As IntegerDim EatTag As IntegerDim conn As ADODB.ConnectionDim rs As ADODB.RecordsetDim aspect As IntegerDim PassTag As IntegerDim WallTag As IntegerPublic Sub CloseAccess()rs.Closeconn.CloseSet conn = NothingSet rs =

49、 NothingEnd SubPublic Sub LinkAccess()'鏈接數(shù)據(jù)庫(kù)過(guò)程Set conn = New ADODB.Connectionconn.Open "Provider=Microsoft .J et.OLEDB.4.0;Data Source=" & App.Path & "db3.mdb"Set rs = New ADODB.Recordsetrs.Open "select * from 排行榜 where 標(biāo)記='"& CboWall.ListIndex &

50、 CboPass.ListIndex & ""', connEnd SubPublic Sub RankPage()'生成最高分過(guò)程Dim Name As StringCall LinkAccessIf Score > rs.Fields(” 分?jǐn)?shù)")ThenName = lnputBox("恭喜 恭喜,請(qǐng)輸入姓名","破紀(jì)錄啦 ”,Screen.Width / 2, Screen.Height / 2) conn.Execute ("update 排行榜 set 姓名="&

51、Name & "',分?jǐn)?shù)="& Score & "' where 標(biāo)記="& CboWall.Listlndex & CboPass.Listlndex & ""')LblSort.Caption = rs.Fields(” 姓名")& " "& rs.Fields(” 分?jǐn)?shù)")& "分"'重新顯示最高分End IfCall CloseAccessEnd SubPublic

52、 Sub lsWall(WallTagSub As Integer, PassTagSub As Integer)If WallTagSub = 0 Then '判斷是否有圍墻If aspect = 2 And Pic(0). Left + Pic(O).Width > PicRect.ScaleWidth ThenPicHead. Left = 0ElseIf aspect = 1 And PicHead .L eft < 0 ThenPicHead .L eft = PicHead .L eft + PicRect.WidthElseIf aspect = 4 And

53、PicHead.Top + Pic(0).Height > PicRect.ScaleHeight ThenPicHead.Top = 0ElseIf aspect = 3 And PicHead.Top < 0 ThenPicHead.Top = PicHead.Top + PicRect.HeightEnd IfElseIf PicHead .L eft < 250 Or PicHead .L eft + PicHead.Width > PicRect.ScaleWidth - 250 Or PicHead.Top <250 Or PicHead.Top +

54、PicHead.Height > PicRect.ScaleHeight Then'舌頭碰到墻壁Call GameOverEnd IfEnd IfSelect Case PassTagSubCase 1If (PicHead.Left >= 1500 And PicHead .L eft <= 5250) And (PicHead.Top = 1750 Or PicHead.Top = 3250) ThenCall GameOverEnd IfEnd SelectEnd SubPublic Sub GameSelect()Dim ProblemTag As Integ

55、er, i As IntegerProblemTag = CboProblem.ListIndexIf WallTag = 1 Then '判斷是否有圍墻For i = 1 To 112 '卸載圍墻Unload PicWall(i)Next iEnd IfWallTag = CboWall.Listlndex '重新賦值圍墻標(biāo)記If WallTag = 1 Then '判斷是否有圍墻For i = 1 To 28 '初始化圍墻Load PicWall(i)PicWall(i).Visible = TruePicWall(i).Left = (i - 1)

56、 * 250 '左上角坐標(biāo)為 00PicWall(i).Top = 0Load PicWall(i + 28)PicWall(i + 28).Visible = TruePicWall(i + 28).Left = (i - 1) * 250PicWall(i + 28).Top = 4750Load PicWall(i + 56)'豎向圍墻PicWall(i + 56).Visible = TruePicWall(i + 56).Left = 0PicWall(i + 56).Top = (i - 1) * 250Load PicWall(i + 84)PicWall(i +

57、 84).Visible = TruePicWall(i + 84).Left = 6750PicWall(i + 84).Top = (i - 1) * 250Next iEnd IfSelect Case ProblemTag 選擇難度Case 0Timer1.lnterval = 500Case 1Timer1.lnterval = 200Case 2Timer1.lnterval = 100Case 3Timer1.lnterval = 50Case 4Timer1.lnterval = 25End SelectSelect Case PassTag卸載上局迷宮Case 0Case 1

58、Fori = 1 To 16Unload PicWall(i + 112)'先卸載窗體Unload PicWall(i + 128)Next iEnd SelectPassTag = CboPass.Listlndex初始化本局迷宮狀態(tài)Select Case PassTag 加載迷宮Case 1Fori = 1 To 16Load PicWall(i + 112)PicWall(i + 112).Visible = TruePicWall(i + 112) .L eft = 1250 + i * 250PicWall(i + 112).Top = 1750 Load PicWall(i + 128)PicWall(i + 128).Visible = TruePicWall(i + 128).Left = 1250 + i * 250PicWall(i + 128).Top = 3250Next iCase

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論