#include <stdio.h> #include <stdlib.h> #define MAX_SIZE 100 int blocks[MAX_SIZE]; int processes[MAX_SIZE]; int allocateMem(int processSize, int n) { int i, j; for (i = 0; i < n; i++) { if (blocks[i] >= processSize) { blocks[i] -= processSize; return i; } } return -1; } void releaseMem(int pid, int processSize, int n) { blocks[pid] += processSize; for (int i = 0; i < n; i++) { if (i == pid + 1 && blocks[i] > 0) { blocks[pid] += blocks[i]; blocks[i] = 0; } } } int main() { int n, m; printf("输入内存块数: "); scanf("%d", &n); printf("输入每个内存块大小: "); for (int i = 0; i < n; i++) { scanf("%d", &blocks[i]); } printf("输入进程数: "); scanf("%d", &m); printf("输入每个进程的大小: "); for (int i = 0; i < m; i++) { scanf("%d", &processes[i]); } int allocation[m]; for (int i = 0; i < m; i++) { allocation[i] = allocateMem(processes[i], n); if (allocation[i] == -1) { printf("无法为进程 %d分配内存 .\n", i); } else { printf("进程%d分配的内存块 %d.\n", i, allocation[i]); } } int pid; printf("输入要释放内存的进程id: "); scanf("%d", &pid); if (pid >= 0 && pid < m && allocation[pid] != -1) { releaseMem(allocation[pid], processes[pid], n); allocation[pid] = -1; printf("Memory released.\n"); } else { printf("Invalid process id.\n"); } return 0; }
时间: 2024-01-23 16:02:27 浏览: 63
这是一个模拟内存分配的程序,下面是代码的详细解释:
1. 头文件和宏定义
```C
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100
```
这里引入了两个头文件,分别是stdio.h和stdlib.h,分别包含了标准输入输出和一些常用函数的声明。MAX_SIZE是一个宏定义,表示内存块和进程数组的最大长度。
2. 内存块和进程数组的定义
```C
int blocks[MAX_SIZE];
int processes[MAX_SIZE];
```
这里定义了两个整型数组,分别是内存块和进程数组,用于存储内存块和进程的大小。
3. allocateMem函数
```C
int allocateMem(int processSize, int n) {
int i, j;
for (i = 0; i < n; i++) {
if (blocks[i] >= processSize) {
blocks[i] -= processSize;
return i;
}
}
return -1;
}
```
这是一个用于分配内存的函数,它接受两个参数,分别是进程的大小和内存块的数量。它会遍历内存块数组,找到第一个大小大于等于进程大小的内存块,并将其大小减去进程大小,然后返回该内存块的下标。如果没有找到符合要求的内存块,则返回-1。
4. releaseMem函数
```C
void releaseMem(int pid, int processSize, int n) {
blocks[pid] += processSize;
for (int i = 0; i < n; i++) {
if (i == pid + 1 && blocks[i] > 0) {
blocks[pid] += blocks[i];
blocks[i] = 0;
}
}
}
```
这是一个用于释放内存的函数,它接受三个参数,分别是进程id、进程大小和内存块数量。它会将该进程使用的内存块大小加回到其原来的内存块上,并将其后面的空闲内存块合并起来。
5. main函数
```C
int main() {
int n, m;
printf("输入内存块数: ");
scanf("%d", &n);
printf("输入每个内存块大小: ");
for (int i = 0; i < n; i++) {
scanf("%d", &blocks[i]);
}
printf("输入进程数: ");
scanf("%d", &m);
printf("输入每个进程的大小: ");
for (int i = 0; i < m; i++) {
scanf("%d", &processes[i]);
}
int allocation[m];
for (int i = 0; i < m; i++) {
allocation[i] = allocateMem(processes[i], n);
if (allocation[i] == -1) {
printf("无法为进程 %d分配内存 .\n", i);
} else {
printf("进程%d分配的内存块 %d.\n", i, allocation[i]);
}
}
int pid;
printf("输入要释放内存的进程id: ");
scanf("%d", &pid);
if (pid >= 0 && pid < m && allocation[pid] != -1) {
releaseMem(allocation[pid], processes[pid], n);
allocation[pid] = -1;
printf("Memory released.\n");
} else {
printf("Invalid process id.\n");
}
return 0;
}
```
这是主函数,它首先会让用户输入内存块数和每个内存块的大小,并将其存入内存块数组中。接着让用户输入进程数和每个进程的大小,并将其存入进程数组中。然后,它会依次为每个进程分配内存,并将分配的结果存入一个数组中。如果分配失败,则输出错误信息。接着,让用户输入要释放内存的进程id,然后调用释放内存的函数,并将分配的结果数组中该进程的值赋为-1。如果进程id无效,则输出错误信息。最后返回0,表示程序运行正常结束。
阅读全文