-
Multi Threaded ProgrammingCS/OS 2021. 2. 18. 18:59
2021/01/17 - [Study/OS] - Process & Thread (OS)
Process & Thread (OS)
기본기의 중요성은 항상 느끼고 있는데요. 막상 제대로 알고 있는가 생각했을 때 그렇진 않은 것 같아 하나씩 정리합니다. Process 운영체제로부터 자원을 할당받은 작업의 단위 Thread 프로세스가
exponential-e.tistory.com
윗글에서 간략하게 다중 스레드 및 다중 프로세스에 대한 이야기를 다뤘습니다.
지난번 그림을 가져와 Multi-Threaded와 Single-Threaded를 표현해보면 아래와 같습니다.
그림 1. Multi/Single-Threaded 공통점은 프로세스의 수, 차이점은 스레드의 수입니다.
그림에 나타난 표현으로만 봤을때 이야기입니다.
그리고 스레드의 수와 관계없이 Code, Data, Heap은 공유되지만, 각 스레드의 Stack, Register는 독립적입니다.
이에 따라, 'Process를 여러 개 만드는 것보다 Thread를 만드는 것이 성능상 이롭다'라는 게 지난 포스팅까지의 이야깁니다.
이번 포스팅에선 Multi-Threaded Programming의 장점과 구조에 대해 좀 더 깊게 파악해보려 합니다.
Multi-Thread 장점
Multi-Thread의 장점은 4가지로 볼 수 있습니다.
- 응답성: 프로그램이 다른 작업을 하는 중에도 프로그램이 계속 작동되는 것을 허용함으로써 사용자에 대한 응답성이 증가
- 자원 공유: 프로세스와는 달리 별다른 작업 없이 자신이 속한 프로세스 내의 자원과 메모리를 공유 (문제가 될 수 있음)
- 경제성: 스레드는 자신이 속한 프로세스 내 자원, 메모리를 공유하기 때문에 생성 및 문맥 교환이 매우 경제적
- 확장성: Process 하나 당 Thread 하나씩 병렬로 처리 가능. (i.e. 멀티 프로세서 아키텍처의 효율성)
응답성은 일반적으로 컴퓨터를 사용하는 상황에서 많은 예시가 있습니다.
이해를 위한 예시입니다. 반드시 스레드를 통해서 이루어지는 것은 아닐 수 있습니다.
롤에서 게임을 입장하기 위해 큐를 잡는 중 친구와 채팅으로 이야기하는 경우를 예시로 보겠습니다.
- Single-Thread: 큐가 완전히 잡히기 전까지 친구가 보낸 채팅이 도달하지 않음. (확인 할 수 없음)
- Multi-Thread: 큐가 잡히는 도중 친구와 채팅으로 대화가 가능함.
즉, 어떤 일을 처리하는 중에 요청이 들어온 경우, 바로 응답을 줄 수 있는지를 의미합니다.
자원 공유, 경제성은 멀티 프로세싱에 비해 상당한 이점입니다.
멀티 프로세싱에서 프로세스간 통신은 IPC(Inter Process Communication)를 통해 이루어집니다.
이 방법은 message passing / shared memory 두가지 방식으로 나뉩니다.
message passing
- 한 프로세스 내 생성된 정보(message)를 kernel에 전달
- kernel은 통신할 다른 프로세스로 해당 정보를 받아 전달 (System call 발생)
shared memory
- 공유 메모리에 정보를 담아둠
- 통신할 프로세스의 정보를 공유 메모리에서 참조
Multi-Threading은 이미 서로 자원을 공유하고 있기 때문에 위와 같은 부수적인 공간 또는 작업이 필요 없습니다.
자원 공유의 특성에 의해 경제적
확장성은 전체 규모에 대한 확장성이 유연하다는 의미입니다.
실제로 프로세스 내부 동일한 환경의 스레드는 빠르게 응답을 주지만, 병렬이 아닌 병행처리로 작동합니다.
하지만, 다중 프로세스가 작동하는 환경이라면 각각의 프로세스는 서로 다른 공간이기에 프로세스 간 구분되어 병렬 처리가 가능합니다.
또한, 사용 가능한 프로세서 간에 분할이 가능하기 때문에 스레드의 병렬 처리를 유도해 빠른 응답을 줄 수 있습니다.
규모를 키워도 멀티 스레딩을 통해 많은 요청을 빠르게 처리할 수 있다로 이해하시면 되겠습니다.
Multi-Threading Models
스레드는 2가지가 존재합니다. (대부분의 OS에서)
User Thread
사용자 수준에서 지원되고 관리하는 스레드입니다.
Kernel의 지원 없이 스레드 생성/스케줄링/관리합니다.
일반적으로 개발 시 Application에서 사용하는 스레드를 의미합니다.
user thread가 kernel thread를 이용하려면 System call을 통해 이용 가능합니다.
Kernel Thread
OS 자체의 kernel 내에서 지원하고 관리됩니다.
Mode 변경이 필요해 상대적으로 느립니다.
이 2가지 스레드를 통해 multi-thread 환경을 구현할 수 있습니다.
또한, Multi-Threading은 아래의 전략 중 한 가지를 택해 user thread를 kernel thread에 매핑해 사용합니다.
Kernel mode & User mode
아래에 등장할 용어들이기에 간략히 정리하고 갑니다.
더보기Kernel mode
kernel mode에서 실행되는 모든 코드는 단일 가상 주소 공간을 공유
즉, kernel mode에서 주소 공간의 충돌이 일어나면 전체 시스템에 치명적인 영향을 줄 수 있음
kernel 모드에서는 모든(user + kernel) 메모리 공간에 접근 가능
다양한 System 기능 사용 가능
User mode
프로세스 별로 독립적인 메모리 공간을 가짐
유저 모드에서는 다른 프로세스에 속한 데이터를 변경 불가
유저 모드에서의 충돌은 해당 프로세스로 제한 (운영체제에 영향을 미치지 않음)
기능상 제한적
Many-to-One
그림 2. Many-to-One model 사용자 공간의 thread library에 의해 이루어지는 작업으로 효율적.
커널모드로 전환할 필요가 없기 때문에
한 스레드가 blocking System call을 할 경우 전체 프로세스가 봉쇄.
blocking System call이란 kernel 수준에서 호출된 함수로 해당 작업이 완료될 때까지 무조건 대기해야 합니다.
스레드 정보가 커널 영역에 없기 때문에 커널이 프로세스 단위로 중단시키기 때문입니다.
한 번에 하나의 스레드만이 커널에 접근 -> multi-thread가 multi-processor 환경에 있어도 병렬 작동 불가.
One-to-One
그림 3. One-to-One model 하나의 스레드가 blocking System call을 하더라도 다른 스레드 실행 가능, 다대일 모델에 비해 더 나은 병렬성을 제공.
multi-processor 환경에서 multi-thread가 병렬로 실행되는 것을 허용.
Kernel mode로 전환이 필요하고 따라서, 속도가 느림.
Kernel의 기능을 사용하기 때문에 안정적
user thread를 생성할 때 그에 따른 kernel thread를 생성해야 함.
해당 모델은 일반적으로 전체 스레드 생성 개수에 제한을 둔다고 합니다. kernel thread는 갯수 제한이 있기 때문입니다.
Many-to-Many
그림 4. Many-to-Many model 일대 일, 다대 일의 모델의 단점을 보완한 모델.
사용자는 스레드 생성에 제한을 받지 않음.
Blocking System call 인한 전체 프로세스 봉쇄 문제없음. 즉, 병렬 처리 가능.
빠르게 동작해야 하는 스레드: user thread, 안정적으로 동작해야 하는 스레드: kernel thread.
이렇게 목적에 맞게 나눠 처리해주면 좀 더 효율적이겠죠.
추가로 다대 다, 일대 일 모델을 모두 사용하는 2-level 모델도 있습니다. (따로 소개는 하지 않겠습니다.)
아래는 Thread와 관련된 몇 가지 개념을 소개합니다.
Thread Pool
- 일정한 개수의 스레드를 미리 생성하고 사용하는 기법
- 요청에 따라 매번 스레드를 생성하고 폐기하는 것은 효율이 좋지 못함
- 일정한 개수의 유휴 상태 스레드들을 미리 만들고, 사용하고 끝나면 돌려받는 방식으로 운용
매번 스레드를 생성하는 것이 비효율적인 이유
그림 5. Thread pool 예시 어떤 종이를 잘라서 제공해야 한다고 가정해보겠습니다. 종이를 잘라 제공하는 과정은 아래와 같이 가정합니다.
- 필요한 종이의 개수가 부족한지 확인한다. (스레드가 부족한지 확인)
- 가위를 찾는다.
- 종이에 공간이 있는지 확인한다. (메모리에 여유가 있는지 확인)
- 없다면 자를 수 있는 공간을 찾는다. (없다면 메모리 공간을 늘리기 위한 작업 또는 대기)
- 모양에 맞게 자른다. (스레드 생성)
- 제공한다. (사용)
스레드 풀은 위의 과정에서 왼쪽에 포함됩니다.
우선 스레드 풀은 미리 몇 개를 만들어 놓고 시작함으로써 1번의 과정을 상당히 단축시킬 수 있겠죠.
또한, 같은 이유로 3번, 4번의 과정도 많이 줄어듭니다.
이렇게 중간 과정들이 여러 번 가지치기가 됨으로써 더 효율적으로 동작을 수행할 수 있습니다.
일단 설명하기 위해 써봤는데.. 좀 더 괜찮은 예시를 찾게 된다면, 수정해보도록 하겠습니다. ㅎㅎ
TCB(Thread Control Block)
스레드도 프로세스와 마찬가지로 스레드를 제어하는 TCB(Thread Control Block)가 존재합니다.
또한, 스레드도 마찬가지로 상태(create, running, ready, blocked, terminated)를 가집니다.
이 상태는 스케줄링을 통해 전이됩니다.
참고 자료
TutorialsPoint - OS, Multi-Threading
반응형'CS > OS' 카테고리의 다른 글
Process Memory Area (0) 2021.05.27 Process State & Scheduling (0) 2021.01.31 Process & Thread (OS) (0) 2021.01.17