您的位置:

多道批处理系统的阐述

一、概念简介

多道批处理系统是一种用于管理计算机资源,实现多个程序在计算机上顺序执行的操作系统。

在多道批处理系统中,用户可以将多个作业提交给操作系统执行,系统会按照一定的算法和策略合理地分配资源,使得多个作业能够在计算机上得到有效地执行和调度。

多道批处理系统是计算机操作系统的重要组成部分,广泛应用于科研、教学、工业和企业等各个领域。

二、作业调度

在多道批处理系统中,作业调度是系统的核心功能之一。系统通过作业调度,按照一定的算法和策略来决定哪些作业会被调度执行。

一般来说,作业调度有以下的算法:

1. 先来先服务调度算法(FCFS):按照作业提交的顺序进行调度执行;
2. 短作业优先调度算法(SJF):按照作业需要的处理器时间的长短来进行调度;
3. 优先级调度算法:按照作业的优先级大小来进行调度;
4. 时间片轮转调度算法:为每个作业分配一个固定的时间片,按照时间片的顺序来进行调度;
5. 多级反馈队列调度算法:根据作业的需要,将作业划分成多个级别,按照级别来进行调度。

三、内存管理

在多道批处理系统中,内存管理是一个重要的问题。多个作业在内存中进行调度和执行,需要合理地分配内存资源,避免内存的过度占用和浪费。

内存管理主要包括以下的问题:

1. 内存分配:将内存划分成多个区域,用于存放不同的作业和数据; 2. 内存保护:防止作业之间互相干扰和冲突; 3. 内存回收:在作业执行完毕之后,需要回收和释放内存资源,避免浪费。

四、输入输出管理

在多道批处理系统中,输入输出管理也是一个重要的问题。

多个作业需要使用计算机的输入输出设备进行数据的输入和输出,需要合理地进行管理和调度,避免设备的过度占用和浪费。

输入输出管理主要包括以下的问题:

1. 设备分配:根据不同作业的需求,合理地分配输入输出设备; 2. 设备调度:定义一种算法和策略,合理地调度输入输出设备的使用。

五、进程管理

在多道批处理系统中,进程管理是一种有效地资源管理方式。

进程是计算机上正在执行的程序的实体,是系统调度和管理的基本单位。多道批处理系统需要合理地调度和管理多个进程,避免资源的浪费和冲突,提高系统的效率和可靠性。

进程管理主要包括以下的问题:

1. 进程调度:根据每个进程的需要,合理地分配处理器时间和其他资源; 2. 进程同步:防止进程之间因为共享资源出现冲突; 3. 进程通信:为不同进程之间的数据交换和通信提供基本的支持。

六、安全保障

在多道批处理系统中,安全保障是一个非常重要的问题。

系统需要保护计算机系统的安全和稳定,避免恶意程序的破坏和攻击。

安全保障主要包括以下的内容:

1. 数据保护:保护计算机系统中的数据不被修改或者破坏; 2. 程序保护:保护计算机系统中的程序不被破坏或者恶意攻击; 3. 安全措施:为计算机系统安装防火墙和其他安全措施,保障系统的安全和稳定。

代码示例

//先来先服务调度算法
void fcfs_scheduler(){
    int time = 0, i, j;
    for(i = 0; i < num_jobs; i++){
        printf("job %d starts at time %d.\n", job[i].id, time);
        time += job[i].duration;
        printf("job %d ends at time %d.\n", job[i].id, time);
    }
}

//短作业优先调度算法
void sjf_scheduler(){
    int time = 0, i, j;
    for(i = 0; i < num_jobs - 1; i++){
        for(j = i + 1; j < num_jobs; j++){
            if(job[i].duration > job[j].duration){
                swap_job(&job[i], &job[j]);
            }
        }
    }
    for(i = 0; i < num_jobs; i++){
        printf("job %d starts at time %d.\n", job[i].id, time);
        time += job[i].duration;
        printf("job %d ends at time %d.\n", job[i].id, time);
    }
}

