2. 학습 목표
Philosopher과제 파악하기
3. 학습 방법
건우형한테 흐름 배우기
강의 듣기
https://www.youtube.com/watch?v=YAP0Bv_aQl8
4. 다음 학습 목표
아직은 모르겠음. 과제를 파악하지 못함
5. 상세 학습 내용
철학자의 저녁식사 (Dining = Philosopher)
DeadLock (교착상태)의 개념
- 프로세스가 자원을 얻지 못해 다음 처리를 하지 못하는 상태로, '교착 상태'라고도 하며 시스템적으로 한정된 자원을 여러 곳에서 사용하려고 할 때 발생
DeadLock (교착상태)의 발생 조건
- 교착상태는 한 시스템 내에서 다음의 네 가지 조건이 동시에 성립할 때 발생함. 따라서, 아래의 네 가지 조건 중 하나라도 성립하지 않도록 만들면 교착 상태를 해결함
1) 상호 배제 (Mutual exclusion)
- 자원은 한 번에 한 프로세스만이 사용할 수 있어야 한다.
2) 점유 대기 (Hold and wait)
- 최소한 하나의 자원을 점유하고 있으면서 다른 프로세스에 할당되어 사용하고 있는 자원을 추가로 점유하기 위해 대기하는 프로세스가 있어야 함
3) 비선점 (No preemption)
- 다른 프로세스에 할당된 자원은 사용이 끝날 때까지 강제로 빼앗을 수 없어야 한다.
4) 순환 대기
프로세스의 집합 {P0, P1, ~ Pn}에서 P0은 P1이 점유한 자원을 대기하고 P1은 P2가 점유한 자원을 대기하고 Pn-1은 Pn이 점유한 자원을 대기하며 Pn은 P0이 점유한 자원을 요구해야 한다.
스레드 사용해보기
#include <stdio.h>
#include <pthread.h>
typedef struct data
{
int start;
int end;
int *sum;
} t_var;
int sum;
t_var var[2];
pthread_t th[2];
void *ft_sum(void *par)
{
printf("쓰레드 가동\n");
t_var *var;
int i;
var = (t_var *)par;
i = var->start;
while (i <= var->end)
{
// printf("%d\n", i);
*(var->sum) += i;
i++;
}
return NULL;
}
int main()
{
int sum = 0;
var[0].start = 1;
var[0].end = 50;
var[1].start = 51;
var[1].end = 100;
var[0].sum = ∑
var[1].sum = ∑
pthread_create(&th[0], NULL, ft_sum, &var[0]);
printf("1");
pthread_create(&th[1], NULL, ft_sum, &var[1]);
// pthread_join(th[0], NULL);
// pthread_join(th[1], NULL);
printf("sum %d", sum);
}
pthread_join(th [0], NULL);을 사용하지 않는다면 th [0] 스레드와 th [1] 스레드가 실행되고 있는데
printf("sum % d", sum); 함수를 실행시켜서 예상하지 못한 숫자가 나온다.
실행시킨 스레드가 종료되기 전까지 기다리는 함수 pthread_join를 사용한다면 정상적으로 덧셈을 다한 후 답이 나올 것이다.
근데 큰 오류가 있다. 컴파일한 후 계속 코드를 실행시켜보자.
이상한 값들이 출력된다.
-> 하나의 자원을 한 번에 하나의 스레드만 사용하도록 해야 하는데 그렇지 못한 상황