1. 程式人生 > >儲存管理之分頁儲存管理方式C語言模擬(實驗五)

儲存管理之分頁儲存管理方式C語言模擬(實驗五)

       分頁儲存管理方式,將程式劃分為若干個大小固定的區域(頁),也把實體記憶體劃分為大小和頁相等的塊,通過頁表完成頁到塊的對映。

分頁儲存管理之C語言模擬:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define PAGE 20

int memory[PAGE];

struct page{ //描述程序資訊
    int process;
    int page_num;
    int user[PAGE];
    int f;

    page(){
        f = 0;
        process = 0;
        page_num = 0;
        memset(user,0,PAGE);
    }

};

struct page *Mem = new page[PAGE];

void init_memory()
{
    printf("請輸入一個4*5的二維矩陣,1代表已分配,0代表未分配\n");
    for(int i = 0; i < 4; i++)
        for(int j = 0; j < 5; j++)
        scanf("%d",&memory[i * 5 + j]);
}

void output()
{
    printf("當前記憶體的狀態\n");
    for(int i = 0; i < PAGE; i++){
        printf("%d ",memory[i]);
        if(!((i +1) % 5))
            printf("\n");
    }
    printf("\n");
}

void c_malloc() /*分配記憶體*/
{
    int page_num,page_no;
    printf("請輸入作業號和作業大小\n");
    scanf("%d%d",&page_no,&page_num);

    int sum = 0;
    for(int i = 0; i < PAGE; i++) /*檢查記憶體狀態,是否滿足作業需求*/
        if(!memory[i])
            sum ++;

    if(sum < page_num){ /*可用記憶體頁數小於作業需要的記憶體頁數則結束*/
        printf("記憶體空間不足\n");
        return;
    }
    int page_s;
    for( page_s = 0; page_s < PAGE; page_s++){ /*檢查是否存在相同作業號的作業*/
        if(Mem[page_s].f && Mem[page_s].process == page_no){ /*存在同名的給出提示並結束*/
            printf("存在同名的作業號\n");
            return;
        }

        if(Mem[page_s].f == 0){ /*作業狀態標記為使用*/
            Mem[page_s].f  = 1;
            break;
        }
    }

    Mem[page_s].process = page_no;
    Mem[page_s].page_num = page_num;

    for(int i = 0,j = 0; i < PAGE; i++) /*更發記憶體頁號為已使用*/
        if(!memory[i] && j < page_num){
             memory[i] = 1;
             Mem[page_s].user[j++] = i;
        }
}

void c_free() /*回收記憶體*/
{
    int page_no;
    printf("請輸入作業號和作業大小\n");
    scanf("%d",&page_no);

    int page_f;
    for(page_f = 0; page_f < PAGE; page_f++) /*檢查是否存在作業資訊*/
        if(Mem[page_f].f && Mem[page_f].process == page_no) /*若存在則結束*/
            break;

    if(page_f == PAGE - 1){ /*作業資訊不存在,提示並結束*/
        printf("作業資訊不存在\n");
        return;
    }

    for(int i = 0; i < Mem[page_f].page_num; i++) /*把矩陣置0*/
        memory[Mem[page_f].user[i]] = 0;


    Mem[page_f].f = 0; /*把作業標誌置0*/
}

int menu() /*選單*/
{
    printf("新增作業:1\n");
    printf("刪除作業:2\n");
    printf("輸出記憶體狀態:3\n");
    printf("結束作業:0\n");
    int menu;
    scanf("%d",&menu);

    return menu;
}

int main(int argc,char *argv[])
{
    init_memory(); /*初始化記憶體空間*/

    int t;

    while((t = menu())){

        if(t == 1)
            c_malloc(); /*分配記憶體*/
        else if(t == 2)
            c_free(); /*釋放記憶體*/
        else if(t == 3)
            output(); /*輸出記憶體資訊*/
    }

    return 0;
}


相關推薦

儲存管理儲存管理方式C語言模擬實驗

       分頁儲存管理方式,將程式劃分為若干個大小固定的區域(頁),也把實體記憶體劃分為大小和頁相等的塊,通過頁表完成頁到塊的對映。 分頁儲存管理之C語言模擬: #include <stdio.h> #include <string.h> #i

操作系統筆記內存管理,分段和段

分段式內存管理 筆記 關系 代碼 保護 系統 長度 段頁式內存管理 bit 基本內存管理: 進程占用空間必須連續,導致外部碎片以及附加的compaction 整個進程的swap in 和 swap out十分耗時。 解決:分頁 ->內存空間不必連續,無外部碎片,

SQL儲存過程用法

create  procedure [dbo].[psys_Paging]@sql text, --要執行的sql語句@page int,    --要顯示的頁碼@pageSize int,  --每頁的大小@pageCount int=0 out, --總頁數@recordCount int=0 out -

計算機原理學習6-- x86-32 CPU和記憶體管理管理

前言 上一篇我們瞭解了x86-16 CPU計算機的記憶體訪問方式,定址方式,以及基於MS-DOS的應用程式的記憶體佈局。這一篇會主要介紹32位處理器的記憶體訪問,記憶體管理以及應用程式的記憶體佈局。雖然目前64位CPU已經非常普及了,不過相對於32位的記憶體管理方式並沒

C++語言學習二十——自定義內存管理

