티스토리 뷰

Study/OS

[OS] Mint64OS 21절 MultiThreading

생각많은 소심남 2013. 1. 30. 14:33

지금까지 task를 효율적으로 처리할 수 있는 방안에 대해 이야기 했었는데 그러면 어떤 원리로 처리가 되는지를 알아봐야 할 것 같다.

일단 task는 하나의 실행단위이다. 프로그램이 코드로 작성되어있는 집합일 뿐 이걸 pc가 동작시키기 위해서는 메모리상에 load를 시켜야 한다. 그 memory 상에서 대기하는 형태가 바로 task 인 것이다. 이 걸 다르게 말하면 Process라고도 할 수 있는데 실질적으로 큰 차이를 나타내는 것 같진 않다. 찾아보니까 task와 process의 구분은 MultiTasking의 개념을 설명하기 위해서 한다고는 하는데 자세히는 잘 모르겠다. 아무튼 이런 process가 동시에 처리 되는 것을 앞에서 잠깐 언급한 MultiTasking / MultiProgramming 이란 이름으로 설명한다.

 이 process를 살펴보면 내부에 독립된 메모리 공간과 context, stack을 가지고, cpu에 전달하고 실행시키는 부분이 존재하는데 이걸 Thread라고 한다. 즉 하나의 process 안에 Thread를 포함하고 있는 것이다. 물론 Thread가 여러개 있으면 그만큼 process의 처리속도가 빨라질 것이다. 이걸 MultiThreading이라고 한다.

 간단히 이야기 하면 MultiTasking은 process를 동시에 처리할 수 있는 기법이고, MultiThreading은 하나의 process를 조금 더 빨리 처리하기 위한 기법이라고 보면 될 듯 하다. 인텔 cpu에서 제공하는 기능 중에 HyperThreading이라는 기능이 있는데 이건 MultiThreading이랑 다른 개념이다. MultiThreading은 소프트웨어 상에서의 process 처리 기법이지만 HyperThreading은 애초에 cpu의 코어 컨트롤을 조절해서 한개의 core를 마치 두개의 core인 것처럼 처리하게 해주는 일종의 하드웨어 기법이다.

 아무래도 thread를 통해 process를 처리할 수 있다고 하지만, 여기에서 고려를 해야될 점은 역시 process 종료시에 어떤식으로 thread를 해제하겠냐는 것이다. thread의 특성상 다른 process의 thread와 정보를 공유하기 때문에 무턱대고 thread를 해제하면 그 thread와 같은 영역을 사용하는 다른 thread들의 잘못된 동작을 야기할 수 있다. 그렇다고 thread를 계속 가지고 있을 수는 없기 때문에 어떻게든 처리해줘야 하는데 보통 많이 쓰는 개념이 부모와 자식의 개념이다. 그래서 부모가 해제될때 자식도 같이 해제되게 하고, 자식이 해제되더라도 부모가 계속 남아있는 형태를 취할 수 있는 것이다. 물론 이런 식으로 하기 위해서는 자식은 부모가 누군지를 항상 알고 있어야 한다. 그래서 내부 구조에도 ParentProcessID를 담고 있어야 한다. 



지금은 Process를 생성하고 그안에 3개의 thread가 생기도록 한 예제이다. 잘보면 4번~6번 process의 Parent PID는 전부 0x300000002로 똑같다. 그리고 task ID가 0x300000002인 3번 process의 thread는 3개를 가지고 있는 것이 보인다. 즉 3번 process가 parent process가 되고 4~6번 process가 child process가 되는 것이다. 앞에서 말한 개념이 맞다면 3번 process를 죽이게 된다면 자식들도 같이 죽어야 하는게 맞을 것이다.



그래서 실제로 죽여보면 하위 process들도 같이 죽는 것을 확인할 수 있다. 이제는 thread를 죽여보는 것을 보겠다.


똑같이 thread를 생성한 상태에서 자식 process를 하나 죽였을때는 나머지 process는 살아있고, 대신 부모 process가 가지고 있는 자식 thread의 수가 2개로 줄은 것을 확인할 수 있다.

책에서는 이런 방법을 활용해서 영화 matrix에 나온 한 장면을 표현했다.


댓글