OS/Homework
[운영체제] 연결리스트를 이용한 LRU 알고리즘 만들기
달의요정루나
2022. 6. 27. 13:38
https://julian5383.tistory.com/75?category=926879
[운영체제] 연결리스트를 이용한 FIFO 알고리즘 만들기
case에 있는 파일들은 트레이스 파일입니다. #include #include typedef struct node { int num; struct node* next; }NODE; NODE* head; NODE* tail; void init() { head = (NODE*)malloc(sizeof(NODE)); tail =..
julian5383.tistory.com
위의 게시물에서 이어집니다.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define TRUE 1
#define FALSE 0
typedef struct node
{
int num;
struct node* next;
clock_t time;
}NODE;
NODE* head;
NODE* tail;
void init()
{
head = (NODE*)malloc(sizeof(NODE));
tail = (NODE*)malloc(sizeof(NODE));
head->next = tail;
tail->next = tail;
}
NODE* c_time() {
NODE* p = head->next;
NODE* s = p->next;
NODE* tmp = s;
clock_t start = clock();
double time1, time2;
while (s != tail)
{
time1 = (double)(start - tmp->time);
time2 = (double)(start - s->time);
if (time1 < time2)
{
tmp = s;
}
p = p->next;
s = p->next;
}
return tmp;
}
void insert(int num)
{
NODE* p = malloc(sizeof(NODE));
NODE* in_head = head;
NODE* in_node = in_head->next;
p->num = num;
if (head->next == tail)
{
p->next = tail;
head->next = p;
}
else
{
while (in_node != tail)
{
in_head = in_head->next;
in_node = in_head->next;
}
in_head->next = p;
p->next = in_node;
}
}
void delete(int num)
{
NODE* in_head = head;
NODE* in_node = in_head->next;
NODE* tmp;
NODE* new = (NODE*)malloc(sizeof(NODE));
new->num = num;
tmp = c_time(head, tail);
if (in_node != tmp)
{
in_head = in_head->next;
in_node = in_head->next;
}
in_head->next = new;
new->next = in_node->next;
new->time = clock();
free(in_node);
}
int search(int num)
{
NODE* p = head->next;
while (p != tail)
{
if (p->num == num)
{
return 1;
}
p = p->next;
}
return 0;
}
int length_list()
{
int length = 0;
NODE* p = head->next;
while (p != tail)
{
p = p->next;
length++;
}
return length;
}
int main()
{
FILE* fp = NULL;
int i, num, nc = 0;
int arr[100000];
int hit = 0;
int node;
init();
printf("1: tr.2c39.txt\n");
printf("2: tr.db2.txt\n");
printf("3: tr.sort.txt\n");
printf("4: r.zipf_20_80.txt\n");
printf("Input file name's(1,2,3,4 only): ");
scanf("%d", &i);
printf("Input Node Number(100, 500, 1000 only) : ");
scanf("%d", &node);
switch (i)
{
case 1:
fp = fopen("tr.2c39.txt", "r");
break;
case 2:
fp = fopen("tr.db2.txt", "r");
break;
case 3:
fp = fopen("tr.sort.txt", "r");
break;
case 4:
fp = fopen("tr.zipf_20_80.txt", "r");
break;
default:
printf("Error\n");
break;
}
while (fscanf(fp, "%d", &num) > 0) {
nc++;
if (search(num)) {
hit++;
}
else
{
while (1)
{
if (length_list() < node)
{
insert(num);
break;
}
else
{
delete(num);
break;
}
}
}
}
fclose(fp);
printf("Hit rate: %.2f\n", ((double)hit / (double)nc) * (double)100);
return 0;
}
구현한 FiFO 페이지 교체 알고리즘의 성능(hit rate)을 주어진 트레이스 파일을 이용하여 측정하시오.
1. trace: tr.2c39
노드 수 | replacement algorithms | |
FIFO | LRU | |
100 | 15.81 | 9.02 |
500 | 24.41 | 16.44 |
1,000 | 25.69 | 17.46 |
2. trace: tr.db2
노드 수 | replacement algorithms | |
FIFO | LRU | |
100 | 38.82 | 13.72 |
500 | 57.32 | 28.77 |
1,000 | 62.49 | 34.89 |
3. trace: tr.sort
노드 수 | replacement algorithms | |
FIFO | LRU | |
100 | 34.55 | 35.57 |
500 | 36.71 | 41.65 |
1,000 | 44.62 | 48.75 |
4. trace: tr.zipf_20_80
노드 수 | replacement algorithms | |
FIFO | LRU | |
100 | 27.81 | 28.13 |
500 | 36.82 | 39.52 |
1,000 | 41.61 | 44.26 |