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

📄 process.h

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

文件名称:  PROCESS.H
模块名称:  进程管理模块
模块作用:  对系统进程和用户进程的管理 
编写者一:  陈俭(AP0006301)
编写者二:  
编写日期:
完成日期:
程序行数:   620

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

/****************************************************************************
模块名称:  进程管理模块
函 数 名:  PROCESS_SCHEDUL
功    能:  实现进程调用算法,从就绪队列中选择一个进程,并将CPU分配给该进程
入口参数:  无
出口参数:  TRUE
调用关系:  被CPU调用
编    者:  陈俭(AP0006301)
编写日期:  2003-10-3
完成日期:  2003-10-4
*****************************************************************************/
M_PROCESS_SCHEDULE()
{
    /* 存在就绪的系统进程,,系统进程优先权最高,应该优先于用户进程而调用它 */
    if(SYSTEM_READY_QUEUE->p_tick > 0)
    {
        RUNNING_QUEUE->p_next = SYSTEM_READY_QUEUE->p_next;
        RUNNING_QUEUE->p_tick++;
        SYSTEM_READY_QUEUE->p_next = SYSTEM_READY_QUEUE->p_next->p_next;
        SYSTEM_READY_QUEUE->p_tick--;
        RUNNING_QUEUE->p_next->p_status = Running;
        M_G_DISPLAY_SYSTEM_PROCESS();
    }
    /* 如果存在用户级就绪进程,,则调用该进程 */
    else if(READY_QUEUE->p_tick > 0)
    {
        RUNNING_QUEUE->p_next = READY_QUEUE->p_next;
        RUNNING_QUEUE->p_tick++;
        READY_QUEUE->p_next = READY_QUEUE->p_next->p_next;
        READY_QUEUE->p_tick--;
        RUNNING_QUEUE->p_next->p_next = NULL;
        M_G_MOVE_JOB_FROM_READY_QUEUE_TO_CPU();
    }
    /* 如果不存在用户级就绪进程,则调悬挂进程 */
    else
    {
        RUNNING_QUEUE->p_next = P_PROCESS_SUPERWAIT;
        RUNNING_QUEUE->p_tick = 1;
        RUNNING_QUEUE->p_next->p_status = Running;
        M_G_DISPLAY_SYSTEM_PROCESS();
    }
    M_G_DISPLAY_READY_QUEUE();
    return(TRUE);
}


/****************************************************************************
模块名称:  进程管理模块
函 数 名:  SUPERWAIT
功    能:  系统悬挂进程,当CPU空闲时,调用该进程
入口参数:  无
出口参数:  无
调用关系:  被CPU调用
编    者:  陈俭(AP0006301)
编写日期:  2003-10-4
完成日期:  2003-10-4
*****************************************************************************/
void SUPERWAIT()
{
    int flag = FALSE;
    /* 当没有发生中断时一直循环*/
    while(flag == FALSE)
    {
        /* 系统时间计数加1*/
        M_CLOCK();
        /* 在图形方式下刷新显示CPU及中断参数的值*/
        G_DISPLAY_CPU();
        /* 判断是否发生中断 */
        flag = CHECK_INTERRUPT();
    }
}

/****************************************************************************
模块名称:  进程管理模块
函 数 名:  RESTORE_PROCESS
功    能:  进程的现场恢复
入口参数:  无
出口参数:  无
调用关系:  被CPU调用
编    者:  陈俭(AP0006301)
编写日期:  2003-10-4
完成日期:  2003-10-4
*****************************************************************************/
void RESTORE_PROCESS()
{
    /* 恢复通用寄存器 */
    R = RUNNING_QUEUE->p_next->p_r;
    /* 恢复状态寄存器 */
    C = RUNNING_QUEUE->p_next->p_c;
    /* 恢复计数器的值 */
    PC = RUNNING_QUEUE->p_next->p_pc;
    /*  恢复运行时间片*/
    TIME = RUNNING_QUEUE->p_next->p_tick;
}

/****************************************************************************
模块名称:  进程管理模块
函 数 名:  RUN_VCS
功    能:  执行用户程序指令
入口参数:  无
出口参数:  无
调用关系:  被CPU调用
编    者:  陈俭(AP0006301)
编写日期:  2003-10-4
完成日期:  2003-10-4
*****************************************************************************/
int RUN_VCS()
{
    int flag;
    flag = FALSE;
    /* 当没有发生中断时一直循环*/
    while(flag == FALSE)
    {
        /* 执行一条VCS指令 */
        VCS();
        /* 系统时间计数加1*/
        M_CLOCK();
        /* 在图形方式下刷新显示CPU及中断参数的值*/
        G_DISPLAY_CPU();
        /* 判断是否发生中断 */
        flag = CHECK_INTERRUPT();
    }
}

