[Tasks] 운영체제 HW4
💼

[Tasks] 운영체제 HW4

카테고리
📒 Assignment
작성자
박용성박용성
작성일
2024년 06월 02일
태그
C
Make

📌 문제

💡
FIFO page replace algorithm 과 NRU page replace algorithm을 시뮬레이션 하는 sim 프로그램을 작성하시오.
  1. 첨부파일 access.list 파일에는 어떤 시스템에서 프로세스들이 접근하는 physical page number와 operation(read/write)의 로그가 있다. Physical page number는 0~1000 사이의 숫자이다.
  1. 이를 이용하여 physical memory의 page replace algorithm을 시뮬레이션하여 page fault가 몇 번 발생하는지 출력하시오.
  1. nru의 경우 동일한 class의 page가 여러 개인 경우 LRU를 따르며, R/M bit은 주기적으로 초기화되지 않는다고 가정한다.
  1. sim 프로그램은 두 개의 parammeters를 받는다.
    1. 1번 parameter는 fifo 또는 nru 이며, 이에 따라 어떤 algorithm으로 replacement를 수행할지 결정한다.
    2. 2번 parameter는 physical frame의 수를 받는다.
  1. 각 algorithm으로 시뮬레이션을 수행 후 아래 예제와 같이 결과를 출력한다.
 

🔍 실행 예제

[root@iter5 ~]$ ./sim nru 100 Total number of access: 50000 Total number of read: 30000 Total number of write: 20000 Number of page hits: 40000 Number of page faults: 10000 Page fault rate: 10000/50000 = 20%
 

📌 문제 해결

1️⃣ Makefile 생성

all: sim sim: sim.c gcc -o sim sim.c clean: rm -f sim # PHONY 타겟 지정 .PHONY: all clean
 

2️⃣ access.list 파일 읽어오도록 설정

💡
예제가 달라질 경우를 대비해 파일을 읽어오도록 설정했습니다.
// 파일 읽기 함수 // 혹시 5만개가 입력이 아닐 경우를 대비해 동적으로 할당하도록 함 void read_file(const char *filename, List **access_list, int *access_count) { FILE *fp = fopen(filename, "r"); if (fp == NULL) { fprintf(stderr, "파일 열기 실패했습니다.\n"); exit(EXIT_FAILURE); } int size = 0; int capacity = 2; // 처음 사이즈 2로 설정 *access_list = (List *)malloc(capacity * sizeof(List)); if (*access_list == NULL) { perror("메모리 할당 오류입니다.\n"); fclose(fp); exit(EXIT_FAILURE); } while (1) { // 용량 부족할 시 2배로 늘리기 if (size >= capacity) { capacity *= 2; List *new_array = (List *)realloc(*access_list, capacity * sizeof(List)); if (new_array == NULL) { perror("메모리 재할당 오류입니다.\n"); free(*access_list); fclose(fp); exit(EXIT_FAILURE); } *access_list = new_array; } int pageNum; char oper[6]; if (fscanf(fp, "%d %5s", &pageNum, oper) != 2) { // 끝줄이면 break break; } // 읽은 값 저장 (*access_list)[size].pageNum = pageNum; (*access_list)[size].oper = (oper[0] == 'r') ? 'r' : 'w'; size++; } fclose(fp); *access_count = size; // 사이즈가 몇인지 저장 (여기선 5만개) }
 

댓글

guest