⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hdmemory.h

📁 该模块包括作业调度的三个系统进程。P1、P2、P3进程功能的实现。 P1负责对用户作业预输入处理
💻 H
字号:
/****************************************************************************
*****************************************************************************

文件名称:	HDMEMORY.H
模块名称:	内存和硬盘管理模块
模块作用:	内存和硬盘的申请,释放的管理
编写者一:	赖惠芳(AP0006306)	
编写者二:	
编写日期:
完成日期:
程序行数:	250

*****************************************************************************
*****************************************************************************/

/****************************************************************************
模块名称:	内存和硬盘管理模块
函 数 名:	M_GET_MEMORY_FREE_TABLE
功    能:	得到当前内存的可用(空闲)页数
入口参数:	无
出口参数:	返回可用的内存页数
调用关系:	被作业调度进程(P2)调用
编    者:	赖惠芳(AP0006306)
编写日期:	2003-10-12
完成日期:	2003-10-12
*****************************************************************************/
M_GET_MEMORY_FREE_TABLE()
{
	int i=0,j;
	/* 内存按页式管理,总共有30页 */
	for(j=0;j<30;j++)
	{
		/* 如果内存的当前页为空闲状态,则空闲页面数计数器加 1 */
		if(MEMORY_TABLE[j] == 'F')
			i++;
	}
	/* 返回可用的内存页数*/
	return(i);
}

/****************************************************************************
模块名称:	内存和硬盘管理模块
函 数 名:	M_MALLOC_MEMORY_TABLE
功    能:	向内存申请i页空闲的空间
入口参数:	int i 要申请的内存页数
出口参数:	无
调用关系:	被作业调度进程(P2)调用
编    者:	赖惠芳(AP0006306)
编写日期:	2003-10-12
完成日期:	2003-10-12
*****************************************************************************/
M_MALLOC_MEMORY_TABLE(int i)
{
	int j,k=0;
	/* 在30页内存中循环检查,哪些页面是空闲状态的 */
	for(j=0;j<30;j++)
	{
		/* 如果该页面空闲,则将该内存页分配给要申请的作业 */
		if(MEMORY_TABLE[j] == 'F')
		{
			/* 分配给作业后应置该内存页已被占用 */
			M_CHARGE_MEMORY_TABLE_STATUS(j,'T');
			/* 将分配到的内存页面页号写入作业的页表中 */
			J_INPUT_JOB_HEAD->j_next->j_job_table[k] = j;
			/* 已分配的页数加1 */
			k++;
			/* 如果已分配i页,则跳出循环*/
			if(k == i)
				break;
		}
	}
	/* -1 表示作业页表中该项已经是最后一项,该项后面的所有项无效 */
	for(;k<10;k++)
		J_INPUT_JOB_HEAD->j_next->j_job_table[k] = -1;
}

/****************************************************************************
模块名称:	内存和硬盘管理模块
函 数 名:	M_CLEAR_MEMORY_JOB_HAD_TAKEN
功    能:	将当前运行完成的作业所占用的内存页全部释放
入口参数:	无(默认当前正在运行的作业)
出口参数:	无
调用关系:	当作业执行H指令或作业发生错误时调用
编    者:	赖惠芳(AP0006306)
编写日期:	2003-10-12
完成日期:	2003-10-12
*****************************************************************************/
M_CLEAR_MEMORY_JOB_HAD_TAKEN()
{
	int i;
	/* 从作业的页表中找出该作业所占用的内存页*/
	for(i=0;i<10;i++)
	{
		/* 如果该作业页表不是-1,则表示应该释放该页面*/
		if(RUNNING_QUEUE->p_next->p_job_table[i] != -1)
		{
			/* 将作业页表中所指的内存页号相应置为空闲状态*/
			M_CHARGE_MEMORY_TABLE_STATUS(RUNNING_QUEUE->p_next->p_job_table[i],'F');
			/* 在图形方式显示清除内存页面这一过程*/
			M_G_DISPLAY_OR_CLEAN_DATA_TAKEN_USERBUF(RUNNING_QUEUE->p_next->p_job_table[i],0);
		}
	}
}

/****************************************************************************
模块名称:	内存和硬盘管理模块
函 数 名:	M_CLEAR_HARDDISK_JOB_HAD_TAKEN
功    能:	作业被P2调用后全部已装入用户存储区后释放占用的输入井
入口参数:	(JCB *P) 指向要释放输入井空间的作业的指针
出口参数:	无
调用关系:	当作业全部装入用户存储或被P2调用过程中出错,则调用该函数
编    者:	赖惠芳(AP0006306)
编写日期:	2003-10-12
完成日期:	2003-10-12
*****************************************************************************/
M_CLEAR_HARDDISK_JOB_HAD_TAKEN(JCB *p)
{
	int i;
	/* 在作业的占用硬盘页表中查找*/
	for(i=0;i<10;i++)
	{
		/* 如果该页表数值有效,则释放对应的输入井空间*/
		if(p->j_hd_table[i] != -1)
		{
			/* 将输入井置为空*/
			HARDDISK_TRACK[p->j_hd_table[i]] = 'F';
			/* 图形方式下显示这一过程 */
			M_G_DISPLAY_OR_CLEAN_INPUT_BUF(p->j_hd_table[i],0);
		}
		else
			break;
	}
}

