[Coding Assignment1]safety_algorithm.py 4.36 KB
#_*_ coding: utf-8 _*_

process_num = 4     #process 갯수
resource_num = 3    #resourse 종류
resource_max = []

finished_process = []   # process 수행종료 여부
alloc = []              # 각 process의 초기할당
process_max = []        # 각 process의 max
avail = []              # 각 process의 available
need = []               # 각 process의 need
safety_order = []       # safe한 process의 순서를 나타냄

def main() :

    # 초기 설정 작업 #

    # finished_process 계산
    for i in range(0, process_num) :
        finished_process.append(False)
        safety_order.append(0)


    while(1) :

        print("\nPlease Enter 1 to Safe Case")
        print("or 2 to Unsafe Case")
        choice = int(input("Enter : "))

        if(choice == 1) :
            
            # Safe Case의 각 resource 상한과 현재 할당량, process별 상한 지정
            resource_max = [20,30,40]
            alloc = [[0,5,1],[2,2,2],[1,2,1],[2,8,18]]
            process_max = [[10,15,4],[2,25,35],[17,20,30],[10,19,20]]
            
            for j in range(0, resource_num) :   # avail 계산
                temp = resource_max[j]
                for i in range(0,process_num) :
                    temp -= alloc[i][j]
                avail.append(temp)
                
            for i in range(0, process_num) :    # need 계산
                temp = []
                for j in range(0, resource_num) :
                    temp.append(abs(process_max[i][j]-alloc[i][j]))
                need.append(temp)
            
            break

        elif(choice == 2) :
            
            # Unsafe Case의 각 resource 상한과 현재 할당량, process별 상한 지정
            resource_max = [20,30,40]
            alloc = [[0,5,1],[2,2,2],[1,2,1],[2,8,18]]
            process_max = [[20,15,4],[2,25,35],[19,20,30],[15,19,20]]
            
            for j in range(0, resource_num) :   # avail 계산
                temp = resource_max[j]
                for i in range(0,process_num) :
                    temp -= alloc[i][j]
                avail.append(temp)
                
            for i in range(0, process_num) :    # need 계산
                temp = []
                for j in range(0, resource_num) :
                    temp.append(abs(process_max[i][j]-alloc[i][j]))
                need.append(temp)

            break

        else :
            print("Please Enter Right Value!")



    # 현재상황 출력
    print("\n--------------Safety Algorithm--------------\n")

    print("Current Allocation : [A, B, C]")
    for i in range(0, process_num) :
        print("               P#"+str(i+1)+" : "+str(alloc[i]))

    print("\n       Current Max : [A, B, C]")
    for i in range(0, process_num) :
        print("               P#"+str(i+1)+" : "+str(process_max[i]))



    # 비교 및 순서도출
    time = 0

    while(time < process_num) :
        for i in range(0, process_num) :
            k = 0
            for j in range(0,resource_num) :
                if(need[i][j] <= avail[j]) :
                    k += 1  # 해당 process가 available보다 작은 need를 가졌다면 count
            
            if(k == resource_num) :         # 해당 process의 모든 resource가 available보다 작은 need를 가진 경우
                finished_process[i] = True  # 해당 process는 finish 했다고 표시됨
                for l in range(0, resource_num) :
                    avail[l] = avail[l] + alloc[i][l]   # 자신이 할당했던 resource를 환원하고
                    need[i][l] = 10000      # 끝난 process는 need값을 많이 높여 비교대상에서 제외
                
                safety_order[time] = i      # safety_order에 현재 time에 적합한 process의 index를 설정
                break
            
        time += 1


    time = 0

    for i in range(0, process_num) :
        if(finished_process[i] == True) :
            time += 1   # i값에 따라 True인 process를 찾고 time을 증가시킨다 

    if(time == process_num) :   # 모든 process가 True여야만 Safe Case이다.
        result = ""
        for i in range(0, process_num) :
            result = result + "Process#" + str(safety_order[i]+1) + "/"
        print("\n   Safe Processes! : " + result)

    else :
        print("\nNot Safe Processes!")


    print("\n--------------------------------------------\n")

if __name__ == '__main__' :
    main()