single null allocated 析構函數 opera .get cat st2 argc C++語言學習(二十)——自定義內存管理 一、統計類對象中成員變量的訪問次數 mutable是為了突破const函數的限制而設計的,mutable修飾的成員變量將永遠處於可

Go語言基礎—— Go語言實現json資料檔案讀取與儲存

案例: package main import ( "os" "fmt" "encoding/json" "time" ) type Person2 struct { Name string Age int Sex string Hobby []string } fun

山東青年政治學院學生工作管理信息系統的設計與實現--文獻隨筆

集成 條件 隨筆 系統應用 lena 快捷 詳細 提高 定義 一、基本信息 標題:山東青年政治學院學生工作管理信息系統的設計與實現 時間:2014 出版源:山東大學 關鍵詞:學生工作管理信息系統; J2EE; 流程管理; 權限; 二、研究背景 問題定義:伴隨著高考入學率的提

C語言入門廿二預處理指令、巨集、條件編譯、檔案包含、typedef、const

預處理指令 什麼是預處理指令: 在我們的檔案翻譯成0和1之前做的操作我們稱之為預處理指令。一般情況預處理指令都是以#號開頭的。 巨集定義的格式 不帶引數的巨集定義: #define 巨集名 值 巨集定義的作用:      

C語言入門廿一static、extern關鍵字

區域性變數  概念: 區域性變數就是定義在函式, 程式碼塊和函式形參列表中的變數, 我們就稱之為區域性變數  作用範圍: 從定義的那一行開始一直直到遇到大括號結束或者遇到return為止  特點:     相同作用域範圍內不

C語言入門二十列舉

C語言中,列舉就是專門用於表示幾種固定型別的取值。列舉的本質就是基本資料型別, 就是整形。 列舉和結構體一樣, 要想定義列舉型別變數, 那麼必須先定義列舉型別。 列舉型別定義的格式   enum 列舉型別名稱 { 取值, }; // 1.

C語言入門十九結構體

太晚了(11點半了),明天繼續結構體 陣列: 是用於儲存一組相同型別的資料 結構體: 是用於儲存一組不同型別的資料 // 1.定義結構體型別 struct Person { // char name[20]; char *name;

C語言入門十八指標、字串、函式

如何利用指標運算元組 int ages[3] = {1, 3 , 5}; ages[0] = 998; printf("ages[0] = %i\n", ages[0]); int *p = ages; // int *p = &a

C語言入門十七指標的基本概念

如何定義指標變數      普通變數:      資料型別 變數名稱;            指標變數:  &nb

C語言入門十六字串

字串的基本概念 如何定義字串變數, 由於字串是同一種類型的資料組成,  並且是有序的。 而陣列就是用於儲存很多同一種類型的有序資料, 所以可以使用陣列來儲存字串。 注意: 字串變數和普通的字元陣列有一定的區別。 C語言規定, 字串必須以\0結尾(作為字串的結束符號), 所以

程式設計菜鳥到大佬路:C語言程式十二

第十二天學習精要 遞迴初步 遞迴 一個函式,自己呼叫自己,就是遞迴。 # include <iostream> using namespace std; int factorial(int n) // 函式返回n的階乘 { if (n ==

判斷迴文字串 20 c語言解答指標法

判斷迴文字串 (20 分) 本題要求編寫函式,判斷給定的一串字元是否為“迴文”。所謂“迴文”是指順讀和倒讀都一樣的字串。如“XYZYX”和“xyzzyx”都是迴文。 函式介面定義: bool palindrome( char *s ); 函式palindrome判斷輸入字串cha

Android 學習《第一行程式碼》第二版 筆記執行時許可權

一、執行時許可權功能 使用者不需要在安裝軟體的時候一次性授權所有申請的許可權,而是可以在軟體的使用過程中再對某一項許可權申請進行授權。 分類:普通許可權和危險許可權 我們在進行執行時許可權處理時使用的是許可權名,但是使用者一旦同意授權了,那麼該許可權所對應的

Android 遊戲開發主角的移動與地圖的平滑滾動

程式碼的實現方式       還是以人物向右移動為例,我們須要三個座標 一個是m_HeroPos 來儲存人物在地圖中的X座標  一個是 mScreenPos 來儲存人物在螢幕中的顯示座標 mMapPos 來儲存地圖在手機螢幕中的顯示座標,按鍵盤右鍵後人物在地圖中的座標加上8畫素(表示行走的步長),當人物的座標

儲存管理方式介紹及例題

一、引入   在儲存器管理中連續分配方式會形成許多“碎片”,雖然可以通過“緊湊”方法將許多碎片拼接成可用的大塊空間,但須為之付出很大的開銷,如果一個程序能夠直接分散地裝入到許多不相鄰接的分割槽中,便可充分的利用空間,無需再進行緊湊。基於這一思想便產生了離散分配方式,根據在離散分配時所分配地址空間的基本單位不

第四章 儲存管理方式

一,儲存管理的離散分配方式 基本分頁儲存管理 基本分段儲存管理 段頁式儲存管理 二,基本分頁儲存管理 離散分配記憶體: 作業規定大小劃分成小份;記憶體也按同樣大小劃分成小份 作業的任一小份可分散放入記憶體任意未使用的小份 1)頁面的概念 記憶體劃分成多個小單元,