티스토리 뷰

음. 이 과제느 아마, 교착상태에 걸릴 수 밖에 없는 함수 두개를 주고선 해결해보는 과제였던 것 같다. 뭔가 이 함수의 작동들을 설명한 그림들은 내가 공부했던 운영체제에서 그렇게 표현하길래 그저 따라해봤을 뿐.. 이해하기 편하라고 해둔 것이고 딱히 큰 의미는 없다.
컴퓨터공학과 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)
}
}
'잊어버린 과거' 카테고리의 다른 글
[과제]윈도우프로그래밍. MFC 프로그래밍 교육용 소스코드 (0) | 2013.12.24 |
---|---|
[과제]윈도우프로그래밍. 해양 구조물 부식방지 시스템(제안서3, 최종결과) (0) | 2013.12.24 |
[과제]윈도우프로그래밍. 해양 구조물 부식방지 시스템(제안서 2) (0) | 2013.12.24 |
[과제]윈도우프로그래밍. 해양 구조물 부식방지 시스템(제안서 1) (0) | 2013.12.24 |
[과제]운영체제. 페이징 시뮬레이션 소프트웨어 (2) | 2013.12.24 |
[과제]운영체제. 세마포어 문제(흡연자, 헤어샵) (0) | 2013.12.24 |
[과제]소프트웨어공학. 소프트웨어 개발(프레젠테이션) (0) | 2013.12.22 |
[과제]소프트웨어공학. 소프트웨어 개발(설계서_2) (0) | 2013.12.22 |
[과제]소프트웨어공학. 소프트웨어 개발(설계서_1) (0) | 2013.12.22 |
[과제]소프트웨어공학. 소프트웨어 개발(요구사항 명세서) (0) | 2013.12.22 |