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형 상수로 변환하랑께"