日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

模拟基本分页存储

發(fā)布時間:2023/12/13 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 模拟基本分页存储 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

介紹

data.h

#ifndef _Data_h_ #define _Data_h_#include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h>#define LIST_INIT_SIZE 10 #define LISTINCREMENT 2 #define true 1 #define false 0 #define PCBType PCB #define Status int #define OK 1 #define ERROR 0 #define NAME_MAXSIZE 20 #define PCB_Num 5 #define LIST_INITSIZE 10 #define PartiType PartitionInfo #define BlockNumType PageData //分頁信息 #define TotalMemory 512 //KB #define PageSize 16 //通常為1 ~ 8KB //進(jìn)程申請內(nèi)存的大小[16, 256]KB 256 / 8 = 32頁typedef enum {Unallocated, Allocated }DistributState, PartitionSt;typedef struct {//分區(qū)號用數(shù)組下標(biāo)代替int PartStartAddr;char Name[NAME_MAXSIZE];//若為空,則分區(qū)空閑 }PartitionInfo;typedef struct {PartitionInfo *elem;int listsize; //表容量int length; //元素個數(shù) }SqList_f, PartTable; //分區(qū)使用說明表typedef struct { int BlockNum; //塊號DistributState DistbutSt; //分配狀態(tài) }PageData;typedef struct {PageData *elem; int listsize; int length; }SqList_y, PageTable; //頁表typedef struct {char Name[NAME_MAXSIZE]; //進(jìn)程名int MemorySize; //內(nèi)存的大小PageTable *pPagetable; //頁表指針 }PCB;typedef struct Node {PCBType data;struct Node * Next; }LNode, *LinkList, *PCBList;#endif

list.h

#ifndef _List_h_ #define _List_h_#include "Data.h"//******* 鏈表 *******// Status InitLinkList(LinkList *L); void PCBAssign(PCBType *e1, PCBType e2); Status GetElemt_L(LinkList L,int i,PCBType *e); Status ListInsert_L(LinkList L,PCBType e); Status ListDelete_L(LinkList L,int i,PCBType *e);//****** 分區(qū)使用說明表 ******// void PartiAssign_f(PartiType *e1, PartiType e2); Status InitList_f(SqList_f *L); Status ListInsert_f(SqList_f *L,int i,PartiType e); Status ListDelete_f(SqList_f *L,int i,PartiType *e);//****** 頁表 ******// void PartiAssign_y(BlockNumType *e1, BlockNumType e2); Status InitList_y(SqList_y **L); Status ListInsert_y(SqList_y *L,int i,BlockNumType e); Status ListDelete_y(SqList_y *L,int i,BlockNumType *e);#endif

memorymanage.h

#ifndef _MemoryManage_h_ #define _MemoryManage_h_#include "List.h"//***** PCB 鏈 表 操 作 *****// Status InsertProcess(LinkList Q,PCBType e); Status DeleteProsess(LinkList Q,int i,PCBType *e); //***** 分 區(qū) 表 操 作 *****// //插入分區(qū)表元素 Status InsertTable_f(SqList_f *L, int i, PartiType e); //刪除分區(qū)表元素 Status DeleteTable_f(SqList_f *L, int i, PartiType *e);//****** 頁 表 操 作 ******// //插入頁表元素 Status InsertTable_y(SqList_y *L, int i, BlockNumType e); //刪除頁表元素 Status DeleteTable_y(SqList_y *L, int i, BlockNumType *e); Status LoadPages(PageTable *L, int size);Status MallocMemory(PCB *pe, SqList_f *pPartTable, int *arr); Status SelectPart(PCB* pPCB, SqList_f *pPartTable,int *arr); void SearchSpace(PCBList PCBdata, SqList_f *partTable); void FreeMemory(int *arr, int len, SqList_f *pPartTable); void InitAllocation(PCBList PCBdata, PartTable *partTable); void PrintProQueue(LinkList L); void PrintPartTable(PartTable L);#endif

實現(xiàn)

