recycle.c

来自「一些操作系统课程实验的程序」· C语言 代码 · 共 78 行

C
78
字号
void recycle(int task_no)
{   
	int s,up_neighbor,down_neighbor,i;
    float address,length;
	
	for (s=0; s<USED_TABLE_LEN; s++)
	{
		if (used_table[s].flag == task_no)
			break;
	}
	if (s >= USED_TABLE_LEN) {
		printf("未找到作业,回收失败\n");
		return;
	}

	address = used_table[s].address;
	length = used_table[s].length;
	used_table[s].flag = 0;
	
	up_neighbor = -1;
	down_neighbor = -1;

	i = 0;

	while (1)
	{
		if ((free_table[i].flag == 0) || (up_neighbor != -1) && (down_neighbor != -1))
			break;
		if (!free_table[i].flag) {
			i++;
			continue;
		}
		if (free_table[i].address + free_table[i].length == address) {
			up_neighbor = i++;
			continue;
		}
		if (address + length == free_table[i].address) {
			down_neighbor = i++;
			continue;
		}
		i++;
	}

	if (up_neighbor != -1) {
		if (down_neighbor != -1) {
			free_table[up_neighbor].length =free_table[up_neighbor].length + length + free_table[down_neighbor].length;
			free_table[down_neighbor].flag = 0;
		}
		else {
			free_table[up_neighbor].length += length;
		}
	}
	else {
		if (down_neighbor != -1) {
			free_table[down_neighbor].length += length;
			free_table[down_neighbor].address = address;
		}
		else {
			for (i=0; i<FREE_TABLE_LEN; i++)
			{
				if (!free_table[i].flag)
					break;
			}
			if (i>=FREE_TABLE_LEN) {
				used_table[s].flag = 1;
				printf("空闲区长度不足,回收失败!!!\n");
			}
			else {
				free_table[i].address = address;
				free_table[i].length = length;
				free_table[i].flag = 1;
			}
		}
	}
	printf("作业 %d 回收成功!\n",task_no);
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?