본문 바로가기

High Level Technique/Window System

쓰레드 (Thread)

쓰레드 (Thread)



하나의 프로그램이 둘 이상의 프로세스를 생성한다면 컨텍스트 스위칭이 비번하게 일어납니다. 앞서 포스팅에서 컨텍스트 스위칭이 빈번하게 일어나면 성능저하가 일어난다고 했습니다.

그렇다면 컨텍스트 스위칭이 적게 일어나면 되는데, 풀어 말하면 저장하고 복원하는 컨텍스트의 정보 개수를 줄이면 됩니다.


프로세스의 경우 완전히 독립적인 영역이기 때문에 공유를 할 수 없지만 쓰레드의 경우에는 하나의 프로그램에서 둘 이상의 흐름을 만들어 내기 위한 것이기 때문에 프로세스와 달리 공유하는 상태 정보가 있습니다. 따라서 쓰레드를 사용하는 이유에는 공유하는 요소가 잇고, 컨텍스트 스위칭에 걸리는 시간을 줄이기 위한 것입니다.





쓰레드의 특성


1. 쓰레드마다 스택을 독립적으로 할당한다.


프로세스와 마찬가지로 쓰레드도 독립적으로 스택을 할당합니다. 실행 흐름의 추가를 위한 최소 조건이 독립된 스택 제공이기 때문입니다.



2. 코드 영역을 공유한다.


가령 A프로세스와 B 프로세스가 있을 때 A 프로세스에서는 사칙연산을 하고 B 프로세스에서는 해당 결과를 출력한다고 하면 프로세스는 독립적이기 때문에 A 프로세스에서의 결과를 B프로세스에서 출력을 할 수 없습니다.


그럼 쓰레드를 사용하는 경우에는 어떻게 될까요?


쓰레드 main에서는 해당 프로세스의 코드 영역에 접근할 수 있기 때문에 출력을 할 수 있게 됩니다.



3. 데이터 영역과 힙을 공유한다.


지금까지 프로세스간 공유를 하기 위해서 IPC(MailSlot, PIpe)를 사용했습니다. 하지만 쓰레드를 사용함으로써 IPC를 사용하지 않아도 됩니다. 힙과 데이터 영역을 공유하기 때문에 A 쓰레드와 B 쓰레드가 해당 프로세스의 영역에 접근이 가능합니다.



지금까지 프로세스가 Running, Ready, Blocked 상태가 존재하고 그렇게 알고 있었다. 하지만 프로세스는 쓰레드를 담은 상자에 불과하며 해당 상태를 지니는건 쓰레드가 지니는 상태들이다.


따라서 쓰레드에 맞춰 상태가 바뀌게 되는 것이다.





커널 레벨 쓰레드와 유저 레벨 쓰레드



쓰레드의 구현 원리에 대해서 알아보도록 하겠습니다. 이 쓰레드가 과연 누구에 의해서 어떻게 만들어졌을까요?


프로그래머가 A 프로세스와 B 프로세스를 만들었다고 합시다. A 프로세스에는 A, B 쓰레드가 있고 B 프로세스에는 C 쓰레드가 있다고 하죠.


하나의 프로세스에 할당되는 메모리 공간이 4기가바이트라고 가정하면 이중에는 프로그램 코드를 올리고 일부는 실행하는 과정에서 변수 선언이나 메모리의 동적 할당 등의 용도로 사용될 것입니다.


이렇게 프로그램이 동작하기 위해 사용되는 메모리 공간을 유저 영역이라고 합니다.


그렇다면 커널 영역은 뭘까요?


유저 영역을 제외한 나머지를 커널 영역이라고 합니다. 운영체제가 실행되기 위해서는 운영체제도 마찬가지로 메모리에 올라가야 합니다. 이 영역을 커널영역이라고 합니다.


스케줄러에 의해서 쓰레드의 상태가 변한다고 했는데 이 스케줄러가 커널 영역에 존재합니다.


바로 이것이 커널 레벨 쓰레드의 유형입니다.



다음은 유저 레벨 쓰레드인데 커널이 쓰레드 모델을 제공하지 않을 경우 커널에 의존적이지 않은 형태로 쓰레드의 기능을 제공하는 라이브러리를 활용할 수 있는데 이를 유저 레벨 쓰레드라고 합니다.





커널 모드와 유저 모드


프로그램이 실행될 때 유저 영역에서 실행되므로 실제로 커널 영역에서 문제를 일으키지 않을 것 같다. 하지만 C언어는 메모리 참조가 용이하기 때문에 이에 대한 보장을 할 수 없다.

안정성을 제공하기 위해서 커널 모드와 유저 모드가 있다.


일반적인 프로그램은 유저 모드에서 동작한다 그러다 커널이 실행되어야 하는 경우 커널 모드로 전환된다. 마찬가지로 스케줄러 또한 커널의 일부에 해당하기 때문에 스케줄러가 동작하려면 커널 모드로 전환이 필수다.


프로세스가 유저 모드에서 동작할 대는 커널 영역으로의 접근이 금지된다. 유저 모드에서 실행 중인 프로그램이 커널 영역으로 접근을 시도하면 오류가 발생했다고 알리고 접근을 할 수 없게 한다.


대부분의 시스템 함수가 커널 모드로 동작하는데 이렇게 커널, 유저 모드가 전환이 자주 일어나면 시스템에 부담을 준다.




'High Level Technique > Window System' 카테고리의 다른 글

쓰레드 동기화  (0) 2017.01.03
Thread 생성과 소멸  (0) 2017.01.02
우선순위 알고리즘  (0) 2017.01.02
프로세스 환경변수  (0) 2017.01.02
Anonymouse Pipe, Named Pipe  (0) 2016.12.30