📄 hdmemory.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 + -