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

📄 jobs.h

📁 该模块包括作业调度的三个系统进程。P1、P2、P3进程功能的实现。 P1负责对用户作业预输入处理
💻 H
📖 第 1 页 / 共 4 页
字号:
                        J_OUTPUT_JOB_HEAD->j_next = NULL;
                        J_OUTPUT_JOB_HEAD->j_length = 0;
                    }
                    else
                    {
                        J_OUTPUT_JOB_HEAD->j_next = deletejcb->j_next;
                        J_OUTPUT_JOB_HEAD->j_length--;
                    }
                    /* 释放JCB控制块 */
                    free(deletejcb);
                    /* 重新显示输出井的作业队列*/
                    M_G_DISPLAY_OUTPUT_QUEUE();
                    M_G_DISPLAY_OR_CLEAN_SYSTEM_MEMORY(0,0);
                    M_G_DISPLAY_OR_CLEAN_DATA_FROM_SYSTEM_BUF_TO_PRINTER(0);

                    M_PROCESS_SLEEP_SETTING(RUNNING_QUEUE->p_next,-1);
                    M_SET_SYSTEM_PROCESS_STATUS(RUNNING_QUEUE->p_next,Ready);
                    flag = TRUE;
                }
        }/* end of switch */
    }/* end of while */
}

/****************************************************************************
模块名称:  预输入模块
函 数 名:  READ_LINE_FROM_KEYBOARD_TO_MEMORY
功    能:  从用户键盘中读入数据到内存
入口参数:  (FILE *fp)用户作业文件指针 (long *offset)偏移量指针 (char *p)缓冲区指针
出口参数:  返回读到的字符数
调用关系:  被INPUT_PROCESS调用
编    者:  陈俭(AP0006301)
编写日期:  2003-10-7
完成日期:  2003-10-7
*****************************************************************************/
int READ_LINE_FROM_KEYBOARD_TO_MEMORY(FILE *fp,long *offset,char *pb)
{
    char c=0;
    int n=0;
    /* 移动文件读写指针到指定的位置*/
    fseek(fp,*offset,0);
    /* 读入一个字符 */
    c=fgetc(fp);
    /* 如果该字符不是回车换行符,同时不是文件末,一直循环 */
    while(c!=LINEEND && c!=EOF)
    {
        /* 将读到的字符存放到PB所指的内存缓冲区中*/
        *pb=c;
        /* 将内存缓冲区指针后移一个单位长度*/
        pb++;
        /* n 表示读到的字符数,当读到一个字符之后 n 加1 */
        n++;
        /* 继续读取下一个字符,直到回车换行符或是文件结束符 */
        c=fgetc(fp);
    }
    /* 给读到的字符串加上结束标志*/
    *pb='\0';
    /* 获得当前文件的读写指针的位置,为下一次读写作准备*/
    *offset=ftell(fp);
    /* 返回读到的字符数*/
    return(n);
}



/****************************************************************************
模块名称:  预输入模块
函 数 名:  M_DEAL_KEYBOARD_TO_SYSTEM_MEMORY
功    能:  从用户键盘中读入数据到系统内存
入口参数:  (FILE *fp)用户作业文件指针 (long *offset)偏移量指针 (char *p)缓冲区指针
出口参数:  返回读到的字符数
调用关系:  被INPUT_PROCESS调用
编    者:  陈俭(AP0006301)
编写日期:  2003-10-7
完成日期:  2003-10-7
*****************************************************************************/
M_DEAL_KEYBOARD_TO_SYSTEM_MEMORY(FILE *fp,long *offset,char *w)
{
    int i=0,read_chars;
    /* 从(存于真正硬盘)用户作业文件中读入用户作业数据,并将读到的字符数返回给read_chars */
    read_chars=READ_LINE_FROM_KEYBOARD_TO_MEMORY(fp,offset,w);
    if(read_chars <= 0)
        return(0);
    while(read_chars > 0 && i<10)
    {
        /* 将从键盘读到的数据写入系统存取区的输入井缓冲区 */
        strcpy(&SYSTEM_INPUT_BUF[i][0],w);
        i++;
        if(i == 10)
            break;
        else
        {
            /* 从(存于真正硬盘)用户作业文件中读入用户作业数据,并将读到的字符数返回给read_chars */
            read_chars=READ_LINE_FROM_KEYBOARD_TO_MEMORY(fp,offset,w);
        }
    }
    return(i-1);
}


