멀티 스레딩(Multi-threading)이란?
‘멀티~’ 시리즈 편에 막바지에 거의 다 왔습니다.
물론 이 글 다음으로 ‘하이퍼 스레딩’에 대해서 다루겠지만, 멀티 스레딩에 대해 정리를 한다면 하이퍼 스레딩은 별 거 없습니다.
멀티 스레딩은 프로세스와 스레드의 차이를 안다면 쉽게 구별이 가는 개념입니다. 스레드는 프로세스 내에서 생성되는 하나의 실행 주체입니다. 한 프로세스 내에서 생성되는 것으로 여러 개가 동시에 생성이 가능합니다. 또한 생성된 여러 스레드는 하나의 공유 메모리를 가집니다. 그렇기 때문에 서로 간의 정보를 주고 받는데 제한이 없습니다.
가령, 네트워킹을 지원하는 프로그램이 있다고 가정합시다. 프로세스의 정의가 ‘A program in execution’ 이라는 것은 모두 알고 계시죠. 이 프로그램을 실행시키면 메모리에 올라가소 프로세스가 생성이 되겠죠. 어쨌든 이 프로그램에서 사용자가 접속할 때마다 사용자 각각을 처리할 수 있는 처리모듈들이 생성되어야 합니다. 이 처리모듈들이 스레드입니다. 결론적으로 우리는 이 프로그램을 실행시킴으로써 프로세스를 하나 생성했구요. 프로그램 속에서 사용자의 접속마다 지원하는 스레드까지 생성했습니다. 프로세스와 스레드, 차이 아시겠나요?
멀티 스레딩과 멀티 태스킹 차이는?
멀티 스레딩이 멀티 태스킹과 구별되는 점은 앞선 말한대로 서로 간의 자원 공유가 가능하며, 프로그래밍을 통해 구현이 가능하다는 점입니다.
하지만 멀티 태스킹은 운영체제에서 지원해 주는 것으로 서로 간의 자원이 공유되지 못하기 때문에 자원 전달을 위해서는 IPC(Inter Process Communication)을 구현해야 하며, 멀티 스레딩에 비해 운영체제에 부담을 줄 수 있습니다.
하지만 멀티 태스킹은 서로 간의 독립 메모리를 가지고 있기 때문에 독립된 수행이 가능하므로 멀티 스레딩과 멀티 태스킹을 그 용도에 맞게 적절히 사용해야 합니다.
멀티 프로세싱과 멀티 스레딩 차이는?
멀티 프로세싱은 일단 fork 라는 것을 합니다. 그래서 Unix 계열에서 ps 명령어를 보면 알 수 있는데, 포크를 하면 하나의 프로세스가 두 개의 프로세스로 늘어납니다.
이 프로세스들은 서로 통신을 하려면 IPC(세마포, 큐, 공유메모리)를 통해야 합니다. 왜냐하면 서로 전혀 다른 프로세스이니까…(물론 fork 를 사용했으므로 부모 자식 관계는 있습니다.) 즉, 똑같은 프로그램이 복사가 되어서 새로 생성되는 것입니다.
반면에 멀티 스레딩은 프로세스를 복사하는 것이 아니라 Function 단위로 실행시키는 것입니다. 이것은 같은 프로세스이므로 멀티 프로세스에 비해서 부하를 덜 줍니다. (그래서 ‘경량 프로세스’라는 말을 하는 겁니다.) 결국엔 멀티 프로세싱은 똑같은 놈이 하나 더 늘어나는 것이고, 멀티 스레딩은 함수가 백그라운드에서 따로 실행되는 것 입니다.
멀티 프로세싱과 멀티 스레딩의 동작원리
일반적인 개념에서 멀티 스레딩이 멀티 프로세싱보다 효율적입니다. 왜 그럴까요?
프로그램이 동작하기 위해서는 두가지 스택(Stack) 공간이 필요한데, 그것이 바로 Code영역과 Data 영역입니다.
Code 영역 : 특정 프로세스의 동작 상태를 기록하는 곳으로 프로세스가 독립적인 코드 포인터를 가지고 동작하기 위해 필요합니다.
Data 영역 : 하나의 프로세스가 작동 중에 필요로 하는 데이터를 저장해 두기 위한 것으로 프로그램 변수나 메모리 스택 공간을 말합니다.
하나의 프로세스는 동작하기 위해 이러한 두 가지 공간을 모두 요구하게 되는데, 멀티 프로세싱이란 이러한 개별적인 프로세스들이 서로 간에 독립적인 Code 영역과 Data 영역을 유지하면서 함께 작동할 수 있는 상태를 말합니다.
반면에 스레드란 좀 더 작은 규모의 프로세스를 의미하므로, 다수의 스레드는 하나의 프로세스 하부에서 나타나는데 이들은 독립적인 Code 공간을 가지고 개별적으로 작동할 수 있지만, 독립적인 Data 공간을 가지지 않으므로 하나의 프로세스 아래에 있는 모든 스레드들은 해당 프로세스의 데이터 공간을 각각 공유하게 됩니다.
(사실 저는 컴퓨터공학 저학년 때 이 차이를 구분하기 위해서 나름대로 예를 들어 기억하고 다녔는데 무슨 내용이었나면…
이클립스로 코딩을 하는데 main 메소드가 있는 클래스를 프로세스라고 가정하고, 그 클래스에 있는 메소드들을 스레드라고 가정했습니다. 이렇게 되면… 같은 클래스에 있는 메소드(스레드라고 생각끼ㅠ)리는 전역변수를 통해 서로서로 변수를 공유하면서 착하게 살 고 있고, 서로 다른 클래스(프로세스라고 생각끼ㅠ)리는 독립적이다… 뭐 이런 식으로 예를 들어 기억했는데… 이제와서 생각하면 귀엽습니다;;헤헤)
어쨌든 멀티 스레딩은 하나의 프로세스가 다수의 작업을 각각 스레드를 이용하여 동시에 작동 시킬 수 있는 것을 말하는데, 보통 스레드의 생성과 파괴는 Code 영역의 관리만을 필요로 하기 때문에 프로세의 생성과 파괴보다 훨씬 적은 자원을 소모합니다. 이 때문에 멀티 스레딩은 동일 작업을 위한 멀티 프로세싱보다 훨씬 효율적이라고 이야기합니다.
다만, 다수의 스레드가 동일한 Data 공간을 공유한다는 점에서 필연적으로 생기는 문제점이 있습니다. 하나의 스레드가 자신이 사용하던 Data 영역을 망가뜨린다면 그 결과는 하나의 Data 영역을 공유하는 모든 스레드를 작동불능의 상태로 만들게 됩니다. 이러한 문제에 대비하기 위하여 Critical Section 기법이 존재하게 되었습니다…
여기까지 멀티 스레딩에 대한 정리이었습니다. 다음에는 하이퍼 스레딩에 대해 정리하겠습니다.
'컴퓨터공학' 카테고리의 다른 글
하이퍼 스레딩이란? - (2) (2) | 2016.02.15 |
---|---|
하이퍼 스레딩이란? - (1) (2) | 2016.02.15 |
멀티 프로그래밍이란? (0) | 2016.02.12 |
멀티태스킹이란? (2) | 2016.02.12 |
멀티 프로세싱이란? (2) | 2016.02.12 |
이 글을 공유하기