现在需要维护系统中的空闲页框数,你需要 - 在`kalloc.c`文件中定义一个全局变量`freeMemCnt`,记录空闲页框数; - 在分配和回收内存时维护这个全局变量; - 然后实现系统调用`int freemem(void)`查询这个变量的值; - 实现以下用户命令`free`,打印空闲页框数
时间: 2023-11-21 16:10:44 浏览: 59
用c 语言分别实现采用首次适应算法和最佳适应算法的动态分区分配过程alloc()和回收过程free()
好的,这里是实现的步骤:
1. 在`kalloc.c`文件中定义一个全局变量`freeMemCnt`,记录空闲页框数:
```c
// kalloc.c
#include "defs.h"
#include "x86.h"
#include "memlayout.h"
#include "mmu.h"
#include "param.h"
#include "spinlock.h"
// 添加全局变量
int freeMemCnt = 0;
// ...
```
2. 在分配和回收内存时维护这个全局变量:
```c
// kalloc.c
#include "defs.h"
#include "x86.h"
#include "memlayout.h"
#include "mmu.h"
#include "param.h"
#include "spinlock.h"
// 添加全局变量
int freeMemCnt = 0;
// ...
// 分配一页内存
char *
kalloc(void)
{
struct run *r;
acquire(&kmem.lock);
r = kmem.freelist;
if (r)
kmem.freelist = r->next;
// 维护 freeMemCnt
if (r)
freeMemCnt--;
release(&kmem.lock);
return (char*)r;
}
// 释放一页内存
void
kfree(char *v)
{
struct run *r = (struct run*)v;
acquire(&kmem.lock);
r->next = kmem.freelist;
kmem.freelist = r;
// 维护 freeMemCnt
freeMemCnt++;
release(&kmem.lock);
}
// ...
```
3. 实现系统调用`int freemem(void)`查询这个变量的值:
```c
// sysproc.c
#include "defs.h"
#include "param.h"
#include "proc.h"
#include "syscall.h"
extern int freeMemCnt;
// 实现系统调用
int
sys_freemem(void)
{
// 直接返回 freeMemCnt
return freeMemCnt;
}
```
4. 实现以下用户命令`free`,打印空闲页框数:
```c
// user/sh.c
#include "user.h"
int
main(int argc, char *argv[])
{
int freeMemCnt;
if ((freeMemCnt = freemem()) < 0) {
printf("freemem() failed!\n");
exit();
}
printf("%d free page frame(s)\n", freeMemCnt);
exit();
}
```
这样就实现了维护系统中的空闲页框数,并且可以通过`freemem()`系统调用查询空闲页框数,通过`free`命令打印空闲页框数。
阅读全文