/****************************************************************************
模块名称:  预输入模块
函 数 名:  M_BUILD_JOB_PCB_AND_JOIN_INTO_READY_QUEUE
功    能:  为作创建进程控制块,并将其移动到正在处理作业队列中
入口参数:  
出口参数:  
调用关系:  
编    者:  陈俭(AP0006301)
编写日期:  2003-10-7
完成日期:  2003-10-7
*****************************************************************************/
M_BUILD_JOB_PCB_AND_JOIN_INTO_READY_QUEUE()
{
    PCB *newjob,*p;
    int i,j;
    newjob = (PCB*)malloc(sizeof(PCB));
    if(newjob == NULL)
    {
        /* 无法建立PCB控制块 */
    }
    /* 将作业的有关信息写入到PCB控制块中 */
    /* 初始化刚才申请的结点 */
    /* 作业名称 */
    strcpy(newjob->p_name,J_INPUT_JOB_HEAD->j_next->j_name);
    /* 作业运行估计时间 */
    strcpy(newjob->p_runtime,J_INPUT_JOB_HEAD->j_next->j_runtime);
    /* 作业输出估计行数 */
    strcpy(newjob->p_outputline,J_INPUT_JOB_HEAD->j_next->j_output_line);
    /* 进程当前计数器指针为 0 */
    newjob->p_pc = 0;
    /* 复位进程状态寄中存器 */
    newjob->p_c = 'F';
    /* 复位通用寄存器 */
    newjob->p_r = 0;
    /* 进程基址指向内存空闲首地址 */
/*  newjob->p_base = PAGE_OF_MEMORY[i].base;  */
    /* 进程占用内存长度 */
    newjob->p_length = J_INPUT_JOB_HEAD->j_next->j_length;
    newjob->p_color = J_INPUT_JOB_HEAD->j_next->j_color;
    /* 进程程序段起始位置为 0 */
    newjob->p_prog_start = J_INPUT_JOB_HEAD->j_next->j_p_start;
    /* 进程数据段起始位置为 0 */
    newjob->p_data_start = J_INPUT_JOB_HEAD->j_next->j_d_start;
    newjob->p_prog_end = J_INPUT_JOB_HEAD->j_next->j_p_end;
    newjob->p_data_end = J_INPUT_JOB_HEAD->j_next->j_d_end;
    /* 置该进程为用户进程 */
    newjob->p_type = 'U';
    /* 置进程状态为就绪状态 */
    newjob->p_status = Ready;
    /* 为进程分配时间片 */
    newjob->p_tick = TIMESLICE;
    /* 复位进程中断状态寄存器 */
    newjob->p_int_status = 0;
    /* 为进程分配ID号,每一个进程的ID号都不相同,且为唯一的 */
    newjob->p_id = ID++;
    J_INPUT_JOB_HEAD->j_next->j_id = newjob->p_id;
    /* 进程装载入内存时占用内存页表的下标*/
/*  newjob->p_page_of_memory = i;  */
    /* 复位进程已占用CPU的时间*/
    newjob->p_running_time = 0;
    /* 复位进程已输出数据行数*/
    newjob->p_output_lines = 0;
    /* 占用输入井作业表的下标 */
/*  newjob->p_index = J_INPUT_JOB_HEAD->j_next->j_index; */
    /* 进程输出数据时,显示在输出表格中的位置(下标) */
/*  newjob->p_output_information_line = OUT_INFORMATION_LINE; */
    /* 清除进程错误标志 */
    newjob->p_error = -1;
    /* 清空输出缓冲区 */
    for(i=0;i<10;i++)
        for(j=0;j<5;j++)
            newjob->p_print[i][j]='\0';
    /* 复制作业页表*/
    for(i=0;i<10;i++)
        newjob->p_job_table[i] = J_INPUT_JOB_HEAD->j_next->j_job_table[i];

    /* 将该作业加入到正在处理的作业队列中 */
    M_MOVE_JCB_FROM_INPUT_JOB_TO_DEALING_JOB();

    /* 将进程加入到用户就绪队列中 */
    p=READY_QUEUE;
    while(p->p_next!=NULL)
        p=p->p_next;
    newjob->p_next = p->p_next;
    p->p_next = newjob;
    /* 就绪队列的进程数加 1 */
    READY_QUEUE->p_tick++;

}