#include "List.h"//******* 鏈表 *******// Status InitLinkList(LinkList *L) {*L = (LinkList)malloc(sizeof(LNode));strcpy((*L)->data.Name, "");(*L)->Next = NULL;return OK; }void PCBAssign(PCBType *e1, PCBType e2) {strcpy(e1->Name,e2.Name);e1->MemorySize = e2.MemorySize;e1->pPagetable = e2.pPagetable; }Status GetElemt_L(LinkList L,int i,PCBType *e) {LinkList p = L->Next; //指向第j個結(jié)點int j = 1; //從第一個開始往后找while ( p && j < i ) //p不為空且j < i{p = p->Next;++j;} //p為空,說明鏈表循環(huán)結(jié)束,也沒有到第i個結(jié)點 j==iif (!p || j > i) //因為此處對i 沒有做判斷 如果 i==0 或 負(fù)數(shù) 條件成立//對于 i == j == 1 的情況則不用循環(huán)正好 返回{return ERROR;}*e = p->data; //通過尋址改變了 該地址內(nèi)存中元素的值return OK; } //鏈表中按照優(yōu)先級:從大到小排序插入 Status ListInsert_L(LinkList L,PCBType e) //這樣修改應(yīng)該不對 p = *L出錯 {LinkList p = L, s;while (p->Next) p = p->Next;s = (LinkList)malloc(sizeof(LNode));PCBAssign(&s->data, e);s->Next = p->Next;p->Next = s;return OK; }Status ListDelete_L(LinkList L,int i,PCBType *e) {LinkList p = L, q;int j = 0;while (p->Next && j < i-1){p = p->Next; ++j;}if(!p->Next || j > i - 1)return ERROR;q = p->Next;p->Next = q->Next;PCBAssign(e, q->data);free(q);return OK; }//****** 分區(qū)使用說明表 ******// void PartiAssign_f(PartiType *e1, PartiType e2) {e1->PartStartAddr = e2.PartStartAddr;strcpy(e1->Name, e2.Name); }Status InitList_f(SqList_f *L) {//構(gòu)造一個空的線性表LL->elem = (PartiType *)malloc((LIST_INIT_SIZE)*sizeof(PartiType));if(!L->elem) return ERROR; //存儲分配失敗L->length = 0; //空表長度為0L->listsize = LIST_INIT_SIZE; //初始存儲的容量return OK; }//在順序線性表L中第i個位置之前插入新的元素e Status ListInsert_f(SqList_f *L,int i,PartiType e) {//在順序線性表L中第i個位置之前插入新的元素e//i的合法值為1 <= i <= ListLength_Sq(L)+1PartiType *q, *p, *newbase;if(i < 1 || i > L->length + 1 ) return ERROR; //i值不合法if(L->length >= L->listsize){ //當(dāng)前存儲空間已滿,增加分配newbase = (PartiType *)realloc(L->elem,(L->listsize + LISTINCREMENT)*sizeof(PartiType));if(!newbase) return ERROR; //存儲分配失敗L->elem = newbase; //新基址L->listsize += LISTINCREMENT; //增加存儲容量} q = &(L->elem[i - 1]); //q為插入位置for(p = &(L->elem[L->length-1]);p >= q; --p)PartiAssign_f((p+1),*p); //插入位置及之后的元素右移PartiAssign_f(q ,e); //插入eL->length++;return OK; }//在順序線性表L中刪除第i個元素,并用e返回其值 Status ListDelete_f(SqList_f *L,int i,PartiType *e) {//在順序線性表L中刪除第i個元素,并用e返回其值//i的合法值為1 <= i <= ListLength_Sq(L)PartiType *p,*q;if((i < 1) || (i > L->length)) return ERROR; //i值不合法p = &(L->elem[i-1]); //p為被刪除元素的位置PartiAssign_f(e, *p); //將被刪除元素的值賦給e (待定)q = L->elem + L->length-1; //移動到表尾元素的位置for (++p;p<=q;++p)PartiAssign_f((p-1), *p); //被刪除元素之后的元素左移L->length--;return OK; }//****** 頁表 ******//void PartiAssign_y(BlockNumType *e1, BlockNumType e2) {(*e1).BlockNum = e2.BlockNum;(*e1).DistbutSt = e2.DistbutSt; }Status InitList_y(SqList_y **L) {//構(gòu)造一個空的線性表L(*L) = (PageTable *)malloc(sizeof(PageTable));//不可缺少(*L)->elem = (BlockNumType *)malloc((LIST_INIT_SIZE)*sizeof(BlockNumType));if(!(*L)->elem) return ERROR; //存儲分配失敗(*L)->length = 0; //空表長度為0(*L)->listsize = LIST_INIT_SIZE; //初始存儲的容量return OK; }//在順序線性表L中第i個位置之前插入新的元素e Status ListInsert_y(SqList_y *L,int i,BlockNumType e) {//在順序線性表L中第i個位置之前插入新的元素e//i的合法值為1 <= i <= ListLength_Sq(L)+1BlockNumType *q, *p, *newbase;if(i < 1 || i > L->length + 1 ) return ERROR; //i值不合法if(L->length >= L->listsize){ //當(dāng)前存儲空間已滿,增加分配newbase = (BlockNumType *)realloc(L->elem,(L->listsize + LISTINCREMENT)*sizeof(BlockNumType));if(!newbase) return ERROR; //存儲分配失敗L->elem = newbase; //新基址L->listsize += LISTINCREMENT; //增加存儲容量} q = &(L->elem[i - 1]); //q為插入位置for(p = &(L->elem[L->length-1]);p >= q; --p)PartiAssign_y((p+1),*p); //插入位置及之后的元素右移PartiAssign_y(q ,e); //插入eL->length++;return OK; }//在順序線性表L中刪除第i個元素,并用e返回其值 Status ListDelete_y(SqList_y *L,int i,BlockNumType *e) {//在順序線性表L中刪除第i個元素,并用e返回其值//i的合法值為1 <= i <= ListLength_Sq(L)BlockNumType *p,*q;if((i < 1) || (i > L->length)) return ERROR; //i值不合法p = &(L->elem[i-1]); //p為被刪除元素的位置PartiAssign_y(e, *p); //將被刪除元素的值賦給e (待定)q = L->elem + L->length-1; //移動到表尾元素的位置for (++p;p<=q;++p)PartiAssign_y((p-1), *p); //被刪除元素之后的元素左移L->length--;return OK; }

