操作系统:实验一 可变分区存储管理
/* 如不会使用文件输入/输出,也不会使用 I/O 转向做输入和输出结果文件,
可以手再抄输出结果后后再输到文件中,实验报告的文字内容由自己掌握,
能多能少。
*/
#include
#include
/* 表的定义 */
#define N 5
struct map {
unsigned m_size;
char *m_addr;
};
struct map coremap[N];
/* 首次适应的分配函数 */
char *fmalloc(unsigned size)
{
register char *a;
register struct map *bp;
for (bp = coremap; bp->m_size; bp++) {
if(bp->m_size >= size) {
a = bp->m_addr;
bp->m_addr += size;
if((bp->m_size -= size) == 0)
do
{
bp++;
(bp-1)->m_addr = bp->m_addr;
} while((bp-1)->m_size = bp->m_size);
return(a);
}
}
return(0);
}
/* 首次适应的释放函数 */
ffree(unsigned size, char *aa)
{
struct map *bp;
char *a, *t;
unsigned tt;
a = aa;
for (bp=coremap; bp->m_addr<=a && bp->m_size!=0; bp++);
if (bp>coremap && (bp-1)->m_addr+(bp-1)->m_size == a) {
/* 情况
1,2 */
(bp-1)->m_size += size;
if (a+size == bp->m_addr) {
/* 情况 1 */
/* 情况 2 */
(bp-1)->m_size += bp->m_size;
while (bp->m_size) {
bp++;
(bp-1)->m_addr = bp->m_addr;
(bp-1)->m_size = bp->m_size;
}
}
}
else {
if (a+size == bp->m_addr && bp->m_size) {
/* 情况 3 */
bp->m_addr -= size;
bp->m_size += size;
}
else
if (size)
do {
/* 情况 4 */
t = bp->m_addr;
bp->m_addr = a;
a = t;
tt = bp->m_size;
bp->m_size = size;
bp++;
} while (size = tt);
}
}
/*
coremap 表的初始化程序 */
void initcoremap(char *addr, unsigned size)
{
/* 初始化 coremap 数组,使其
第一项的 m_addr 指向用 malloc 申请到的 addr,
第一项的 m_size 等于 malloc 申请的 size,
其他各项清 0 */
}
/* 输出表的内容 */
void printcoremap()
{
/* Function body: 打印 coremap 表中各项的 m_size 和 m_addr
*/
}
/* 主程序的框架 */
main()
{
/* 定义变量 */
/* 用 malloc 向系统申请内存,如 1000
/* 初始化 coremap 数组 */
/* 命令处理部分,如 m size :分配内存
*/
f size addr : 回收内存
p : 打印 coremap 表
q : 退出
default: continue
/* 调用 free 将用 malloc 申请到的内存释放 */
*/
}