/****************************************************************************
模块名称:  进程管理模块
函 数 名:  SAVE_PROCESS
功    能:  进程数据的现场保护
入口参数:  无
出口参数:  无
调用关系:  被CPU调用
编    者:  陈俭(AP0006301)
编写日期:  2003-10-5
完成日期:  2003-10-5
*****************************************************************************/
void SAVE_PROCESS()
{
    /* 保存通用寄存器的值 */
    RUNNING_QUEUE->p_next->p_r = R;
    /* 保存状态寄存器 */
    RUNNING_QUEUE->p_next->p_c = C;
    /* 保存指令计数器 */
    RUNNING_QUEUE->p_next->p_pc = PC;
    /* 保存进程时间片 */
    RUNNING_QUEUE->p_next->p_tick = TIME;
}


/****************************************************************************
模块名称:  进程管理模块
函 数 名:  PROCESS_KILL	
功    能:  从内存中销毁一个进程
入口参数:  无
出口参数:  无
调用关系:  被CPU调用
编    者:  陈俭(AP0006301)
编写日期:  2003-10-5
完成日期:  2003-10-5
*****************************************************************************/
void PROCESS_KILL()
{
    /* 释放进程控制块结点*/
    free(RUNNING_QUEUE->p_next);
    /* 运行队列进程数减1*/
    RUNNING_QUEUE->p_next = NULL;
    RUNNING_QUEUE->p_tick--;

    /* 在文本方式下显示内存占用情况 */
    DISPLAY_MEMORY();
    /* 延时处理*/
    delay(DELAY_TIME*10);
}



/****************************************************************************
模块名称:  进程管理模块
函 数 名:  VCS
功    能:  执行一条指令操作
入口参数:  无
出口参数:  无
调用关系:  被CPU调用
编    者:  陈俭(AP0006301)	
编写日期:  2003-10-11
完成日期:  2003-10-11
*****************************************************************************/
int VCS()
{
    int temp_pc,vcs_result;
    char buf[5];
    /* 取得当前指令计数器的值,并将PC加1 */
    temp_pc = GET_PC();
    /* 如果temp_pc>=0表示没有越界 */
    if(temp_pc >= 0 )
    {
        /* 将逻辑地址转换成内存的物理地址 */
        temp_pc = LOGIC_TO_REAL_ADDRESS(temp_pc);
        /* 取当前指令 */
        GET_ONE_INSTRUCTION(temp_pc,&buf[0]);
        /* 执行当前指令 */
        EXECUTE_INSTRUCTION(&buf[0]);
        /* 将当前指令内容存为全局变量CURRENT_INSTRUCTION中,它将显示在CPU参数表中 */
        strcpy(CURRENT_INSTRUCTION,buf);
        /* 在文本方式下显示CPU参数*/
        DISPLAY_CPU();		
        ACTIVE_WINDOW(1);
    }
    else
    {
        /* 如果PC越界,置程序越界中断 */
        SET_PI_INTERRUPT(PI1);
    }
}


/****************************************************************************
模块名称:  进程管理模块
函 数 名:  GET_PC
功    能:  获得当前PC的值,并PC++
入口参数:  无
出口参数:  PC的值
调用关系:  被VCS调用
编    者:  陈俭(AP0006301)
编写日期:  2003-10-11
完成日期:  2003-10-11
*****************************************************************************/
int GET_PC()
{
    /* 如果PC没有越界 */
    if(PC < RUNNING_QUEUE->p_next->p_length )
        /* 返回PC的值,并且PC+1 */
        return(PC++);
    else
        /* 如果越界,返回FALSE */
        return(FALSE);
}


/****************************************************************************
模块名称:  进程管理模块
函 数 名:  COLOR
功    能:  模拟系统时间功能
入口参数:  无
出口参数:  无
调用关系:  被VCS调用
编    者:  陈俭(AP0006301)
编写日期:  2003-10-11
完成日期:  2003-10-11
*****************************************************************************/
M_CLOCK()
{
    int i;
    if(DISPLAY_BY_STEP == FALSE)
        delay(DELAY_TIME*25);
    DEAL_INPUT_KEY();
    /* 检查通道状态 */
    for(i=0;i<3;i++)
    {
        if(CHST[i].status == 'B')
    	{
            /* 如果通道忙,则为通道计时 */
            CHST[i].time--;
            if(CHST[i].time <= 0)
                SET_IOI_INTERRUPT(i+1);
    	}
    }

    /* 系统时间加1个单位时间 */
    RTIME++;
    if(RUNNING_QUEUE->p_next != NULL && RUNNING_QUEUE->p_next->p_id < 0)
    {
        /* 系统进程 */
        if(RUNNING_QUEUE->p_next->p_id == SYSTEM_SUPERWAIT)
    	{
            SUPERWAIT_TIME++;
            /* 闲逛进程 */
    	}
        else
    	{
            KERNEL_TIME++;
            /* 核心进程 */
    	}
    }
    else
    {
        /* 用户进程 */
        USER_TIME++;
        if(READY_QUEUE->p_tick == 0)
    	{
            /* 现在系统中只存在一个用户进程 */
            /* 进程已运行时间数加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);

⌨️ 快捷键说明

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