//优先级调度算法
void priority_scheduler(){
    int time = 0, i, j;
    for(i = 0; i < num_jobs - 1; i++){
        for(j = i + 1; j < num_jobs; j++){
            if(job[i].priority > job[j].priority){
                swap_job(&job[i], &job[j]);
            }
        }
    }
    for(i = 0; i < num_jobs; i++){
        printf("job %d starts at time %d.\n", job[i].id, time);
        time += job[i].duration;
        printf("job %d ends at time %d.\n", job[i].id, time);
    }
}

//时间片轮转调度算法
void rr_scheduler(){
    int time = 0, i, j;
    int *remain_time = (int*)malloc(num_jobs * sizeof(int));
    int *start_time = (int*)malloc(num_jobs * sizeof(int));
    for(i = 0; i < num_jobs; i++){
        remain_time[i] = job[i].duration;
        start_time[i] = -1;
    }
    while(1){
        int flag = 0;
        for(i = 0; i < num_jobs; i++){
            if(remain_time[i] > 0){
                flag = 1;
                if(remain_time[i] > time_quantum){
                    remain_time[i] -= time_quantum;
                    time += time_quantum;
                    if(start_time[i] == -1){
                        start_time[i] = time - time_quantum;
                    }
                }
                else{
                    time += remain_time[i];
                    remain_time[i] = 0;
                    if(start_time[i] == -1){
                        start_time[i] = time - remain_time[i];
                    }
                    printf("job %d starts at time %d.\n", job[i].id, start_time[i]);
                    printf("job %d ends at time %d.\n", job[i].id, time);
                }
            }
        }
        if(flag == 0){
            break;
        }
    }
    free(remain_time);
    free(start_time);
}

//多级反馈队列调度算法
void mlfq_scheduler(){
    int time = 0, i, j;
    int *remain_time = (int*)malloc(num_jobs * sizeof(int));
    int *priority = (int*)malloc(num_jobs * sizeof(int));
    int *start_time = (int*)malloc(num_jobs * sizeof(int));
    int *level = (int*)malloc(num_jobs * sizeof(int));
    for(i = 0; i < num_jobs; i++){
        remain_time[i] = job[i].duration;
        priority[i] = job[i].priority;
        start_time[i] = -1;
        level[i] = 0;
    }
    while(1){
        int flag = 0;
        for(i = 0; i < num_jobs; i++){
            if(remain_time[i] > 0){
                flag = 1;
                if(level[i] == 0){
                    if(remain_time[i] > q0_time_quantum){
                        remain_time[i] -= q0_time_quantum;
                        time += q0_time_quantum;
                        priority[i]++;
                        if(start_time[i] == -1){
                            start_time[i] = time - q0_time_quantum;
                        }
                    }
                    else{
                        time += remain_time[i];
                        remain_time[i] = 0;
                        if(start_time[i] == -1){
                            start_time[i] = time - remain_time[i];
                        }
                        printf("job %d starts at time %d.\n", job[i].id, start_time[i]);
                        printf("job %d ends at time %d.\n", job[i].id, time);
                    }
                }
                else if(level[i] == 1){
                    if(remain_time[i] > q1_time_quantum){
                        remain_time[i] -= q1_time_quantum;
                        time += q1_time_quantum;
                        priority[i]++;
                        if(start_time[i] == -1){
                            start_time[i] = time - q1_time_quantum;
                        }
                    }
                    else{
                        time += remain_time[i];
                        remain_time[i] = 0;
                        if(start_time[i] == -1){
                            start_time[i] = time - remain_time[i];
                        }
                        printf("job %d starts at time %d.\n", job[i].id, start_time[i]);
                        printf("job %d ends at time %d.\n", job[i].id, time);
                    }
                }
                else{
                    if(remain_time[i] > q2_time_quantum){
                        remain_time[i] -= q2_time_quantum;
                        time += q2_time_quantum;
                        priority[i]++;
                        if(start_time[i] == -1){
                            start_time[i] = time - q2_time_quantum;
                        }
                    }
                    else{
                        time += remain_time[i];
                        remain_time[i] = 0;
                        if(start_time[i] == -1){
                            start_time[i] = time - remain_time[i];
                        }
                        printf("job %d starts at time %d.\n", job[i].id, start_time[i]);
                        printf("job %d ends at time %d.\n", job[i].id, time);
                    }
                }
            }
        }
        if(flag == 0){
            break;
        }
    }
    free(remain_time);
    free(priority);
    free(start_time);
    free(level);
}