int allot_mem(file* f) { int start_block_id = 0; int file_size = f->size;//记录动态分配中,文件的大小变化 free_block* fb = NULL; free_block** fbt = fb_arr; for (; *fbt; fbt++)//遍历所有的空闲块,查找空的空闲块进行分配 { if ((*fbt)->state == 0) { if ((*fbt)->mem_size >= f->size)//若空闲块大小足够容纳整个文件,则分配,并返回该空闲块编号 { (*fbt)->state = 1; (*fbt)->remain_mem_size -= f->size; return (*fbt)->block_id; } else {//该空闲块的大小不足以容纳整个文件 if (file_size == f->size)//文件大小等于当前空闲块的大小/ //文件还未分配 { start_block_id = (*fbt)->block_id;//记录分配的首块号 file_size -= (*fbt)->mem_size;//记录剩余未分配到内存的文件 (*fbt)->remain_mem_size = 0;//将已分配的盘块空间记为0 (*fbt)->state = 1;//将已分配的盘块状态标记为1 fb = (*fbt); } else { if ((*fbt)->mem_size >= file_size) { (*fbt)->remain_mem_size -= file_size; (*fbt)->state = 1; fb->next = (*fbt); fb = fb->next; return start_block_id; } else { (*fbt)->remain_mem_size = 0; (*fbt)->state = 1; fb->next = (*fbt); fb = fb->next; file_size -= (*fbt)->mem_size; } } } } } cout<<"空间不足,内存分配失败"; return -1; }
时间: 2023-06-25 17:03:07 浏览: 167
allot1_4.rar_4 3 2 1
这段代码是一个动态内存分配函数,用于在文件系统中为一个文件分配内存块。函数首先遍历所有的空闲块,查找一个空的空闲块进行分配。如果找到了一个空闲块,且其大小足够容纳整个文件,则将该空闲块标记为已分配,更新剩余内存大小,并返回该空闲块的编号。如果找到的空闲块大小不足以容纳整个文件,则需要进行动态分配。在动态分配的过程中,函数会记录分配的首块号,以及剩余未分配到内存的文件大小。如果还有未分配到内存的文件,则继续在空闲块中查找空闲块进行分配,直到所有的文件都被分配到内存中或者空闲块不足以容纳文件。如果空闲块不足以容纳文件,则输出错误信息并返回-1。
阅读全文