/****************************************************************************
模块名称:	内存和硬盘管理模块
函 数 名:	M_MALLOC_SPACE_FOR_JOB_FROM_HARDDISK
功    能:	向输入井申请空间,只申请一道(硬盘按道管理)
入口参数:	(JCB *tempjcb) 指向要申请输入井空间的作业的指针
出口参数:	无
调用关系:	被P2调用
编    者:	赖惠芳(AP0006306)
编写日期:	2003-10-12
完成日期:	2003-10-12
*****************************************************************************/
M_MALLOC_SPACE_FOR_JOB_FROM_HARDDISK(JCB *tempjcb)
{
	int i,j,pre=HARDDISK_TRACK_INDEX;
	int *table;
	table = tempjcb->j_hd_table;
	for(i=0;i<10;i++)
	{
		if(table[i] == -1)
			break;
		else
			pre = table[i];
	}
	if(i >= 10)
		return(FALSE);
	else
	{
		for(j=0;j<100;j++)
		{
			pre++;
			pre %= 100;
			if(HARDDISK_TRACK[pre] == 'F')
			{
				HARDDISK_TRACK[pre] = 'T';
				table[i] = pre;
				HARDDISK_TRACK_INDEX = pre;
				/* [0]是图形方式下显示需要的附加变量*/
				LINE_FROM_SYSTEM_MEMORY_TO_INPUT_BUF_INDEX[0] = pre;
				tempjcb->j_index = i;
				if(i+1 < 10)
					table[i+1] = -1;
				break;
			}
		}
		if(j<100)
			return(TRUE);
	}
}

/****************************************************************************
模块名称:	内存和硬盘管理模块
函 数 名:	M_CHECK_WHETHER_HAVE_SPACE_IN_HARDDISK
功    能:	检查硬盘是否存在空闲空间(硬盘按道管理)
入口参数:	无
出口参数:	如果有空间返回真,否则返回假
调用关系:	被P1调用
编    者:	赖惠芳(AP0006306)
编写日期:	2003-10-12
完成日期:	2003-10-12
*****************************************************************************/
M_CHECK_WHETHER_HAVE_SPACE_IN_HARDDISK()
{
	/* 如果磁盘还存在空间,则返回真 */
	int i;
	for(i=0;i<100;i++)
	{
		/* 只要存在一道硬盘空闲空间,就返回真*/
		if(HARDDISK_TRACK[i] == 'F')
			return(TRUE);
	}
	return(FALSE);
}



/****************************************************************************
模块名称:	内存和硬盘管理模块
函 数 名:	M_CHANGE_POSITION_OF_LENGTH_TO_POSITION_OF_HARDDISK
功    能:	将作业中某一字节(地址以逻辑方式)转换成硬盘的绝对地址
入口参数:	(JCB *j)要转换地址的作业 
出口参数:	无(以全局变量HDWPOINTERR返回)
调用关系:	被P1,P2调用
编    者:	赖惠芳(AP0006306)
编写日期:	2003-10-12
完成日期:	2003-10-12
*****************************************************************************/
M_CHANGE_POSITION_OF_LENGTH_TO_POSITION_OF_HARDDISK(JCB *j)
{
	int page,offset,block;
	/* 先转换成该作业硬盘页表的数组下标*/
	page = (j->j_loaded_length -1) / 10;
	/* 再转换成硬盘的道号*/
	block = j->j_hd_table[page];
	/* 再得到道内的偏移量*/
	offset = (j->j_loaded_length - 1) % 10;
	/* 将道号X道的长度+偏移量,则是绝对地址*/
	HDWPOINTER = block * 10 + offset;
}


/****************************************************************************
模块名称:	内存和硬盘管理模块
函 数 名:	M_GET_JOB_CURRENT_HARDDISK_INDEX_AND_MEMORY_INDEX
功    能:	将一个作业的当前位置转换成内存和硬盘的绝对地址
入口参数:	int offset  该作业的逻辑地址(当前位置+偏移量)
			int *hdi	该作业对应的硬盘道号
			int *mmi	该作业对应的内存页号
出口参数:	用指针方式返回两个值,硬盘道号和内存页号
调用关系:	被P2调用
编    者:	赖惠芳(AP0006306)
编写日期:	2003-10-12
完成日期:	2003-10-12
*****************************************************************************/
M_GET_JOB_CURRENT_HARDDISK_INDEX_AND_MEMORY_INDEX(int offset,int *hdi,int *mmi)
{
	int l;
	l = J_INPUT_JOB_HEAD->j_next->j_loaded_length;
	l += offset;
	if(l<0)
		return(FALSE);
	*hdi = J_INPUT_JOB_HEAD->j_next->j_hd_table[l/10];
	*mmi = J_INPUT_JOB_HEAD->j_next->j_job_table[l/10];
}




⌨️ 快捷键说明

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