본문 바로가기

Programming/Linux_Kernel

down() / down_interruptible() / down_trylock()

원문 : http://blog.daum.net/youhochul


이 글은 암흑마스크 님이 쓰신 글입니다.

좋은 글이여서 자료 보존차 복사해 왔습니다.




제목과 같은 down() / down_interruptible() / down_trylock() 함수들은 세마포어를 얻는 함수들이다. 

해당 함수들을 검색하여 여기까지 왔다면 아마도 세마포어(Semaphore)가 무엇인지? 

또 어떠한 문제를 풀어나가기 위해 제공되는 함수들인지 모두 알고 있을 것이다. 


아마도 이글을 보는 이유는 세가지 함수가 어떠한 차이점을 지니고 있는지에 대한 궁긍증을 풀기 위함이 아닐까 생각한다.

위의 세 함수는 세마포어를 얻기위한 함수이다. 세마포어를 얻는다는 것은 임계영역(Critical Section)에 접근하기 위한 제어권을 부여 받는다는 것이다. 그러면 각각의 함수의 특징에 대하여 알아보도록 하자. 좀 더 수월한 설명을 위해서 down_interruptible() 함수부터 설명해야 할것 같다. 그래야 down 함수의 이해가 쉽기 때문이다. 


[1] down_interruptible()


해당 함수는 임계영역(Critical Section)에 대한 제어권을 얻기위해서 호출할 것이다. 그런데 만약에 해당 임계영역에 대한 제어권을 이미 다른 프로세스에서 지니고 있다면 down_interruptible() 함수를 호출한 프로세스는 wait queue로 들어가고 sleep 상태가 된다. 그리고 나서 해당 임계영역에 대한 Lock이 풀림과 동시에 sleep 상태에서 깨어나 제어권한을 지니게 된다. down_interruptible() 함수가 지니는 특징은 wait queue에서 대기하고 있을때 나타난다. interruptoble이 의미하는 것은 해당 프로세스가 wait 상태에서 인터럽트에 의해 깨어날수 있다는 말이다. 아시다시피 인터럽트는 하드웨어 인터럽트와 소프트웨어 인터럽트가 있는데 여기서 말하는 인터럽트는 소프트웨어 인터럽트. 즉 Signal에 의해서 깨어날 수 있다는 것을 의미한다. 


Signal에 의해서 깨어난 경우에는 down_interruptible 함수는 EINTR을 반환한다. EINTR이란 Error Interrupt의 약자로 일반적으로 수행중에 인터럽트가 걸려 수행이 중단됨을 의미하는 에러 코드이다. 그러므로 프로그래머는 down_interruptible을 호출할때 반드시 반환값을 확인하여 상황에 맞게 적절한 조치를 수행해야 한다. 


[2] down()


위의 down_interruptible 함수에 대한 설명을 이해했다면 아마도 down 함수는 바로 이해할수 있을 것이다. interruptible 이라는 단어가 빠진것과 같이 down 함수는 인터럽트에 의해 깨어날 수 없다. 


[3] down_trylock()


위의 down / down_interruptible 함수는 만약 임계영역에 대한 제어권을 얻지 못하면 wait queue에 삽입된 후 sleep 상태로 들어간다. 그러나 down_trylock 함수는 다르다. down_trylock 함수는 제어권을 얻기위한 시도를 하고 만약 제어권을 얻지 못하면 sleep 상태로 들어가는 것이 아니고 그냥 0이 아닌 값을 반환한다.