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