데드락

Posted 2012. 9. 4. 14:41

정의

두개 이상의 스레드가 하나의 자원을 공유할때

ex) A 에서 B가 가진 자원이 있어야만 동작 가능하며 B의 작업이 끝나기를 기다리고 있는데

B 에서도 A가 가진 자원이 필요해 A가 끝나기를 기다리는 상태일때 두 작업은 교착상태에 빠지게 된다.

 

발생조건

Mutual exclusion : 한번에 오직 1개의 프로세스만 이 자원에 접근 가능

Hold and wait : 최소한 한개의 자원을 가진 프로세스가 다른 프로세스 소유의 자원을 추가로 얻기 위해 기다릴때

No preemption : 해당 작업이 완료되기 전까지는 자원이 반환하지 않는것

Circular wait : 연쇄적으로 자원을 기다리는 형태( 1은 2를 기다리고, 2는 3을 기다리고, 3은 1을 기다리는 상태 )

 

방지 방법

타임 아웃을 줘서 어느 일정시간 동안 락을 기다리다가 반응이 없으면 롤백 시키는 타임아웃 설정

락 타임아웃의 설정 : SET LOCK_TIMEOUT 10000

락 타임아웃 확인 : SELECT @@LOCK_TIMEOUT

트랜잭션 추가

또는 프로시저 우위를 설정해 준다

우선 순위의 레밸은 Low와 Normal로 나타낼수 있고 Priority라는 것을 이용하여 설정 할 수가 있다

SET DEDLOCK_PRIORITY LOW

또는 한 프로시저가 너무 오랫동안 사용하고 있다 의심되는 것을 강제로 종료 시키는 방법

 

'Server' 카테고리의 다른 글

Connection Error] IOCP : GetQueuedCompletionStatus  (0) 2013.10.18
크리티컬섹션, 뮤텍스  (0) 2012.09.04
3way hand shake  (0) 2012.08.13
라우팅  (0) 2012.08.13
OS의 종류와 차이점  (0) 2012.08.13

GetQueuedCompletionStatus() 함수

Posted 2012. 8. 13. 22:49

이제 CP에 등록되는 완료된 IO의 확인방법. 이에 사용되느 함수는

 

BOOL GetQueuedCompletionStatus(

HANDLE CompletionPort,  //완료된 IO정보가 등록되어있는 CP오브젝트의 핸들 전달      

LPDWORD lpNumberOfBytes,  // 입출력 과정에서 송수신 된 데이터의 크기정보를 저장할 변수의 주소값

PULONG_PTR lpCompletionKey,   // CreateIoCompletioPort함수의 세번쨰 인자로 전달된 값의 저장을위한 변수의 주소값

LPOVERLAPPED* lpOverlapped,  // WSASend, WSARecv 함수호출시 전달하는 OVERLAPPED구조체변수의주소값이저장될변수의 주소값 전달

DWORD dwMillisecones   // 타임아웃 정보전달, ㅕㅇ기서 지정한 시간이 완료되면 FALSE를 반환하면서 함수를 빠져나감.

INFINITE-> 완료된 IO가 CP오브젝트에 등록될때까지 블로킹상태.

);

-> 성공시 TRUE, 실패시 FALSE 반환

 

" GetQueuedCompletionStatus 함수의 세번째 인자를 통해서 얻게 되는 것은 소켓과 CP오브젝트의 연결을 목적으로

CreateCompletionPort 함수가 호출될때 전달되는 네번째 인자 값이다.

네번째 인자로 얻게되는건  WSASend, WSARecv함수호출시 전달되느 WSAOVERLAPPED구조체 변수의 주소값이다.

 

'Server > IOCP' 카테고리의 다른 글

Completion Port 오브젝트와 소켓의 연결  (0) 2012.08.13
Completion Port의 생성  (0) 2012.08.13
IOCP  (0) 2012.08.13

생성했다면 오브젝트에 연결해야됨..그래야 완료된 소켓의 IO정보가 CP오브젝트에 등록된다.

 

생성과 연결 함수

HANDLE CreateIoCompletionPort(

HANDLE FileHandle,

HANDLE ExistingCompletionPort,

ULONG_PTR CompletionKey,

DWORD NumberOfConcurrentThreads

);

이번은 연결시점으로 설명)

HANDLE FileHandle     // CP오브젝트에 연결할 소켓의 핸들 전달

 

HANDLE ExistingCompletionPort,    // 소켓과 연결할 CP오브젝트의 핸들 전달

ULONG_PTR CompletionKey,      //완료된 IO관련 정보의 전달을 위한 매개변수. 이는 GetQueuedCompletionStatus함수와 함꼐이해해야됨

DWORD NumberOfConcurrentThreads    // 어떠한 값을 전달하건 이 함수의 두번째 매개변수가 NULL이아니면 그냥 무시됨.

 

ex)

HANDLE hCpObject;

SOCKET hSock;

........

CreateIoCompletionPort( (HANDLE)hSock, hCpObject, (DWORD)ioInfo, 0 );

이렇게 Crea......함수가 호출된 이후부터는 hSock를 대상으로 진행된 IO가 완료되면 이에대한 정보가 핸들 hCpObject에 해당하는 CP오브젝트에 등록된다.

 

'Server > IOCP' 카테고리의 다른 글

GetQueuedCompletionStatus() 함수  (0) 2012.08.13
Completion Port의 생성  (0) 2012.08.13
IOCP  (0) 2012.08.13
« PREV : 1 : ··· : 61 : 62 : 63 : 64 : 65 : 66 : 67 : ··· : 77 : NEXT »