memorymanage.c

#include "MemoryManage.h"//***** PCB鏈表操作 *****// Status InsertProcess(LinkList Q,PCBType e) {return ListInsert_L(Q, e); }Status DeleteProsess(LinkList Q,int i,PCBType *e) {return ListDelete_L(Q ,i,e); }//***** 分區(qū)表操作 *****// Status InsertTable_f(SqList_f *L, int i, PartiType e) {return ListInsert_f(L,i, e); }Status DeleteTable_f(SqList_f *L, int i, PartiType *e) {return ListDelete_f(L, i, e); }//***** 頁表操作 *****// Status InsertTable_y(SqList_y *L, int i, BlockNumType e) {return ListInsert_y(L,i, e); }Status DeleteTable_y(SqList_y *L, int i, BlockNumType *e) {return ListDelete_y(L, i, e); }Status LoadPages(PageTable *L, int size) {int i, pageNum = ceil( size * 1.0 / PageSize) ;PageData e = {-1, Unallocated};for (i = 0; i < pageNum; i++){if(!InsertTable_y(L, L->length + 1, e))return ERROR;}return OK;; }//若返回0,則代表錯誤 Status SelectPart(PCB* pPCB, SqList_f *pPartTable,int *arr) {/ 以下補充 /int i = 0, j = 0;while(i < pPCB->pPagetable->length && j < pPartTable->length){if(pPCB->pPagetable->elem[i].DistbutSt == Unallocated){if(!strcmp(pPartTable->elem[j].Name, "")){arr[i] = j;++i;++j;} else {++j;}} else {++i;}}if(i == pPCB->pPagetable->length){return OK;}return ERROR; }Status MallocMemory(PCB *pe, SqList_f *pPartTable, int *arr) {int i, pageNum ;以下補充 /for(i = 0; i < pe->pPagetable->length; ++i){if(pe->pPagetable->elem[i].DistbutSt == Unallocated){pe->pPagetable->elem[i].BlockNum = arr[i];pe->pPagetable->elem[i].DistbutSt = Allocated;strcpy(pPartTable->elem[arr[i]].Name, pe->Name);}}return ERROR; }void InitAllocation(PCBList PCBdata, PartTable *pPartTable) {LNode *p;int pos, arr[20] = {0};p = PCBdata->Next;while (p){if(p->data.pPagetable->elem[0].DistbutSt == Unallocated){if(SelectPart(&(p->data), pPartTable, arr)){MallocMemory(&(p->data), pPartTable, arr);}}p = p->Next;} }//該釋放進(jìn)程只在結(jié)束進(jìn)程時用到,因此不用管進(jìn)程信息 void FreeMemory(int *arr, int len, SqList_f *pPartTable) {int i;以下補充 /for(i = 0; i < len; ++i){strcpy(pPartTable->elem[arr[i]].Name, "");} }void SearchSpace(PCBList PCBdata, SqList_f *partTable) {int pos, arr[20] = {0};LNode *p;p = PCBdata->Next;while (p){if(p->data.pPagetable->elem[0].DistbutSt == Unallocated){if(SelectPart(&(p->data), partTable, arr)){MallocMemory(&(p->data), partTable, arr);}}p = p->Next;}}void PrintProQueue(LinkList L) {int i = 0;L = L->Next;while(L){printf(" -----------------------------\n");printf("|進(jìn)程名 | 申請大小 |\n");printf("| %s | %4d |\n", L->data.Name, L->data.MemorySize);printf("%s頁表信息如下:\n| 頁號 | 塊號 | 是否分配 |\n", L->data.Name);for (i = 0; i < L->data.pPagetable->length; i++)printf("| %4d | %4d | %4s |\n", i , L->data.pPagetable->elem[i].BlockNum,L->data.pPagetable->elem[i].DistbutSt == Allocated? "是" : "否");L = L->Next;}printf(" ----------------------------------------\n"); }void PrintPartTable(PartTable L) {int i = 0, j = 0;printf(" ----------------------------------------\n");printf("|分區(qū)號 | 起始位置 | 分區(qū)大小 | 是否分配 |\n");for (i = 0; i < L.length; ++i)printf("| %2d | %4d | %4d | %4s |\n",i , L.elem[i].PartStartAddr, PageSize , strcmp(L.elem[i].Name, "") ? L.elem[i].Name :"否");printf(" ----------------------------------------\n"); }

