직업은 선물 트레이더

[과제]운영체제. 교착상태 해결

잊어버린 과거

음. 이 과제느 아마, 교착상태에 걸릴 수 밖에 없는 함수 두개를 주고선 해결해보는 과제였던 것 같다. 뭔가 이 함수의 작동들을 설명한 그림들은 내가 공부했던 운영체제에서 그렇게 표현하길래 그저 따라해봤을 뿐.. 이해하기 편하라고 해둔 것이고 딱히 큰 의미는 없다.

 

 

컴퓨터공학과 2010151035 장용하 // 4월 20일

 

교착상태

초기의 상황은 위와같습니다.

func1이 끝나기전에 func2가 시작하면,

서로가 가진 자원을 원하면서 무한정 기다리는 교착상태에 빠지게 됩니다.


두가지 코드 변경으로 교착상태를 피해가도록 해보았습니다.

경우 1. func1만 수정한다.

경우 2. func1, func2 모두 수정한다.


수정된 전체코드는 마지막장에 첨부했으며,

각 경우의 핵심적 코드는 그림 하단에 간단한 설명과 함께 적었습니다.







< 경우 1 >

 

교착상태 해결

 

 

교착상태 해결 소스


 

꼭 그 시점에 배열 a에 접근하지 않아도 됨에도 불구하고 exitcritical(a)를 나중에 호출하는 것은 부적절 한 것으로 생각되어 위로 옮겼습니다.


결과는 위의 그림처럼 교착상태를 피해갈 수 있는 경우가 생겼습니다.


 


< 경우 2 >

교착상태 해결

 

교착상태 해결 소스

 


func1 뿐만아니라 func2도 변경했을 때의 경우입니다.


더이상 교착상태가 생길 수 있는 경우가 없어진 것 같습니다.


excitcritical(b)를 이유 없이 나중에 호출하는 것은

의미가 없다고 보고 위로 옮겼습니다.

 



< 수정된 전체 코드 >


#include <unistd.h>

#include <stdlib.h>


int a[4] = {150, 100, 200, 50};

int b[4] = {1, 1, 2, 0};


void func1() {

        int tmp1, tmp2;


        entercritical(a)

        tmp1 = a[1];

        tmp1 = tmp1 + 10;


        a[1] = tmp1;

        exitcritical(a)


        if(tmp1 > 200) {

                entercritical(b)

                tmp2 = b[1];

                tmp2 += 1;

                b[1] = tmp2;

                exitcritical(b)

        }

}


void func2() {

        int tmp1, tmp2;


        entercritical(b)

        tmp2 = b[1];

        exitcritical(b)


        if(tmp2 >= 2) {

                entercritical(a)

                tmp1 = a[1];

                tmp1 = tmp1 * 0.05;

                a[1] = tmp1;

                exitcritical(a)

        }

}