/****************************************************************************
模块名称:  预输入模块
函 数 名:  M_MOVE_JCB_FROM_INPUT_JOB_TO_DEALING_JOB
功    能:  将作业移动到正在处理作业队列中
入口参数:  
出口参数:  
调用关系:  
编    者:  陈俭(AP0006301)
编写日期:  2003-10-7
完成日期:  2003-10-7
*****************************************************************************/
M_MOVE_JCB_FROM_INPUT_JOB_TO_DEALING_JOB()
{
    /* 将该作业加入到正在处理的作业队列中 */
    J_DEALING_JOB_TAIL->j_next = J_INPUT_JOB_HEAD->j_next;
    if(J_INPUT_JOB_HEAD->j_next == J_INPUT_JOB_TAIL)
    {
        /* 已经是最后一个结点了 */
        J_INPUT_JOB_HEAD->j_next = J_INPUT_JOB_HEAD->j_next->j_next;
        J_INPUT_JOB_TAIL = J_INPUT_JOB_HEAD;
    }
    else
    {
        /* 删除第一个结点 */
        J_INPUT_JOB_HEAD->j_next = J_INPUT_JOB_HEAD->j_next->j_next;
    }
    J_DEALING_JOB_TAIL = J_DEALING_JOB_TAIL->j_next;
    J_DEALING_JOB_TAIL->j_next = NULL;
}


/****************************************************************************
模块名称:  预输入模块
函 数 名:  M_PRINT_ONE_LINE_OF_JOB_RESULT
功    能:  模拟打印机打印一行数据
入口参数:  char *p 要打印数据的首地址
            int no 要打印的数据类型
出口参数:  
调用关系:  
编    者:  陈俭(AP0006301)
编写日期:  2003-10-7
完成日期:  2003-10-7
*****************************************************************************/
M_PRINT_ONE_LINE_OF_JOB_RESULT(char *p,int no)
{
    char *buf,tempbuf[10];
    int size,i;
    G_POINT s,e;
    s.x = print_left+1;
    s.y = print_top+print_height - (print_height/13-1)*13;
    e.x = print_left+print_width-1;
    e.y = s.y + (print_height/13-1)*13;

    /* 计算保存图形的缓冲区的大小 */
    size = imagesize(s.x,s.y,e.x,e.y);
    /* 申请缓冲区 */
    buf = malloc(size);
    /* 保存屏幕内容 */
    getimage(s.x,s.y,e.x,e.y,buf);
    putimage(s.x,s.y-13,buf,COPY_PUT);
    free(buf);
    setfillstyle(1,0);
    bar(print_left+1,print_top+print_height-13,print_left+print_width-1,print_top+print_height-1);
    /* 采用上移的方式打印出数据 */
    setcolor(J_OUTPUT_JOB_HEAD->j_next->j_color);
    if(no == 0)
    {
        if(*p == '!')
        {
            /* 表示要打印的该行是出错信息 */
            outtextxy(print_left+1,print_top+print_height-13+2,J_OUTPUT_JOB_HEAD->j_next->j_name);
            for(i=0;i<2;i++)
                DRAWMAT(error_info+i*24,12,print_left+1+32+i*12,print_top+print_height-13,yellow_color);
            itoa(J_OUTPUT_JOB_HEAD->j_next->j_error,tempbuf,10);
            outtextxy(print_left+1+32+24,print_top+print_height-13+2,tempbuf);
            for(i=0;i<2;i++)
                DRAWMAT(error_info+(i+4)*24,12,print_left+1+32+24+8+8+i*12,print_top+print_height-13,yellow_color);
            if(J_OUTPUT_JOB_HEAD->j_next->j_error_row == 100)
                itoa(1,tempbuf,10);
            else
                itoa(J_OUTPUT_JOB_HEAD->j_next->j_error_row+3,tempbuf,10);
            outtextxy(print_left+1+32+24+8+8+24,print_top+print_height-13+2,tempbuf);
        }
        else
        {
            /* 打印作业运行的结果 */
            outtextxy(print_left+1,print_top+print_height-13+2,p);
        }
    }
    else

⌨️ 快捷键说明

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