📜  门| GATE 2017 MOCK II |第35章(1)

📅  最后修改于: 2023-12-03 15:42:10.218000             🧑  作者: Mango

门| GATE 2017 MOCK II |第35章

简介

GATE 2017 MOCK II 是一个面向计算机科学领域的模拟考试,本次考试中涵盖了多种计算机科学与工程相关的知识领域。第35章主要考察了操作系统、进程管理、内存管理等相关知识点。

题目描述

第35章一共包含了2道题目,其中第1道题目主要考察了操作系统的进程管理机制,第2道题目主要考察了操作系统的内存管理机制。

题目1:进程管理

题目描述:

假设某个系统有4个并发进程:P1、P2、P3和P4。进程P1需要5个单位的时间完成,进程P2需要4个单位的时间完成,进程P3需要2个单位的时间完成,进程P4需要1个单位的时间完成。这些进程的到达时间分别是0、1、2和3个单位时间。那么,采用SRTF(最短剩余时间优先)调度算法,这4个进程的顺序是?

代码示例:

int main(){
    int p[4]={0,1,2,3};
    int arrive_time[4]={0,1,2,3};
    int burst_time[4]={5,4,2,1};

    int remain_time[4],order[4],waiting_time[4],turnaround_time[4],completion_time[4];

    for(int i=0;i<4;i++){
        remain_time[i]=burst_time[i];
    }

    int total_time=0;
    int shortest_job=-1,min_remain_time=INT_MAX;
    bool flag=false;
    int time_slice=1;
    int completed_process_count=0;

    while(completed_process_count!=4){
        for(int i=0;i<4;i++){
            if(arrive_time[i]<=total_time && remain_time[i]<min_remain_time && remain_time[i]>0){
                min_remain_time=remain_time[i];
                shortest_job=i;
                flag=true;
            }
        }

        if(!flag){
            total_time++;
            continue;
        }

        remain_time[shortest_job]-=time_slice;
        min_remain_time=remain_time[shortest_job];

        if(min_remain_time==0){
            min_remain_time=INT_MAX;
        }

        if(remain_time[shortest_job]==0){
            completed_process_count++;
            completion_time[shortest_job]=total_time+time_slice;
            waiting_time[shortest_job]=completion_time[shortest_job]-burst_time[shortest_job]-arrive_time[shortest_job];
            if(waiting_time[shortest_job]<0){
                waiting_time[shortest_job]=0;
            }
        }

        total_time+=time_slice;
    }

    for(int i=0;i<4;i++){
        int min=INT_MAX;
        int index;
        for(int j=0;j<4;j++){
            if(completion_time[j]<min){
                min=completion_time[j];
                index=j;
            }
        }
        order[i]=index;
        completion_time[index]=INT_MAX;
    }

    printf("Gantt Chart:\n");
    for(int i=0;i<4;i++){
        printf("P%d | %d ",order[i]+1,completion_time[order[i]]);
    }

    printf("\n");
    printf("Process\tArrival Time\tBurst Time\tWaiting Time\tTurnaround Time\n");

    int total_waiting_time=0;
    int total_turnaround_time=0;

    for(int i=0;i<4;i++){
        turnaround_time[i]=burst_time[i]+waiting_time[i];
        total_waiting_time+=waiting_time[i];
        total_turnaround_time+=turnaround_time[i];

        printf("P%d\t\t%d\t\t%d\t\t%d\t\t%d\n",i+1,arrive_time[i],burst_time[i],waiting_time[i],turnaround_time[i]);
    }

    float average_waiting_time=(float)total_waiting_time/4;
    float average_turnaround_time=(float)total_turnaround_time/4;

    printf("Average Waiting Time: %.2f\n",average_waiting_time);
    printf("Average Turnaround Time: %.2f\n",average_turnaround_time);

    return 0;
}
题目2:内存管理

题目描述:

将一个进程从外存调入内存,需要1毫秒。每次从内存中换出一个进程到外存,需要1毫秒。一个进程被调入内存后,它必须先驻留在内存中一段时间后才能被驱逐,这段时间为5毫秒。物理内存容量为3个页帧,已被占用的页帧中包括了进程P1的页表项(第1个虚拟页调入内存中了)和进程P2的页表项(第2、3个虚拟页调入内存中了)。假设要将进程P3的第1个虚拟页调入内存,那么此时,选择哪个页帧换出,才能保证执行时间最短?

代码示例:

#include <bits/stdc++.h>
using namespace std;

int main(){
    int memory_capacity=3;

    int page_frames[3];
    for(int i=0;i<memory_capacity;i++){
        page_frames[i]=-1;
    }

    int page_table[3][4]={
        {0,1,-1,-1},
        {2,3,4,-1},
        {-1,-1,-1,-1}
    };

    int page_to_add=1;

    int page_to_remove,process_number,page_number;

    for(int i=0;i<memory_capacity;i++){
        if(page_frames[i]==-1){
            page_frames[i]=page_to_add;
            process_number=page_table[i][0];
            page_number=page_table[i][1];
            break;
        }
    }

    int completion_time=1;

    for(int i=0;i<memory_capacity;i++){
        if(page_frames[i]!=page_to_add){
            if(completion_time<page_table[i][2]){
                completion_time=page_table[i][2];
            }
        }
    }

    completion_time+=5;

    printf("Completion Time: %d\n",completion_time);

    for(int i=0;i<memory_capacity;i++){
        printf("Page Frame %d: P%d/%d\n",i+1,page_table[i][0],page_table[i][1]);
    }

    printf("Remove Page Frame: %d\n",page_to_remove+1);

    return 0;
}

以上为本次模拟考试的两道题目,希望大家可以成功通过考试,获得理想的成绩。