-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathdisk.cpp
More file actions
101 lines (76 loc) · 2.22 KB
/
Copy pathdisk.cpp
File metadata and controls
101 lines (76 loc) · 2.22 KB
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
/*
* disk.cpp
*
* Created on: Nov 3, 2012
* Author: vr178
*/
#include "disk.h"
disk::disk() {
// TODO Auto-generated constructor stub
// Insert page
int get_free_block(){
free_block_count--;
int write_pointer=free_block_queue.front()*block_size;
free_set.erase(free_block_queue.front());
free_block_queue.pop();
if(free_block_queue.size()<5){
garbage_collect();
}
return write_pointer;
}
int get_free_block_count()
{
return free_block_count;
}
void increment_free_block_count()
{
free_block_count++;
}
void decrement_free_block_count()
{
if(CACHE_POLICY==0)
reclaim_block=find_max_index(dirty_count,no_blocks,write_pointer/no_blocks,free_set);
if(CACHE_POLICY==1)
reclaim_block=find_min_index(dirty_count,no_blocks,write_pointer/no_blocks,free_set);
if(CACHE_POLICY==2)
{
int k=rand()%32;
while(k==(write_pointer/no_blocks) || free_set.find(k)!=free_set.end())
k=rand()%32;
reclaim_block=k;
}
cout<<"reclaim Block"<<reclaim_block<<"Free Block queue"<<free_block_queue.size();
free_block_count++;
dirty_count[reclaim_block]=0;
for(int j=0;j<block_size;j++)
{
if(write_pointer%block_size==0)
{
free_block_count--;
write_pointer=free_block_queue.front()*block_size;
free_set.erase(free_block_queue.front());
free_block_queue.pop();
}
map<int,int>::iterator it=block_map.find((reclaim_block*block_size)+j);
if(it!=block_map.end())
{
int mem_address=it->second;
assert(ad_map.find(it->second)!=ad_map.end());
ad_map.erase(it->second);
block_map.erase(reclaim_block*block_size+j);
ad_map.insert(pair<int,int>(mem_address,write_pointer));
block_map.insert(pair<int,int>(write_pointer,mem_address));
write_pointer++;
host_write++;
}
block_map.erase(reclaim_block*block_size+j);
}
free_block_queue.push(reclaim_block);
free_set.insert(reclaim_block);
}
void garbage_collect(){
}
}
disk::~disk() {
// TODO Auto-generated destructor stub
}