미니옵빠의 code stubs

뮤텍스(mutex)와 세마포어(semaphore), 모니터(Monitors) 본문

Language/Java

뮤텍스(mutex)와 세마포어(semaphore), 모니터(Monitors)

미니옵빠 2011. 8. 28. 20:43
두 쓰레드가 한 자원을 공유할 경우 그 자원의 접근은 반드시 동기화를 해야 하며 이 자원을 condition variable이라 부른다. 자바 랭귀지는 monitors를 사용해서 쓰레드가 condition variable의 동기화 접근을 가능하게 한다.
notify(), wait()함수를 사용해서 producer, consumer가 번갈아 한번씩 물건에 접근하게 한다.

크리티컬 섹션 (Critical Section, 임계 영역)
공유 데이터나 리소스에 대한 접근을 하나의 스레드로 제한한다. 동일한 프로세스 내의 스레드 간 동기화에 사용

뮤텍스:
공유 데이터나 리소스에 대한 접근을 하나의 스레드로 제한한다. 다른 프로세스에 속한 스레드를 제어 가능

세마포어:
뮤텍스와 유사하지만 수행할 수 있는 스레드를 여러개로 제한할 수 있다. 일종의 count 값이라고 생각하면 됨.

-----------

Thread 클래스 상속.
run()함수에서 쓰레드 동작 수행
start()함수로 쓰레드 실행

2가지 방식으로 run함수 제공할 수 있다.
첫번째는 쓰레드 클래스를 상속해서 run함수를 오버라이드.
두번째는 Runnable 인터페이스를 구현.

쓰레드 상태

출처 : http://www.cs.nccu.edu.tw/~linw/javadoc/tutorial/java/threads/states.html

API 보니까 stop, suspend, resume은 위험하다고 쓰지 말라고 하네. 한 15년 된 자료인듯ㅋ

Runnable에서 not runnable로 갈 때는 sleep함수가 호출 되었을 때, 또는 condition variable(공유하구 있는 변수인듯)을 기다릴때, 또는 I/O 처리할때

Dead일 때는 할일 다하고 죽었을 때랑. stop에 의해 죽었을 때. API 문서 보니까 stop 대신에 thread 레퍼런스에 null을 넣으라고 하네.

IsAlive() method : 쓰레드가 살아있는지 확인하는 함수. Runnable일때랑 Not runnable일 때 참.

Thread 우선순위
우선순위가 가장 높은 쓰레드가 선택되어 실행되고 중간에 우선순위가 더 높은 쓰레드가 나오면 교체된다.(preemptive) 쓰레드가 종료되거나 yield()함수로 다른 쓰레드에게 CPU를 넘겨주거나, 무슨 이유로 Not runnalbe이 될 때 낮은 우선순위 쓰레드가 실행 될 수 있다. 쓰레드 2개 이상이 우선순위가 같으면 시스템이 time-sliced일 경우 round-robin 방식으로 수행된다. 즉, 뺑뺑이 돌리면서 실행 된다. time-sliced가 아니면 cpu가 쓰레드 교체 안하고 계속 처리하겠지.

Daemon thread.
다른 스레드에게 서비스를 제공하는 스레드. 그래서 프로세스에 daemon thread 혼자만 남았을 때 존재의 이유가 없어지므로 프로세스가 종료된다.

Thread group
쓰레드를 묶어서 한번에 처리.
처음에 쓰레드 생성할 때 그룹을 지정.
public Thread(ThreadGroup group, Runnable target)
public Thread(ThreadGroup group, String name)
public Thread(ThreadGroup group, Runnable target, String name)
지정 안하면 default 그룹이 됨.
자기가 속한 그룹 찾기
theGroup = myThread.getThreadGroup();

The ThreadGroup Class

출처 : http://www.cs.nccu.edu.tw/~linw/javadoc/tutorial/java/threads/states.html

▶ 쓰레드그룹은 쓰레드를 많이 가질 수 있고, 또한 쓰레드그룹도 가질 수 있다. 
쓰레드그룹은 쓰레드를 관리할 수 있고, 그 그룹에 속한 객체가 자신의 쓰레드그룹의 정보를 알 수 있다. ex) activeCount(), enumerate()
▶ 쓰레드그룹은 그룹레벨에서 유효한 속성 값을 지정하거나 참조할 수 있다. 예를 들면 그룹 속성을 지정할 때 이미 그룹안에 있던 쓰레드들은 영향을 받지 않는다. 새로 들어오는 애들은 영향을 받지만. 예를 들면 setMaxPriority() 함수는 쓰레드나 쓰레드그룹에서 최대로 가질 수 있는 우선순위를 매기는 함수이다. 쓰레드그룹이 setMaxPriority(5)를 하면 그 안에 있는 개별 쓰레드나 개별 그룹이 가질 수 있는 최대 우선순위는 5이다. 하지만 기존에 있던 개별 쓰레드는 자기의 우선순위를 그대로 유지한다. 10이었으면 5로 안바뀌고 10이다. 하지만 새로 들어오는 쓰레드는 영향을 받는다. 그리고 하위 그룹쓰레드의 경우에는 미리 들어와 있던 새로 들어오던 상관없이 부모의 최대우선순위를 준수했다.
▶ 쓰레드그룹은 자기 그룹내에서는 접근제한이 없지만 다른 그룹끼리 정보를 참조 하거나 수정하는 것에는 접근제한이 있다. checkAccess 함수를 이용하여 접근할 수 있는지 없는지 알 수 있다.

