-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlru.c
153 lines (128 loc) · 3.09 KB
/
lru.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
// LRU의 hit-ratio를 출력하는 프로그램
// 1.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// 2.
#define MAX_CACHE_SIZE 8192
#define TRACE_FILE_NAME "ref_stream.txt"
// unsigned long은 최대 10자리 + 마지막 '\n'문자
#define MAX_DATA_LENGTH 11
// 3.
typedef unsigned long element;
typedef struct buffer
{
element blkno;
struct buffer *next;
struct buffer *prev;
} buffer;
// 4.
// 전역변수 선언
buffer cache_buffer[MAX_CACHE_SIZE];
buffer lrulist;
double hit_num;
double data_num;
// cache_buffer가 가득 찼는지 판단
int count_block;
// 5.
// 함수 프로토타입
element char_to_element(char*);
buffer* isthere(element);
void init(buffer*);
int delete(buffer*);
void insert(element, int);
void move(buffer*);
// 6.
int main(int argc, char *argv[])
{
// 파일이 정상적으로 열리는지 확인
FILE *fp;
if((fp = fopen(TRACE_FILE_NAME, "r")) == NULL)
{
fprintf(stderr, "File open error!\n");
exit(1);
}
else
printf("Let's start simulation!\n");
// 시뮬레이션 시작
double start, stop;
char buf[MAX_DATA_LENGTH];
init(&lrulist);
start = clock();
for(char *p = fgets(buf, MAX_DATA_LENGTH, fp); p != NULL; p = fgets(buf, MAX_DATA_LENGTH, fp))
{
data_num += 1.0;
element data = char_to_element(buf);
buffer *check = isthere(data);
if(check == NULL)
{
if(count_block == MAX_CACHE_SIZE)
{
int offset = delete(lrulist.prev);
insert(data, offset);
}
else
{
insert(data, count_block);
count_block++;
}
}
else
{
hit_num += 1.0;
move(check);
}
}
stop = clock();
printf("Hit-ratio of LRU : %f%%\n", (hit_num / data_num) * 100.0);
printf("Time consuming without Hashing : %.2fsec\n", (double)(stop - start) / CLOCKS_PER_SEC);
fclose(fp);
return 0;
}
// 7.
element char_to_element(char *buf)
{
element data = 0UL;
for(int i = 0; i < MAX_DATA_LENGTH; i++)
if(buf[i] == '\n')
break;
else
data = data * 10UL + (element)(buf[i] - '0');
return data;
}
buffer* isthere(element data)
{
for(buffer *p = lrulist.next; p != &lrulist; p = p->next)
if(p->blkno == data)
return p;
return NULL;
}
void init(buffer *lrulist)
{
lrulist->next = lrulist;
lrulist->prev = lrulist;
}
int delete(buffer *removed)
{
removed->prev->next = removed->next;
removed->next->prev = removed->prev;
return removed - cache_buffer;
}
void insert(element data, int offset)
{
buffer *newnode = cache_buffer + offset;
newnode->blkno = data;
newnode->next = lrulist.next;
newnode->prev = &lrulist;
lrulist.next->prev = newnode;
lrulist.next = newnode;
}
void move(buffer *node)
{
node->prev->next = node->next;
node->next->prev = node->prev;
node->next = lrulist.next;
node->prev = &lrulist;
lrulist.next->prev = node;
lrulist.next = node;
}