📌  相关文章
📜  教资会网络 | UGC NET CS 2016 年 7 月 – II |问题 4(1)

📅  最后修改于: 2023-12-03 14:54:49.697000             🧑  作者: Mango

UGC NET CS 2016年7月-II | 问题4

这是一个关于UGC NET CS 2016年7月-II考试的问题4。这个问题涉及到CPU调度算法和进程并发执行的概念。作为一名程序员,理解这个问题可以帮助您更好地理解操作系统中的进程调度和并发执行。

CPU调度算法

CPU调度算法是指在多道程序环境中,操作系统为各个进程分配CPU的过程。目的是让每个进程都能有足够的CPU时间来运行。 常见的CPU调度算法有以下几种:

  • 先来先服务(FCFS):按照作业到达的先后顺序为它们分配CPU时间
  • 最短作业优先(SJF):选择估计运行时间最短的作业
  • 优先级调度算法:为不同的进程分配不同的优先级,优先级高的进程先被选中
  • 时间片轮转算法:每个进程被分配一个时间片,当时间片用完后,会被挂起,等待下一轮
  • 多级反馈队列调度算法:将就绪队列分为多个优先级,低优先级进程在高优先级进程等待时间过长时被选中。
进程并发执行

在操作系统中,多个进程可以同时运行。操作系统需要协调这些进程,防止它们之间相互干扰或竞争系统资源。常见的进程并发执行技术有以下几种:

  • 进程互斥锁:使用锁机制防止多个进程同时访问共享资源
  • 信号量:用于不同进程中共享变量
  • 临界区:代码片段被保护,防止多个进程同时访问
  • 互斥量:同样用于防止多个进程同时访问共享资源
代码片段

以下是一个实现最短作业优先算法(SJF)的代码片段示例:

#include <stdio.h>
#include <stdlib.h>

struct Process {
    char pid;
    int arrival_time, burst_time, waiting_time, turnaround_time, completion_time;
    int status;
} process_queue[10];

int process_count;

void calculate_waiting_time(int n) {
    int service_time[n];
    service_time[0] = 0;
    process_queue[0].waiting_time = 0;

    for(int i = 1; i < n; i++) {
        service_time[i] = process_queue[i-1].burst_time + service_time[i-1];
        process_queue[i].waiting_time = service_time[i] - process_queue[i].arrival_time;
        if(process_queue[i].waiting_time < 0)
            process_queue[i].waiting_time = 0;
    }
}

void calculate_turnaround_time(int n) {
    for(int i = 0; i < n; i++) {
        process_queue[i].turnaround_time = process_queue[i].burst_time + process_queue[i].waiting_time;
    }
}

void calculate_completion_time(int n) {
    for(int i = 0; i < n; i++) {
        process_queue[i].completion_time = process_queue[i].arrival_time + process_queue[i].turnaround_time;
    }
}

void calculate_average_times(int n) {
    int total_waiting_time = 0;
    int total_turnaround_time = 0;
    int total_completion_time = 0;

    calculate_waiting_time(n);
    calculate_turnaround_time(n);
    calculate_completion_time(n);

    for(int i = 0; i < n; i++) {
        total_waiting_time += process_queue[i].waiting_time;
        total_turnaround_time += process_queue[i].turnaround_time;
        total_completion_time += process_queue[i].completion_time;
    }

    printf("Average Waiting Time: %.2f\n", (float)total_waiting_time / (float)n);
    printf("Average Turnaround Time: %.2f\n", (float)total_turnaround_time / (float)n);
    printf("Average Completion Time: %.2f\n", (float)total_completion_time / (float)n);
}

void sort_by_burst_time(int n) {
    struct Process temp;

    for(int i = 0; i < n-1; i++) {
        for(int j = i+1; j < n; j++) {
            if(process_queue[i].burst_time > process_queue[j].burst_time) {
                temp = process_queue[i];
                process_queue[i] = process_queue[j];
                process_queue[j] = temp;
            }
        }
    }
}

void execute_sjf(int n) {
    process_count = n;

    for(int i = 0; i < n; i++) {
        printf("Enter details for Process %c:\n", i+1);
        process_queue[i].pid = 'A' + i;

        printf("Arrival Time: ");
        scanf("%d", &process_queue[i].arrival_time );

        printf("Burst Time: ");
        scanf("%d", &process_queue[i].burst_time);

        process_queue[i].status = 0;
    }

    sort_by_burst_time(n);
    calculate_average_times(n);
}

int main() {
    int n;

    printf("Enter number of processes: ");
    scanf("%d", &n);

    execute_sjf(n);
    return 0;
}

以上代码片段是一个实现最短作业优先算法的示例,根据用户输入的进程数、进程到达时间和CPU执行时间,可计算出平均等待时间、平均周转时间和平均完成时间。