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

📄 op.c

📁 该模块包括作业调度的三个系统进程。P1、P2、P3进程功能的实现。 P1负责对用户作业预输入处理
💻 C
字号:
/****************************************************************************
模块名称:  主程序模块
文 件 名:  MAIN.C
系统文件:  标准输入输出库(stdio.h)、字符串处理库(string.h)
            DOS功能调用库(dos.h)、标准库函数(stdlib.h)
            字符屏幕控制库(conio.h)、数学科学计算库(math.h)
            图形库函数(graphics.h)、BIOS中断功能调用库(bios.h)
调用文件:  全局变量库(global.h)、汉字点阵库(font.h)
            VCS指令解释库(vcs.h)、界面输出库(printer.h)
模块功能:  该模块负责整个操作系统的启动过程,对用户输入参数进程解释,
            系统的初始化设置,创建系统进程,然后将控制权交对进程调度程序,
            之后又进程调度程序负责作业的全部运行情况,当全部作业完成之后,
            控制权又再次交给主模块,由主模块对系统进程的销毁和关机操作
编    者:  蔡晓跃(AP0106338)
编写日期:  2003-10-3
*****************************************************************************/
/*****************************************************************************

    模块行数说明(单位:行)
    
    主程序模块      :   180
    初始化模块      :   380(全届变量)+160(函数说明)+500(系统初始化)
    作业管理模块    :   1100
    进程管理模块    :   620         陈俭
    内存管理模块    :   250         赖惠芳
    中断管理模块    :   420         赖惠芳
    执行解释模块    :   620         黄瑞玉
    辅助功能模块    :   600
    界面输出模块    :   600(文本界面)+610(图形界面输出模块之一)+1000(图形界面输出模块之二)
    程序总长度      :   7000    

    汉字点阵模块    :   1340(汉字库一)+480(汉字库二)

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

/****************************************************************************
模块名称:  主模块
函 数 名:  main
功    能:  整个程序的开始执行函数,主领全程序,直至程序返回DOS
入口参数:  (int argv,char **argc)
            argv接收命令行参数个数
            argc指针数组,存放命令行参数的文本格式
出口参数:  无
调用关系:
编    者:  蔡晓跃(AP0106338)
编写日期:  2003-10-3
*****************************************************************************/
#include "DECLARE.H"

int main(int argv,char *argc[])
{
    void CPU();
    INSTALL_GRAPH_DRIVER();
    /* 调用命令行解释子程序 */
    INIT_COMMAND(argv,argc);
    /* 关闭光标 */
    CHANGE_CURSOR(0);
    /* 初始化输出界面 */
    INIT_INTERFACE();
    /* 系统一切环境的初始化 */
    INIT_SYSTEM();
    /* 执行系统核心函数,内核部分,完成作业、进程的调用,并完成作业输出 */
    CPU();
    /* 显示关于系统设计指导老师,作者名单 */
    G_ABOUT();
    /* 显示光标 */
    CHANGE_CURSOR(1);
    /* 如果在图形方式下,则关闭图形方式,返回文本方式状态 */
    if(DISPLAY_MODE == GRAPHICS)
        closegraph();
    /* 主程序结束,将控制权交还DOS提示符 */
}