Synchronizing Threads
쓰레드들이 데이터를 공유할 경우. 이 데이터들은 동기화 되어야 한다.
Producer/Consumer 문제
producer가 물건을 생산하고 consumer가 그 물건을 소비한다고 할 때, producer와 consumer는 번갈아가면서 물건을 생산 소비 하는 문제. 동기화가 안될 경우 producer나 consumer가 연달아 두 번이상 실행될 경우가 발생한다. 

Race conditions
비동기로 실행되는 쓰레드들이 한 자원에 동시에 접근해서 잘못된 결과를 내는 것.

Monitors
두 쓰레드가 한 자원을 공유할 경우 그 자원의 접근은 반드시 동기화를 해야 하며 이 자원을 condition variable이라 부른다. 자바 랭귀지는 monitors를 사용해서 쓰레드가 condition variable의 동기화 접근을 가능하게 한다.

notify(), wait()함수를 사용해서 producer, consumer가 번갈아 한번씩 물건에 접근하게 한다.

Critical sections
두 쓰레드가 동시에 같은 자원에 접근할 가능성이 있는 코드
자바랭귀지에서는 Critical sections에 synchronized 키워드를 써서 동시 접근을 막는다.
자바에서는 주로 method 에 synchronized를 붙인다. 일부분에도 붙일 수 있으나 객체지향적인 관점에서 프로그램을 유지보수하기가 어렵다고 한다.
쓰레드가 synchronized 함수에 접근할 때 그 쓰레드는 그 객체의 monitor를 얻어서 다른 쓰레드가 그 객체의 synchronized함수를 호출 하는 것을 막는다.
monitor의 획득과 반납은 Java runtime system에 의해 자동으로 이루어 진다.

notify() method
notify() 함수가 호출되면 객체의 모니터를 획득하기 위해 기다리고 있는 쓰레드들 중 하나를 선택하여 모니터를 준다. 모니터를 객체에 접근할 수 있는 허가증이라고 보자.
기다리는 쓰레드가 여러개 있을 때 어떤 객체에게 모니터를 줄것인가는 모른다. Java runtime system 마음이다.
notifyAll()은 기다리고 있는 쓰레드 모두에게 모니터를 얻을 자격을 주는 것이다. 경쟁해서 한놈이 모니터를 갖고 나머지는 다시 기다려야 한다.

wait() method
현재 쓰레드가 wait() method를 호출하면 다른 쓰레드가 notify를 할 때까지 기다린다.
wait()와 notify()을 같이 사용함으로써 자원을 공유하는 쓰레드문제를 처리할 수 있다.

Monitors and the notify() and wait() methods.
현재 쓰레드가 wait() 함수가 호출 될 때 다른 쓰레드가 synchronized 함수에 들어갈 수 있도록 monitor를 내놓는다. 그래서 notify 받으면 다시 모니터를 획득한다.


 출처 : http://www.cs.nccu.edu.tw/~linw/javadoc/tutorial/java/threads/deadlock.html

---------------


참고자료:
http://www.cyworld.com/aspire1127/5175019
http://blog.naver.com/tacma?Redirect=Log&logNo=20100065245
http://ssami.tistory.com/220
http://kin.naver.com/knowhow/detail.nhn?d1id=8&dirId=8&docId=233648&qb=666k7YWN7Iqk&enc=utf8&section=kin&rank=3&search_sort=0&spq=0&pid=gDoAmU5Y7t0sssgSn9sssc--364497&sid=Tloh2PkFWk4AAGvbJQQ
http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=10405&docId=113421521&qb=666k7YWN7Iqk&enc=utf8&section=kin&rank=2&search_sort=0&spq=0&pid=gDoAmU5Y7t0sssgSn9sssc--364497&sid=Tloh2PkFWk4AAGvbJQQ
http://blog.naver.com/cabsoft88?Redirect=Log&logNo=90115377264
http://skyjumps.tistory.com/88