main

#include "MemoryManage.h"/* 實驗08 基本分頁 */void InputPCBData(PCBList * pPCBdata) {PCBType e = {{0}, 0, NULL};strcpy(e.Name,"P1");e.MemorySize = 16;InitList_y(&(e.pPagetable));LoadPages(e.pPagetable, e.MemorySize);InsertProcess(*pPCBdata,e);strcpy(e.Name,"P2");e.MemorySize = 32;InitList_y(&(e.pPagetable));LoadPages(e.pPagetable, e.MemorySize);InsertProcess(*pPCBdata,e);strcpy(e.Name,"P3");e.MemorySize = 48;InitList_y(&(e.pPagetable));LoadPages(e.pPagetable, e.MemorySize);InsertProcess(*pPCBdata,e);strcpy(e.Name,"P4");e.MemorySize = 96;InitList_y(&(e.pPagetable));LoadPages(e.pPagetable, e.MemorySize);InsertProcess(*pPCBdata,e);strcpy(e.Name,"P5");e.MemorySize = 100;InitList_y(&(e.pPagetable));LoadPages(e.pPagetable, e.MemorySize);InsertProcess(*pPCBdata,e); }void SettingPage(PartTable * pPartdata) {PartiType se = {0, {0}};int Num = (512 - 16) / PageSize , i;for (i = 0; i < Num; ++i){se.PartStartAddr = 16 + i * PageSize;InsertTable_f(pPartdata, i + 1, se);} } //0 - 15Kb 操作系統(tǒng)占用 總大小512KB int main(void) {PCBList PCBdata; //PCBdata里面存放原始PCB數(shù)據(jù)PartTable partTable; //分區(qū)表char PcbName[NAME_MAXSIZE] = {0}, choice;PCBType PCBe = {{0}, 0, NULL};PartiType Parte = {0, 0};PCBType *pcb = NULL;LNode *p; int i, size, pos, arr[20] = {0}, k = 0;InitList_f(&partTable);SettingPage(&partTable);InitLinkList(&PCBdata);InputPCBData(&PCBdata);InitAllocation(PCBdata, &partTable);PrintProQueue(PCBdata);PrintPartTable(partTable);while(true){system("cls");PrintProQueue(PCBdata);PrintPartTable(partTable);printf(" ================================================\n");printf("| 1.結(jié) 束 進(jìn) 程 |\n");printf("| 2.添 加 進(jìn) 程 |\n");printf("| 3.退 出 系 統(tǒng) |\n");printf(" ================================================\n");printf("請選擇:");fflush(stdin);scanf("%c",&choice);switch (choice){case '1':printf("要結(jié)束的進(jìn)程名:");scanf("%s",PcbName);for (p = PCBdata->Next, i = 1; p && strcmp(PcbName, p->data.Name); i++, p = p->Next);if(!p){printf("進(jìn)程名輸入錯誤!\n");break;}DeleteProsess(PCBdata, i, &PCBe);k = 0;for(i = 0; i < partTable.length; i++){if(!strcmp(PcbName, partTable.elem[i].Name)){arr[k++] = i;}}FreeMemory(arr, k, &partTable);SearchSpace(PCBdata, &partTable);break;case '2':printf("請輸入添加的進(jìn)程名,進(jìn)程所占內(nèi)存大小:");scanf("%s%d",PcbName , &size);strcpy(PCBe.Name, PcbName);PCBe.MemorySize = size;InitList_y(&(PCBe.pPagetable));LoadPages(PCBe.pPagetable, PCBe.MemorySize);if(SelectPart(&(PCBe), &partTable, arr))MallocMemory(&(PCBe), &partTable, arr);InsertProcess(PCBdata, PCBe);break;case '3':return 0;default:printf("選擇項輸入錯誤,重新選擇!\n");break;}PrintProQueue(PCBdata);PrintPartTable(partTable);system("pause");}return 0; }

?

總結(jié)

以上是生活随笔為你收集整理的模拟基本分页存储的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。