/****************************************************************************
模块名称:  主模块
函 数 名:  CPU
功    能:  系统的核心部分,执行CPU功能
入口参数:  无
出口参数:  无
调用关系:  被main函数调用,自身调用作业或进程调用模块
编    者:  蔡晓跃(AP0106338)
编写日期:  2003-10-8
*****************************************************************************/
void CPU()
{
    int i;
    int process = TRUE;
    /* 当存在作业进程时,一直循环*/
    while(process)
    {
        /* 执行进程调用程序,如果有进程选中,则返回TRUE,否则返回FALSE */
        M_G_DISPLAY_SYSTEM_PROCESS();
        process = M_PROCESS_SCHEDULE();
        /* 如果没有选中进程表示用户程序全部运行完成 */
        if(process == FALSE)
        {
            /* 发出声音提示 */
            putchar(7);
            /* 延时处理*/
            delay(DELAY_TIME*4);
            /* 再次发出声音*/
            putchar(7);
            /* 在图形方式下显示“所有作业已运行完毕”提示信息*/
            G_DISPLAY_INFORMATION(NULL,FINISH,12,8,WHITE);
            /* 如果是文本方式下,则显示提示字符串*/
            if(DISPLAY_MODE == TEXT)
            {
                textcolor(15);
                cprintf("All jobs had finished,Press any key to Exit\r\n");
                getch();
                window(1,1,80,25);
                textcolor(yellow_color);
                textbackground(0);
                clrscr();
            }
            /* 跳过下面的程序段,直接进入下一次循环*/
            continue;
        }
        else
        {
            /*在文本方式下显示队列窗口中的队列成员*/
            DISPLAY_QUEUE();
            /* 如果选中的是用户进程 */
            if(RUNNING_QUEUE->p_next->p_type == 'U')
            {
                /* 置当前运行模式为用户模式 */
                MODE = 'U';
                /* 恢复现场数据 */
                RESTORE_PROCESS();
                /* 显示各个进程的PC R C 值 */
                G_DISPLAY_ALL_PC_R_C(); 
                /* 解释并执行指令集 */
                RUN_VCS();
                /* 保护现场数据*/
                SAVE_PROCESS();
                /* 处理中断 */
                DEAL_INTERRUPT();
            }
            else
            {
                /* 如果选中的是系统进程,置当前运行模式为系统模式 */
                MODE = 'S';
                M_G_DISPLAY_OR_CLEAN_LINE_BETWEEN_CPU_AND_SYSTEM_PROCESS(line_color);
                /* 判断是哪一个系统进程*/
                /* 恢复系统进程的现场 */
                M_RESTORE_SYSTEM_PROCESS();
                /* 如果是预输入进程 P1 */
                if(RUNNING_QUEUE->p_next->p_id == SYSTEM_INPUT_PROCESS)
                {
                    /* 调用预输入进程 */
                    M_INPUT_PROCESS();
                }
                /* 如果是缓输出进程 P3 */
                else if(RUNNING_QUEUE->p_next->p_id == SYSTEM_OUTPUT_PROCESS)
                {
                    /* 调用缓输出进程 */
                    M_OUTPUT_PROCESS();
                }
                else if(RUNNING_QUEUE->p_next->p_id == SYSTEM_JOB_SCHEDUL)
                {
                    /* 如果是作业调用进程 */
                    /* 调用从硬盘装入作业模块 ,装入一个作业*/
                    M_LOAD_JOB_FROM_HARDDISK_TO_MEMORY();
                }
                /* 如果是悬挂进程*/
                else if(RUNNING_QUEUE->p_next->p_id == SYSTEM_SUPERWAIT)
                {
                    if(M_CHECK_SYSTEM_PROCESS_STATUS(P_INPUT_PROCESS) == Destory && M_CHECK_SYSTEM_PROCESS_STATUS(P_JOB_SCHEDUL) == Destory && M_CHECK_SYSTEM_PROCESS_STATUS(P_OUTPUT_PROCESS) == Destory)
                    {
                        /* 如果是整个作业流结束语句,撤消闲逛进程 */
                        M_SET_SYSTEM_PROCESS_STATUS(RUNNING_QUEUE->p_next,Destory);
                        M_G_DISPLAY_OR_CLEAN_LINE_BETWEEN_CPU_AND_SYSTEM_PROCESS(0);
                        M_G_DISPLAY_SYSTEM_PROCESS();
                        M_DRAW_MACHINE_LIGHTS(0,0,3);
                        M_DRAW_MACHINE_LIGHTS(0,4,1);
                        M_G_DISPLAY_MACHINE_HAS_SHUTDOWN();
                        getch();
                        process = FALSE;
                        continue;
                    }
                    /* 刷新显示系统进程提示信息,并调用SUPERWAIT*/
                    SUPERWAIT();
                    RUNNING_QUEUE->p_next->p_status = Ready;
                    M_G_DISPLAY_OR_CLEAN_LINE_BETWEEN_CPU_AND_SYSTEM_PROCESS(0);
                    /* 当发生中断时,退出悬挂进程,并处理中断 */
                    DEAL_INTERRUPT();
                    continue;
                }
                /* 保存系统进程的现场 */
                M_SAVE_SYSTEM_PROCESS();
                M_G_DISPLAY_OR_CLEAN_LINE_BETWEEN_CPU_AND_SYSTEM_PROCESS(0);
                M_CLOCK();
                M_MOVE_SYSTEM_PROCESS_FROM_RUNNING_QUEUE_TO_OHTER_QUEUE(RUNNING_QUEUE->p_next);
            }
            /* 在文本方式下显示进程队列窗口*/
            DISPLAY_QUEUE(); 
        }
    }
    M_G_DISPLAY_SYSTEM_PROCESS();
}


DISPLAY_COLOR()
{
    int i,j;
    cleardevice();
    for(i=0;i<16;i++)
        for(j=0;j<16;j++)
        {
            setfillstyle(1,i*16+j);
            bar(j*50,i*37,j*50+40,i*37+25);
        }
    getch();
    cleardevice();
}

⌨️ 快捷键说明

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