📅  最后修改于: 2023-12-03 15:42:10.218000             🧑  作者: Mango
GATE 2017 MOCK II 是一个面向计算机科学领域的模拟考试,本次考试中涵盖了多种计算机科学与工程相关的知识领域。第35章主要考察了操作系统、进程管理、内存管理等相关知识点。
第35章一共包含了2道题目,其中第1道题目主要考察了操作系统的进程管理机制,第2道题目主要考察了操作系统的内存管理机制。
题目描述:
假设某个系统有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;
}
题目描述:
将一个进程从外存调入内存,需要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;
}
以上为本次模拟考试的两道题目,希望大家可以成功通过考试,获得理想的成绩。