Bash Unix 쉘스크립트의 라운드 로빈(RR) 스케줄링

Bash Unix 쉘스크립트의 라운드 로빈(RR) 스케줄링

Unix Shellscript를 사용하여 CPU 스케줄링 알고리즘을 시뮬레이션하고 싶지만 쉘 스크립트가 실행될 때 루프 루프가 끝나지 않습니다. 코드를 수정하는 방법을 모르겠습니다.

코드는 다음과 같습니다.

round_robin()
{
    #Variables and arrays 
    declare -a processesRR=("${!1}") 
    declare -a arrivalsRR=("${!2}")
    declare -a burstsRR=("${!3}")
    time_quantum="${!4}" #Redirection again needed so $4 won't just print out tquantum
    numberOfProcesses="${#processesRR[@]}" #declare how many processes are there
    numberOfProcessesRunning=$numberOfProcesses #for keeping track on which processes have finished.

    #Time remaining assignment
    for ((i=0; i<$numberOfProcesses; i++))
    do
        remaining_time[i]=${burstsRR[i]}
    done

    printf "Program Name\t Arrival Time\t Burst Time\t Completion Time\t Turnaround Time\t Waiting Time\t\n\n"
    #Actual algorithm. This also generates the table.
    complete=0 #For checking the completion of a process
    time=0 #For checking time
    i=0 #Index
    resetPrinciple=$(($numberOfProcesses - 1)) #Fix to test operation not allowing arithmetic
    while [[ $numberOfProcessesRunning != 0 ]]
    do
        if (( ${remaining_time[i]} <= $time_quantum && ${remaining_time[i]} > 0 )) #indicates process completes here.
        then
            ((time += ${remaining_time[i]}))
            remaining_time[i]=0
            complete=1

            elif (( ${remaining_time[i]} > 0 )) #process was not completed
            then
                ((${remaining_time[i]} - $time_quantum))
                ((time += ${remaining_time[i]}))
        fi

        if (( ${remaining_time[i]} == 0 && $complete == 1 ))
        then
            numberOfProcessesRunning=$(($numberOfProcessesRunning - 1))
            completion_timeRR[i]=$time
            turnaround_timeRR[i]=$(($time - ${arrivalsRR[i]}))
            waiting_timeRR[i]=$((${turnaround_timeRR[i]} - ${burstsRR[i]}))
            total_turnaroundRR=$(($total_turnaroundRR + ${turnaround_timeRR[i]}))
            total_waitingRR=$(($total_waitingRR + ${waiting_timeRR[i]}))
            complete=0 #start again anew
            printf " %s\t %s\t %s\t %s\t %s\t %s\t\n\n" "${processesRR[i]}" "${arrivalsRR[i]}" "${burstsRR[i]}" "${completion_timeRR[i]}" "${turnaround_timeRR[i]}" "${waiting_timeRR[i]}"
        fi

        if (( $i == $resetPrinciple )) #to avoid non-existent entries and let it reset
        then
            i=0
            elif (( ${arrivalsRR[i]} <= $time )) #check time if we can increment
            then
                ((i++))
        else #¯\_(ツ)_/¯
            i=0
        fi
    done
    avrWaitTime=$(($total_waitingRR / $numberOfProcesses))
    avrTurnTime=$(($total_turnaroundRR / $numberOfProcesses))
    printf "Average waiting time: %s\n" "$avrWaitTime"
    printf "Average turnaround time: %s\n" "$avrTurnTime"

}
# based on http://blockofcodes.blogspot.com/2015/08/first-come-first-serve-scheduling.html
    # print Gantt chart
    printf "\n" # Empty line
    printf "          GANTT CHART          \n"
    printf "          ***********          \n"


    # print top bar
    printf "\n"
    for((i=0; i<$numberOfProcesses; i++))
        do
            for((j=0; j<"${burstsFCFS[i]}"; j++)) 
                do
                    printf -- "--" #this fixes the argument error - Gabs
                    printf ""
                done
        done
    printf "\n|"

    # printing process id in the middle
    for((i=0; i<$numberOfProcesses; i++))

        do
            for((j=0; j<${burstsFCFS[i]} - 1; j++)) 
            do
                #printf "\n"
                printf ${processesFCFS[i]}
            done
            for((j=0; j<${burstsFCFS[i]} - 1; j++)) 
            do
                printf " "
                printf "|"
            done
        done

    printf "\n "
    # printing bottom bar
    for((i=0; i<$numberOfProcesses; i++))

        do
            for((j=0; j<${burstsFCFS[i]} - 1; j++)) 
                do
                    printf -- "--"
                    printf ""
                done
        done

    printf "\n"

    # printing the time line
    printf "0"
    for((i=0; i<$numberOfProcesses; i++))

        do
        turnaround_time[i]=$((${completion_time[i]} - ${arrivalsFCFS[i]}))
        for((j=0; j<${burstsFCFS[i]}; j++)) 

            do
                printf " "
            if [[ ${turnaround_time[i]} > ${turnaround_time[$((j + 1))]} ]] 

                then 
                printf "\b" # backspace : remove 1 space
                printf "%d " "${turnaround_time[i]}"
            fi
            done
        done


    printf "\n"

라운드 로빈 일정의 출력을 표시합니다. 루프 출력

관련 정보