세마세마 소리만 듣다보니 머리가 아푸시지요? ㅋㅋ

(리니지 본던 3층에 카르파 3인방중에 세마가 있지 않았나? ㅋㅋㅋ 세마의 모자 ㅋㅋㅋ)

세마포어를 이용하는 용도 여러개중에

카운팅 세마포어나 세마포어 은닉 이런 부분은 일단 생략하고 넘어가도록 할게요 ㅋㅋ

대신에 Deadlock 현상의 탈출과 세마포어를 이용한 랑데뷰 (동기화) 에 대해 소개하려 합니다.

(1) Deadlock (교착상태)

Deadly embrace 라고도 불리우는 교착상태는 두 태스크가 각자 다른 태스크에서 쓰고있는 자원을 무한정 기다리는 상태를 말합니다.

재미난 상황인데요 ㅋㅋ 예들 들어보지요 ㅋㅋ

테스크 1, 2번이 있습니다. 얘네들은 각각 리소스 1,2 두개가 모두 있어야 돌수가 있어요 ㅋ

테스크 1번은 리소스 1을 소유했습니다 ㅋㅋ
이때 테스크 2번은 리소스 2를 소유 했다고 생각해 보세요 ㅋ

그러면? 테스크 1번은 리소스 2번을 필요로 하고 이때 테스크 2번은 리소를 1번을 필요로 하겟네요? ㅋㅋ

아 이렇게 난감할때가 ㅋㅋ 어떻게 일이 진행 될 기미를 보이질 않습니다 ㅋ

테스크 1과 테스크 2 모두 더이상 진행이 불가해 지는것이지요

이런 상태를 Deadlock 이라고 부릅니다.

해결 방안은 아래와 같아요

(1) 프로세스를 진행하기 전에 필요한 모든 자원의 세마포어를 획득하도록 한다.
(2) 순서대로 자원을 획득하고 역순으로 자원을 양도한다.

대부분의 커널은 세마포어의 타임아웃을 지원합니다 ㅋ 일정 시간이 지났음에도 불구하고 필요한 세마가 모두 획득이 되질 않는다면 가지고 있는 세마를 모두 놓아 놓고 다시 경쟁을 붙이는 것이지요~

이런 식으로 해결 할수 있답니다~

(2) Synchronization (동기화)

세마포어를 플레그 처럼 사용하는 것이지요 ~ ㅋㅋ ISR 와 태슼, 혹은 태스크와 태스크를 동기화 할 수 있습니다 ㅋ

바로 Psudo Code 를 보여드리도록 하지요 ~

Task1()
{
task 2에게 신호를 보낸다
task 2로부터 신호를 기다린다
작업을 계속한다.
}

Task2()
{
task 1에게 신호를 보낸다
task 1 로 부터 신호를 기다린다.
작업을 계속한다.
}


이렇게 하면 Task 1과 Task 2 를 동기화 할 수 있지요? ㅋㅋ

그렇다고 진짜 동시에 도는 것은 절대로 아닙니다 ㅋㅋ

뇌를 장착할수 있는 곳은 1군데 밖에 없다고 하였지요? ㅋㅋ

라운드 로빈 도는것처럼 요 테스크 한번 조테스크 한번 사이좋게 빠르게 돌면 크게 보면 동기화해서
도는것처럼 보이자나요 ㅋㅋㅋ

정말로 페러럴 프로세싱을 원한다면 FPGA 쪽으로 가셔야지용 ㅋㅋㅋ

그럼 제가 직접 구현한 동기화 코드를 보실깝숑??

__task void task1(void)
{
 
 while(1)
 {
 
 os_sem_send(tsema1);
 os_sem_wait(tsema2,0x0F00);
 
 test_sem1++;
 }
}

__task void task2(void)
{
 
 while(1)
 {
 os_sem_send(tsema2);
 os_sem_wait(tsema1,0x0F00);
 test_sem2++;
 
 }
}

__task void Init(void)
{
 os_sem_init(tsema1,0);
 os_sem_init(tsema2,0);

 T_task1 = os_tsk_create(task1,10);
 T_task2 = os_tsk_create(task2,10);

 os_tsk_delete_self();
}

자 얼추 코드는 이렇습니다

위에서 설명한 것과 똑같이 짜놨지요??

예상대로라면 test_sem1 과 test_sem2 라는 변수가 사이좋게 1씩 차이나면서 올라가야합니다 ㅋㅋ

그럼 어디 그런지 함 보시죵

어때요 ㅋㅋ 싱크가 맞지용? ㅋㅋㅋ

이걸 다른말로 랑데뷰 라고도 부른답니다 ~ ㅋㅋ

한번씩들 해보셔요 ㅋㅋ

Posted by J.Bear