hmk run dev

경쟁상태(Race Condition)와 데드락 본문

카테고리 없음

경쟁상태(Race Condition)와 데드락

hmk run dev 2023. 4. 29. 19:16

경쟁상태(Race Condition)

경쟁 상태(Race Condition)는 둘 이상의 스레드나 프로세스가 공유된 자원(예: 변수, 메모리 등)에 대해 동시에 접근하고 변경하는 경우 발생할 수 있는 문제입니다. 이 경우, 어떤 스레드나 프로세스가 먼저 접근하여 변경한 값을 다른 스레드나 프로세스가 무시하거나, 올바르지 않은 값을 사용하는 등의 문제가 발생할 수 있습니다.

 

예를 들어, 두 개의 스레드가 동시에 같은 변수에 접근하여 값을 증가시킨다고 가정해보겠습니다. 만약, 첫 번째 스레드가 값을 증가시키기 전에 두 번째 스레드가 변수에 접근하여 값을 변경한다면, 첫 번째 스레드가 기대한 값이 아닌 변경된 값으로 변수를 증가시키게 됩니다. 이러한 문제를 경쟁 상태라고 합니다.

 

JavaScript에서도 멀티스레드를 사용할 수 있지만, JavaScript는 기본적으로 단일 스레드로 동작하며, 비동기(Asynchronous) 처리를 위한 이벤트 루프(Event Loop)와 콜백(Callback) 등의 방식을 사용하여 멀티스레드와 유사한 효과를 얻을 수 있습니다.

 

JavaScript에서도 경쟁 상태 문제가 발생할 수 있습니다. 예를 들어, 두 개의 비동기 함수가 동시에 실행되어 같은 전역 변수를 접근하고 변경하는 경우, 동시에 변수 값을 변경하게 되어 경쟁 상태 문제가 발생할 수 있습니다.

따라서, JavaScript에서도 멀티스레드를 사용할 때는, 적절한 동기화 기법을 사용하여 공유 자원에 대한 접근을 관리하고, 경쟁 상태나 데드락과 같은 문제를 예방해야 합니다.

 



데드락(DeadLock)

데드락(Deadlock)은 둘 이상의 프로세스나 스레드가 서로 상대방의 자원을 사용하기 위해 대기하며, 더 이상 진행할 수 없는 상태입니다. 이 상태에서는 블록 상태(Blocked State)에 머무르며, 시스템이 멈추거나 비정상적인 동작을 하게 됩니다.




예를 들어, 두 개의 프로세스 A와 B가 각각 자원 X와 Y를 가지고 있을 때, A는 X를 가지고 Y를 요청하고, B는 Y를 가지고 X를 요청하면, A는 Y를 먼저 얻기 위해 X를 놓치지 않고 기다리며, B는 X를 먼저 얻기 위해 Y를 놓치지 않고 기다립니다. 이렇게 되면, A와 B 모두 상대방의 자원을 기다리면서 대기 상태에 머무르게 되며, 더 이상 진행할 수 없는 데드락 상태에 빠지게 됩니다.

 

데드락은 프로그래밍에서 발생할 수 있는 매우 심각한 문제입니다. 따라서, 데드락을 예방하기 위해서는, 적절한 동기화 기법을 사용하여 자원에 대한 접근을 관리하고, 자원을 점유하는 순서를 일정하게 유지해야 합니다. 또한, 데드락 상태가 발생했을 때 이를 해결하기 위한 알고리즘(예: 교착 상태 탐지 및 복구 알고리즘)을 사용하여 문제를 해결할 수 있습니다.

 

Comments