Search
7️⃣

[운영체제 예상문제] Ch.7 Deadlocks

DeadLocks

Deadlock 이란 무엇인가?
다음 Resource allocation graph 를 보고 데드락인지를 판별하시오
no circular wait
데드락
no circular wait
설명
deadlock prevention 에 대해서 설명하시오
deadlock recovery 에 대해서 설명하시오
deadlock Avoidance 에 대해서 서술하시오

Deadlock preventio

데드락을 예방하기 위해 개선할 수 있는 측면 4가지를 데드락의 정의와 관련하여 서술하시오

Dining Philosophers problem

 Dining Philosophers problem 에서 데드락 상태를 만드시오
 이러한 데드락 상태를 예방하는 방법에 대해서 서술하시오
 deadlock recovery 방법을 여러가지 제시하시오

Tread programming

스레드란?

가벼운 프로세스다.
프로세스 내부의 하나의 흐름이다.

프로세스 vs 스레드

프로세스는 독립적이지만 스레드는 아니다.
스레드는 code, data, OS 자원등을 공유한다.
프로그램 카운터, 레지스터 셋, 스택 같은 경우에는 따로 할당 받는다.

왜 멀티스레딩을 해야하는가?

빠른 생성을 위해
빠른 context switch 를 위해
빠른 스레드간 통신을 위 해
빠른 종료를 위해

Example

pthread_t 는 정수 타입의 변수이다. 스레드의 id 를 생성해준다.
스레드를 만들 때에는 스레드 내부에서 실행할 함수를 건네주어야한다.

pthread_create() : 스레드 생성 함수.

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg);
C
복사
매개변수 정리
thread : 스레드가 성공적으로 생성되었을 때 생성된 스레드를 식별하기위해서 사용되는 스레드 식별자를 건네 주어야한다.
attr : 스레드의 특성을 지정하기위해서 사용한다. 기본 특성을 이용할 경우 NULL 을 전달해주자.
start_routine : 분기시켜서 실행할 함수를 건네주어야한다.
arg : 위에 건네준 함수의 매개변수로 넘겨진다.
리턴타입
성공적으로 생성될 경우 0 을 리턴

pthread_join() : 스레드의 종료를 기다리는 함수.

int pthread_join(pthread_t th, void **thread_return);
C
복사
매개변수 정리
th : 기다릴 스레드의 식별자를 건네준다.
thread_return : 스레드에서 실행된 함수의 리턴값을 받을 변수를 건네준다.
변수는 반드시 포인터변수를 건네주어야한다.

멀티스레드 파일을 컴파일하는 법

gcc pthread_create.c -o pthread_create -lpthread
Shell
복사
하나씩 뜯어보자
gcc : gcc 컴파일러를 이용한 컴파일 명령어
pthread_create.c : 컴파일하고자 하는 c언어 파일
-o : 뒤에 따라오는 이름의 실행파일을 만든다.
pthread_create : 실행가능한 object 파일의 이름
-lpthread : 포함시키고자하는 라이브러리를 적어준다.

파라미터를 받는 함수를 멀티스레드환경에서 실행해보자.

예제 설명
멀티스레딩을 통해 함수를 실행하였을때
전역변수 g
내부정적변수 s
변화를 관찰해보자.
가장 중요한 점은 concurrency 즉 동시성이다.
shared variable 에 접근할 때 는 반드시 조심하여야한다.
전역 변수에 접근은 피해야하며, 또는 controll 되어야한다.
이에대한 해결책으로는
Mutex
Semaphores 가 있다.
void 타입의 포인터 변수를 필요로한다.
tid의 메모리 주소를 건네주되, void 포인터 타입으로 캐스팅해준다.
함수 내부에서 int 형 포인터로 캐스팅하는 모습

void 포인터

여타 포인터들이 그러하듯이. 주소값을 담는 변수이다.
하지만 어떤 변수의 주소값을 담을지 현재 그 타입이 정해지지 않았다. 라는 뜻
즉, 현재는 타입이 없지만 캐스팅을 통해 그 타입을 바꾸어줄 수 있다.
순수하게 주소만을 가지고 있는 포인터 타입이다.
하지만 이 상태로는 간접참조를 할 수 가 없기 떄문에
반드시 캐스팅을하여서 값에 접근해야한다.

static 변수

1.
프로그램이 시작될 때 할당되고
2.
프로그램이 끝날 때 파괴
3.
초기화해주지 않아도 자동으로 0으로 초기화
내부정적변수
함수가 여러번 실행되도 변수의 선언 및 초기화는 단 한번만 이루어진다!!
1.
함수 내부에서 선언해도 프로그램이 시작될 때 할당되고 프로그램이 종료될 떄 해제
2.
함수가 여러번 실행되도 내부정적변수의 초기화는 1번만 이루어진다.
3.
다른 함수에서 참조 불가 >> 정보의 은닉성 >> 값을 반환해주어야함.

cast 연산자

원하는 자료형이 일치하지 않는 경우 자료형을 변경해주면 된다.
이처럼, 피연산자 앞의 괄호 안에 변경할 자료형을 입력하면 됩니다.
"int형 상수 3을 double형 상수 3.0으로 변환하랑께"
"double형 상수 3.14를 int형 상수로 변환하랑께"