📄 process.h
字号:
/* 置出错行号,100 时表示$BEGIN-作业名-估计时间-估计输出行数 */
RUNNING_QUEUE->p_next->p_error = 100;
return;
}
/* 如果时间片用完,则不进行计时 */
if(TIME > 0)
TIME--;
}
else
{
/* 系统中还存在多个用户进程 */
/* 进程时间片减1 */
TIME--;
/* 进程已运行时间加1*/
RUNNING_QUEUE->p_next->p_running_time++;
/* 如果进程使用的时间数大于用户程序中的估计时间数,则估计时间不足,发出中断 */
if(RUNNING_QUEUE->p_next->p_running_time > atoi(RUNNING_QUEUE->p_next->p_runtime))
{
SET_PI_INTERRUPT(PI7);
/* 置出错行号,100 时表示$BEGIN-作业名-估计时间-估计输出行数 */
RUNNING_QUEUE->p_next->p_error = 100;
return;
}
/* 如果时间片用完,发出中断*/
if(TIME <= 0)
{
SET_TI_INTERRUPT(TI1);
}
}
}
}
/****************************************************************************
模块名称: 进程管理模块
函 数 名: M_RESTORE_SYSTEM_PROCESS
功 能: 恢复系统进程的现场
入口参数: 无
出口参数: 无
调用关系: 被CPU调用
编 者: 陈俭(AP0006301)
编写日期: 2003-10-4
完成日期: 2003-10-4
*****************************************************************************/
M_RESTORE_SYSTEM_PROCESS()
{
PC = RUNNING_QUEUE->p_next->p_pc;
}
/****************************************************************************
模块名称: 进程管理模块
函 数 名: M_SAVE_SYSTEM_PROCESS
功 能: 保存系统进程的现场
入口参数: 无
出口参数: 无
调用关系: 被CPU调用
编 者: 陈俭(AP0006301)
编写日期: 2003-10-4
完成日期: 2003-10-4
*****************************************************************************/
M_SAVE_SYSTEM_PROCESS()
{
RUNNING_QUEUE->p_next->p_pc = PC;
}
/****************************************************************************
模块名称: 进程管理模块
函 数 名: M_CHECK_SYSTEM_PROCESS_STATUS
功 能: 检查系统进程的状态
入口参数: PCB *p 要检查的系统进程
出口参数: 返回该进程的状态(PState 类型)
调用关系: 被CPU调用
编 者: 陈俭(AP0006301)
编写日期: 2003-10-4
完成日期: 2003-10-4
*****************************************************************************/
PState M_CHECK_SYSTEM_PROCESS_STATUS(PCB *p)
{
return(p->p_status);
}
/****************************************************************************
模块名称: 进程管理模块
函 数 名: M_PROCESS_WAKE_UP
功 能: 唤醒系统进程
入口参数: PCB *p 要唤醒的系统进程
出口参数: 无
调用关系: 进程管理模块调用
编 者: 陈俭(AP0006301)
编写日期: 2003-10-4
完成日期: 2003-10-4
*****************************************************************************/
M_PROCESS_WAKE_UP(PCB *p)
{
PCB *bp;
bp = SYSTEM_BLOCK_QUEUE;
/* 如果该进程本身处于不睡眼状态,则不用唤醒*/
if(p->p_status != Ready)
{
/* 否则要执行唤醒动作*/
while(bp->p_next != p && bp->p_next != NULL)
bp=bp->p_next;
/* 在睡眠队列中将其查找出来*/
if(bp->p_next == p)
{
/* 如果找到,则唤醒它,即将它插入到就绪队列中,同时就绪队列的长度加1*/
bp->p_next = p->p_next;
bp = SYSTEM_READY_QUEUE;
while(bp->p_next!=NULL)
bp=bp->p_next;
p->p_next = bp->p_next;
bp->p_next = p;
p->p_status = Ready;
SYSTEM_READY_QUEUE->p_tick++;
}
}
}
/****************************************************************************
模块名称: 进程管理模块
函 数 名: M_CHECK_NECESSARY_WAKE_UP_PROCESS
功 能: 唤醒系统进程(当必要时才唤醒)
入口参数: PCB *p 要唤醒的系统进程
出口参数: 无
调用关系: 进程管理模块调用
编 者: 陈俭(AP0006301)
编写日期: 2003-10-4
完成日期: 2003-10-4
*****************************************************************************/
M_CHECK_NECESSARY_WAKE_UP_PROCESS(PCB *p)
{
int id;
if(p == P_INPUT_PROCESS)
id = SYSTEM_INPUT_PROCESS;
else if(p == P_JOB_SCHEDUL)
id = SYSTEM_JOB_SCHEDUL;
else if(p == P_OUTPUT_PROCESS)
id = SYSTEM_OUTPUT_PROCESS;
/* 当该进程处于睡眠状态时才唤醒它,否则不作任何处理*/
return(!M_CHECK_SYSTEM_PROCESS_WHETHER_WAIT_THE_CHST(id));
}
/****************************************************************************
模块名称: 进程管理模块
函 数 名: M_CHECK_SYSTEM_PROCESS_WHETHER_WAIT_THE_CHST
功 能: 检查系统进程是否正在等待通道
入口参数: int process_id 系统进程的ID号
出口参数: 如果正处于等待状态返回真,否则返回假
调用关系: 进程管理模块调用
编 者: 陈俭(AP0006301)
编写日期: 2003-10-4
完成日期: 2003-10-4
*****************************************************************************/
M_CHECK_SYSTEM_PROCESS_WHETHER_WAIT_THE_CHST(int process_id)
{
int i,j;
/* 分别在三个通道中检查*/
for(i=0;i<3;i++)
{
/* 在每一个通道的队列中检查 */
for(j=0;j<3;j++)
{
/* 如果查到了,则返回真*/
if(CHST[i].process[j] == process_id)
{
return(TRUE);
}
}
}
/* 查不到则返回假*/
return(FALSE);
}
/****************************************************************************
模块名称: 进程管理模块
函 数 名: M_PROCESS_SLEEP_SETTING
功 能: 系统进程睡眠的参数设置
入口参数: PCB *p 要睡眠的进程
int stop_value 该进程的中断位置,即所谓的现场
出口参数: 无
调用关系:
编 者: 陈俭(AP0006301)
编写日期: 2003-10-4
完成日期: 2003-10-4
*****************************************************************************/
M_PROCESS_SLEEP_SETTING(PCB *p,int stop_value)
{
/* 将进程置为睡眠状态 */
p->p_status = Block;
/* 将中断的位置存入PC中*/
PC = stop_value ;
}
/****************************************************************************
模块名称: 进程管理模块
函 数 名: M_SET_SYSTEM_PROCESS_STATUS
功 能: 设置系统进程的状态
入口参数: PCB *p 要设置的系统进程
PState s 进程状态
出口参数: 无
调用关系:
编 者: 陈俭(AP0006301)
编写日期: 2003-10-4
完成日期: 2003-10-4
*****************************************************************************/
M_SET_SYSTEM_PROCESS_STATUS(PCB *p,PState s)
{
p->p_status = s;
}
/****************************************************************************
模块名称: 进程管理模块
函 数 名: M_MOVE_SYSTEM_PROCESS_FROM_RUNNING_QUEUE_TO_OHTER_QUEUE
功 能: 将当前运行的系统进程移到其它队列中
入口参数: PCB *p 当前的系统进程
出口参数: 无
调用关系:
编 者: 陈俭(AP0006301)
编写日期: 2003-10-4
完成日期: 2003-10-4
*****************************************************************************/
M_MOVE_SYSTEM_PROCESS_FROM_RUNNING_QUEUE_TO_OHTER_QUEUE(PCB *p)
{
PCB *bp;
/* 将系统进程移动到系统就绪队列尾部 */
if(RUNNING_QUEUE->p_next->p_status == Ready)
{
bp = SYSTEM_READY_QUEUE;
while(bp->p_next!=NULL)
bp=bp->p_next;
p->p_next = bp->p_next;
bp->p_next = p;
SYSTEM_READY_QUEUE->p_tick++;
}
/* 将系统进程移动到系统阻塞队列尾部 */
if(RUNNING_QUEUE->p_next->p_status == Block)
{
bp = SYSTEM_BLOCK_QUEUE;
while(bp->p_next != NULL)
bp=bp->p_next;
p->p_next = bp->p_next;
bp->p_next = p;
SYSTEM_BLOCK_QUEUE->p_tick++;
}
/* 将进程直接销毁 */
if(RUNNING_QUEUE->p_next->p_status == Destory)
{
/* 如果当前进程的状态是销毁状态,是释放其内存*/
/*free(p); */
}
RUNNING_QUEUE->p_next = NULL;
}
/****************************************************************************
模块名称: 进程管理模块
函 数 名: M_WAKE_UP_PROCESS_BY_ID
功 能: 采用进程ID的方式来唤醒进程
入口参数: int id 当前的系统进程的ID号
出口参数: 无
调用关系:
编 者: 陈俭(AP0006301)
编写日期: 2003-10-4
完成日期: 2003-10-4
*****************************************************************************/
M_WAKE_UP_PROCESS_BY_ID(int id)
{
switch(id)
{
case SYSTEM_INPUT_PROCESS:
{
M_PROCESS_WAKE_UP(P_INPUT_PROCESS);
break;
}
case SYSTEM_OUTPUT_PROCESS:
{
M_PROCESS_WAKE_UP(P_OUTPUT_PROCESS);
break;
}
case SYSTEM_JOB_SCHEDUL:
{
M_PROCESS_WAKE_UP(P_JOB_SCHEDUL);
break;
}
}
}
/****************************************************************************
模块名称: 进程管理模块
函 数 名: M_PROCESS_WAKE_UP_BY_NECESSARY
功 能: 在必要时唤醒进程
入口参数: int id 当前的系统进程的ID号
出口参数: 无
调用关系:
编 者: 陈俭(AP0006301)
编写日期: 2003-10-4
完成日期: 2003-10-4
*****************************************************************************/
M_PROCESS_WAKE_UP_BY_NECESSARY(PCB *p)
{
/* 当要唤醒一个进程时,如果该进程本身正处于某一通道的等状态,则无需要唤醒,而又通道时间到即可。*/
if(M_CHECK_NECESSARY_WAKE_UP_PROCESS(p) == FALSE)
return(TRUE);
M_PROCESS_WAKE_UP(p);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -