Windows/Linux模拟实现FIFO或LRU淘汰算法代码
时间: 2024-01-09 16:03:54 浏览: 29
对于Windows系统,实现FIFO淘汰算法的代码如下:
```C++
#include <iostream>
#include <queue>
using namespace std;
int main() {
queue<int> q;
int capacity = 3; // 设置FIFO队列的容量为3
while (true) {
int num;
cin >> num; // 输入一个数
if (q.size() < capacity) { // 队列未满时,直接将数加入队列
q.push(num);
} else { // 队列已满时,弹出队首元素,将新数加入队尾
cout << "弹出元素:" << q.front() << endl;
q.pop();
q.push(num);
}
cout << "队列元素:";
while (!q.empty()) { // 输出当前队列中的元素
cout << q.front() << " ";
q.pop();
}
cout << endl;
}
return 0;
}
```
实现LRU淘汰算法的代码如下:
```C++
#include <iostream>
#include <list>
#include <unordered_map>
using namespace std;
int main() {
list<int> l;
unordered_map<int, list<int>::iterator> map;
int capacity = 3; // 设置LRU缓存的容量为3
while (true) {
int num;
cin >> num; // 输入一个数
auto it = map.find(num);
if (it != map.end()) { // 数已在缓存区,将其移动到链表尾部
l.erase(it->second);
l.push_back(num);
map[num] = prev(l.end());
} else {
if (l.size() >= capacity) { // 缓存区已满,弹出最久未使用的数
cout << "弹出元素:" << l.front() << endl;
map.erase(l.front());
l.pop_front();
}
l.push_back(num);
map[num] = prev(l.end());
}
cout << "链表元素:";
for (auto x : l) { // 输出当前链表中的元素
cout << x << " ";
}
cout << endl;
}
return 0;
}
```
对于Linux系统,可以使用共享内存实现FIFO或LRU淘汰算法,其中FIFO算法的实现与Windows类似,在此不再赘述。下面是LRU算法的实现代码:
```C++
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <unistd.h>
#define SHM_KEY 0x1234
#define CAPACITY 3 // LRU缓存的容量
typedef struct {
int data[CAPACITY];
int len;
} Buffer;
void print_buffer(Buffer *buf) {
printf("缓存区元素:");
for (int i = 0; i < buf->len; ++i) {
printf("%d ", buf->data[i]);
}
printf("\n");
}
int main() {
int shmid;
Buffer *buf;
int capacity = CAPACITY;
int size = sizeof(Buffer);
key_t key = SHM_KEY;
// 创建共享内存
if ((shmid = shmget(key, size, 0666 | IPC_CREAT)) == -1) {
perror("shmget");
return -1;
}
// 将共享内存连接到当前进程的地址空间
if ((buf = (Buffer *)shmat(shmid, NULL, 0)) == (Buffer *)-1) {
perror("shmat");
return -1;
}
buf->len = 0; // 初始化缓存区长度为0
while (true) {
int num;
scanf("%d", &num); // 输入一个数
int i;
for (i = 0; i < buf->len; ++i) {
if (num == buf->data[i]) { // 数已在缓存区,将其移动到数组尾部
int tmp = buf->data[i];
for (int j = i; j < buf->len - 1; ++j) {
buf->data[j] = buf->data[j + 1];
}
buf->data[buf->len - 1] = tmp;
break;
}
}
if (i == buf->len) { // 数未在缓存区中,将其添加到数组尾部
if (buf->len >= capacity) { // 缓存区已满,弹出最久未使用的数
printf("弹出元素:%d\n", buf->data[0]);
for (int j = 0; j < buf->len - 1; ++j) {
buf->data[j] = buf->data[j + 1];
}
buf->len--;
}
buf->data[buf->len] = num;
buf->len++;
}
print_buffer(buf);
}
// 将共享内存从当前进程中分离
shmdt(buf);
// 删除共享内存
shmctl(shmid, IPC_RMID, NULL);
return 0;
}
```