lock 이 워낙 중요해서 서버 개발할때 평생 잡고 살거라 직접 구현해 봐야 한다. 

 

여러가지 테크닉들을 이용해서 lock을 구현 할 수 있는데 이런 부분들이 multi thread 프로그래밍의 뼈가 되고 살이 될것이다. 

 

 

그럼 생각해보자.

 

화장실에 이미 사람이 있다고 하면 어떻게 할 것인가?

 

크게 세가지로 구분해보자

 

1. 무식하게 앞에서 계속 기다리기 ( 효율적일수도 있음 , 안에 있는 사람이 오랫동안 안나오면 비효율적)

   -  spin lock ( 뺑뺑이를 돌면서 나 들어가도 돼? 들어가도 돼?  물어본다. )

   -  context switching 이 없다. 

 

2. 자리로 되돌아가고, 나중에 다시 돌아올게 ( 약 3분 후 ) 

 - 확실성이 없고, 운빨에 맡긴다. (10초만 더 기다렸으면 들어갈 수 있었는데, 10초 차이로 다른 사람이 들어갈 수 도 있다.) 

- sleep을 해서 운영체제한테 잠시 소유권을 넘겼다가 돌아오는 방법

 

3. 직원 한명을 고용해서 화장실이 비면 불러달라고 말해달라고 한다. 

- 본인 입장에서는 아름다운 방법이지만, 다른 사람의 리소스를 사용하는것이다. 

- event를 활용하는 방법.

 

 

그런데 다르게 생각해보면

첫번째 방법을 제외한 2,3 번 방법은 다시 자리로 왔다가 화장실로 가는 비용이 든다. ( context switching

 

 user  level < -- > Kernel mode

 

참고 )
그런데 쓰레드 vs 프로세스 에서 

프로세서는 Code Data stack Heap 구조의 독립된 메모리 영역을 OS 로부터 할당 받는데,
쓰레드는 stack만 따로 할당 받고, Code data Heap 영역은 공유한다. 

그렇기 때문에

멀티 프로세스의 단점은 context switching 과정에서 공유메모리가 없어 캐쉬 메모리 초기화 했다가 다시 다 들거오는 등 무거운 작업이 진행되어 오버헤드가 발생한다는 점이고, 프로세스간 통신을 하려면 IPC 기법을 사용해야 된다는 점이다.

멀티 쓰레드 의 장점은 멀티 프로세스의 비해 쓰레드들끼리 공유하는 데이터가 있어 스레드간 데이터를 주고 받는 것이 간단해지고 시스템 자원 소모가 줄어, context switching 이 빠르다는 점이다. 

단점은 디버깅이 까다롭고, 동기화 문제가 일어난다는 점이다. 

 

 

+ Recent posts