Thread의 상태
쓰레드는 생성된후 소멸되기 까지 활동 상태로 준비, 실행, 대기 상태에 있을 것이다. → 모든 설명에서 생성은 쓰레드를 등록하고 활동상태로 진입까지 시키는 것을 가정한다.
1. Thread 상태 설명
상태 | 부가 설명 |
Running, 실행상태 | 단일 코어 MCU에서는 한순간에 오로지 하나의 쓰레드 만이 이 상태에 있을 수 있다. |
Ready,대기상태 | 실행상태의 쓰레드가 정지상태 또는 소멸상태가 되면 대기상태 쓰레드 중에서 우선순위가 가장 높은 스레드가 실행될 것이다. |
Suspend,정지상태 | 대기상태로 천이할 수 있는 Event를 기다리고 있다. → 이벤트의 종류로는 Timer, Semaphore, Mutex, Message Queue., 등이 있다. |
Terminated, 소멸상태 | O/S의 장부에서 빠지게 된 상태, 소멸상태의 쓰레드을 다시 사용하기 위해서는 다시 생성을 해 주어야 한다. |
2. Thread 상태 제어
쓰레드는 생성된 다음 대부분은 O/S 시스템의 관리하에서 그 상태가 변경되면서, 서로 독립적인 실행의 흐름을 갖지만,
시스템의 효율성을 높이거나, 쓰레드간 연계작업 또는 조건부 작업이 필요한 경우에는 프로그램밍에 의해 그 상태를 제어할 필요성도 있다.
⊕ 아래의 상태제어들에 대해서 wifi-sa/시스템에서 예제 코드로 연습을 해볼 것이다.
sleep() |
int momo(void ) { while(1){ momo가 할일; sleep(3); } return 0; |
sleep을 호출한 스레드(momo)는 실행상태에서 빠져 나와 자신이 지정한 시간동안 sleep한 후 준비상태로 들어간다. 응용 → (1) momo는 3초 주기로 “무슨할일”을 수행한다, (2) momo는 3초동안 다른쓰레드가 더 자주 실행상태에 있도록 배려한다. ⊕ delay(3)과 효과는 비슷할 수 있지만, delay(3)은 다른 쓰레드가 더 자주 실행되도록 배려하지는 않는다. |
join() |
int momo(void ) { toto 쓰레드생성; join(); soso 쓰레드생성; join(); momo의 할일; return 0; |
join을 호출한 쓰레드(momo)는 실행상태를 빠져나오고, 그 내부에 있던 쓰레드(toto, soso)의 실행이 완료되면 준비상태로 들어간다. 응용 → momo가 하는 작업이 toto와 soso가 하는 작업을 하고 나서 완성해야 하는 경우 |
yield() |
int momo(void ) { if(false) yield() else { while(1) momo의 할일; } return 0; |
yield를 호출한 쓰레드(momo)는 자신의 실행시간을 대기상태의 스레드에게 양보하고 다시 대기상태로 들어간다. 응용 → 비교적 오랜 시간이 필요한 작업의 사이에 다른 쓰레드에게 실행의 기회를 좀더 주고자 하는 경우 → 어떤 조건에 따라 자신은 시간만 죽쳐야 하는 경우에 차라리 다른 쓰레드에게 시간을 좀더 주어 시스템의 효율을 올리기. |