이번 포스팅은 멀티스레드 프로그래밍에 앞서 스레드에 관한 기본 지식을 되돌아보기 쓰기로 했다.
Thread 혹은 쓰레드, 스레드 등 컴퓨터와 관련된 단어임은 확실하게 알고 있으나 무슨 역할을 하는지는 대학 2학년 전공인 운영체제를 배우며 확실하게 알 수 있었다. 그러나 1년이 넘게 지난 지금 스레드가 무엇인지 다시 설명하라고 하면 정확하게는 설명하지 못할 것 같다.
Thread
스레드를 이해하기 전 컴퓨터 프로그램 작동 과정을 이해할 필요가 있다. 컴퓨터에서 프로그램은 실행이 되면 PCB(Process Control Block, 프로세스 제어 블록)을 부여받게 되고 메모리 상의 프로세스로 변경되게 된다. 즉, 프로그램은 모두 프로세스로 바뀌어 실행되는 것이다. 여기서 프로세스는 스레드를 가지고 있다. 단일 스레드 프로그램의 경우 하나의 스레드만 이용하겠지만, 요즘 사용되는 대부분의 프로그램은 스레드를 여러 개 가지고 있는 멀티 스레트 프로그램이다.
위의 과정을 통해 프로세스로 변환된 프로그램은 스레드를 통해 프로세스의 작업을 수행하게 된다. 스레드는 프로세스 작업의 실행 단위라고 부른다. 이렇게 말하면 잘 이해가 되지 않을 수도 있다.
예시를 들어보자. 보통 음악을 들을 때 이용하는 음악 어플리케이션은 여러 개의 작업이 동시에 이루어진다. 기능을 나누어보면 음악 재생, 음악 재생 시간 표시, 정지, 다음, 이전 등이 있다. 각각의 스레드가 각각의 기능을 맡아서 수행한다고 할 수 있다. 스레드는 프로세스의 코드, 전역 데이터, 파일에 접근하여 작업을 수행한다.
한 마디로 정리해보자면 프로그램 내의 단일 작업을 담당하는 단위라고 설명할 수 있다.
Multi Thread
멀티스레드는 하나의 프로세스 안에 여러 개의 스레드가 존재하여 각각의 작업을 독립적으로 수행한다. 프로세스의 구조에는 프로세스의 정보가 있는 정적영역(코드, 전역데이터, 파일 등)이 존재한다. 그리고 각각의 스레드는 본인만의 스택을 가지고 있으며 이 스택을 통해 작업이 어디까지 진행되었는지 저장하여 작업을 진행한다. 스레드는 정적 영역의 데이터에 접근하여 작업을 수행하는데, 스레드 간 정보 교환이 필요 없어서 문맥 교환이 일어나지 않는다. 또한 입출력 대기가 일어난다면 다른 스레드는 각자 자신의 작업을 진행할 수 있다. 또한 각각의 작업에 대해 프로세스를 생성하지 않아서 효율이 좋다.(프로세스를 생성하여 작업을 실행하면, 프로세스간 통신이 필요하여 문맥교환이 자주 일어나게 된다.)
멀티스레드라고 하면 멀티테스크와 혼동되는 경우가 종종 있다. 멀티스레드는 하나의 프로세스 안에 스레드가 여러 개 있는 반면, 멀티테스크는 프로세스가 여러 개 있는 것이다. 예시로 들자면 인터넷 익스플로러는 멀티스레드이다. 따라서 하나의 페이지를 띄워놓은 창에 문제가 생기게 된다면 모든 창이 멈추며 에러가 발생한다. 그러나 크롬은 멀티테스크이기 때문에 각각의 페이지에 대하여 독립적으로 실행된다. 그만큼 자원은 더 많이 소모된다.
Multi Thread Model
멀티스레드 모델은 여러가지 구조가 있지만 간단하게 설명하려 한다.
먼저, 사용자 스레드이다. 사용자 스레드는 커널 스레드 1개와 여러 개의 사용자 스레드로 이루어져 있다. 멀티 스레드라고는 하지만 사실 작업 시간을 쪼개어 나눈 시분할 시스템을 이용하기 때문에 하나의 작업이 입출력 등 대기가 필요한 상황이라면 다른 작업도 멈추게 된다.
다음은 커널 스레드이다. 커널 스레드는 사용자 스레드와 커널 스레드가 1대 1로 연결되어 있다. 보통 우리가 생각하는 멀티 스레드는 이것을 의미하는데, 하나의 스레드가 입출력 대기 등 멈추어도 다른 스레드는 계속 작업을 진행한다. 다중 코어 CPU에서 이용된다고 한다. CPU 에서 8코어 16스레드 등 멀티 스레드 환경에서 이용된다고 할 수 있다.
마지막으로 멀티레벨 스레드이다. 멀티레벨 스레드는 N개의 사용자 스레드와 M개의 커널 스레드가 존재한다. 모두 연결되어, 사용자 스레드 간 문맥 교환이 매우 빠르고, 커널 스레드의 갯수가 여러 개이므로 작업 처리에 매우 유용하다고 할 수 있다. 대규모 트래픽이 발생하거나 게임서버와 같은 특수한 상황에서 쓰인다고 한다.
다음 글 부터는 멀티스레드 프로그래밍에 관한 글을 포스팅 할 예정이다. 다시 한 번 정리하여 글을 쓰다보니 그 당시에는 이해가 되지 않던 부분도 이해가 되었고, 생각보다 모르는 부분이 많았다.
'OS' 카테고리의 다른 글
OS - 메모리 배리어 - Memory Barrier (0) | 2024.07.11 |
---|---|
OS - 캐시(Cache) (0) | 2024.07.09 |
OS - 컴파일러 최적화 (0) | 2024.07.09 |
OS - 스레드 생성(Task) - C# (0) | 2024.07.08 |
OS - 스레드 생성(Thread, ThreadPool) - C# (0) | 2024.07.08 |