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

📄 process.h

📁 该模块包括作业调度的三个系统进程。P1、P2、P3进程功能的实现。 P1负责对用户作业预输入处理
💻 H
📖 第 1 页 / 共 2 页
字号:
                /* 置出错行号,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 + -