반응형
더보기
목차
- Review of Process
- Thread 란 무엇인가?
- Thread 와 CPU Utilization
- Process 와 Theads
- Thread 의 구성요소
- Single-Thread 와 Multi-Threaded Process
- Multicore Programming
- User and Kernel Threads
- Thread 로 인한 OS 의 변화
- Thread Issues
- Creation
- Cancellation
- Thread Pools
- Thread 간 IPC
Review of Process
- Process 정의
- 실행 단위(Execution Unit)이며, 스케줄링 단위로 사용됨.
- Protection Domain: 프로세스가 소유하고 있는 자원을 보호.
- Program과 Process의 관계
- 프로그램은 단순히 실행 코드이며, 프로세스는 실행 중인 프로그램.
- 지금까지의 프로세스는 단일 실행 흐름(single thread of control)을 가짐.
- "여러 실행 흐름을 가지면 어떻게 될까?" → 스레드(Thread)의 등장.
Thread 란 무엇인가?
- Thread의 정의:
- 실행 단위(Execution Unit).
- 프로세스 내부의 실행 흐름을 더 세밀하게 나눈 것.
- 프로세스보다 가벼운 단위(Finer Grain).
- Process 가 제공한 Protection Domain 은 없음
- 동기
- 하나의 프로세스에는 하나의 제어(Control)만 존재 → 한 번에 하나의 일만 처리.
- Process 에서 할 작업을 여러 개로 나눈 후에 각각을 Thread 화 한다면, 병렬적으로 작업을 완수할 수 있음
- Cooperative Process 와의 차이점
- 여러 개의 프로세스가 협력하여 작업 수행.
- 하지만 IPC와 Context Switching 비용이 큼.
- Thread:
- 프로세스 내부에서 여러 실행 흐름 생성 가능.
- Thread 간의 협력을 통해 비용 절감.
Thread 와 CPU Utilization
- Thread 수와 Throughput(처리량):
- Thread가 많을수록 CPU Utilization(활용률)이 증가.
- 하지만 일정 한계 이후에는 성능이 감소 → Thread Switching 비용 증가 때문.
(thread가 CPU 사용량을 넘어섰다.)
- CPU 활용도 증가:
- 멀티 프로세서 환경에서 Thread를 활용하면 CPU 활용도가 높아짐.
- Multi-processing:
- 여러 프로세스가 병렬로 실행됨.
- Multi-threading:
- 하나의 프로세스 내에서 여러 Thread가 병렬로 실행됨.
Process 와 Threads
- Process:
- 각각 독립된 실행 흐름을 가짐.
- thread 는 process 가 가진 자원을 공유한다.
- 메모리와 자원을 독립적으로 사용.
- Switch 비용이 높음: 프로세스 간 전환(Context Switching)은 상대적으로 비용이 큼.
- Thread:
- 하나의 프로세스 내에서 여러 개의 실행 흐름.
- 프로세스의 코드(Code), 데이터(Data)를 공유.
- Switch 비용이 낮음: 동일 메모리 공간을 공유하므로 전환 비용이 적음.
Thread 의 구성 요소
- Thread 는 하나의 실행 흐름이므로 이와 관련된 자료 구조가 필요
- Thread의 필요 구성 요소 (다르다)
- Thread ID: Thread를 식별하는 고유 ID.
- Program Counter: 실행 중인 명령어의 주소.
- Register Set: CPU 레지스터 값.
- Stack: 각 Thread마다 고유한 스택을 가짐.
- Thread의 필요 구성 요소 (다르다)
- 동일한 Process 내에 다른 Thread 와 공유하는 것 (같다)
- Code: 동일 프로그램의 코드 섹션.
- Data: 동일 프로세스의 데이터 섹션.
- File: 동일 프로세스의 열린 파일(Open File).
Single-Thread 와 Multi-Threaded Process
- Single-Threaded Process:
- 하나의 실행 흐름.
- 코드, 데이터, 파일, 레지스터 등을 독립적으로 소유.
- Multi-Threaded Process:
- 여러 실행 흐름(Thread)을 포함.
- 공유 자원: 코드, 데이터, 파일.
- 고유 자원: 각각의 레지스터, 스택, 프로그램 카운터, ID
Multi-Threaded Program 의 장점
- Responsiveness
- 일부 작업이 블록(Block)되어도 다른 스레드가 계속 실행되므로 프로그램의 **인터렉티브 성능(Interactive Performance)이 유지.
- Resource Sharing
- 동일 프로세스 내 스레드들은 프로세스 자원을 공유(Code, Data, Files).
- Economy
- 새로운 프로세스를 생성하는 것보다 스레드 생성 비용이 훨씬 낮음.
- 스레드는 프로세스 메모리를 공유하기 때문에 메모리 소모도 적음.
- Scalability
- 여러 Thread 가 각기 다른 processor 에서 병렬로 실행 가능
- 멀티 코어 CPU 와 잘 맞는 구조
Multicore Programming
- 최근 Processor 동향은 하나의 Chip 에 여러 개의 Computing Core 를 탑재 (Multicore Processor)
- 각 코어(Core)가 독립적으로 작업을 수행.
- 스레드가 여러 코어에 분산되어 병렬 실행 가능.
- MultiThread Programming 은 Multicore 시스템에서도 효율적임
- Multicore Processor 는 OS 에서 각각의 core 를 하나의 processor 로 인식하고 scheduling
- 각각의 thread 에 Core 를 할당하여 실행 가능
- Multiple Processor 가 달린 Multicore 는 Cache 를 공유하기 때문에 Data, Code 등 Process의 자원을 공유하는 Multithreaded Programming 에 보다 효율적임
User and Kernel Threads
Thread 를 지원하는 주체에 따라 2가지로 나뉜다.
1. User Thread
- 정의:
- 커널 지원 없이 유저 공간에서 관리되는 스레드.
- 일반적으로 사용자 수준 라이브러리를 통해 생성, 관리. Scheduling 과 관련된 관리.
- 장점:
- 동일한 Memory 영역에서 Thread 가 생성되므로 빠르다.
- Thread 관리가 커널과 독립적으로 이루어짐.
- 단점:
- 단일 커널 스레드에 종속:
- 특정 User Thread가 System Call을 호출하거나 Block 상태에 들어가면 같은 프로세스 내 모든 스레드가 멈춤. (Kernel 은 여러 User Thread 들을 하나의 Process 로 간주하기 때문)
- 멀티프로세서 활용이 어려움.
- 단일 커널 스레드에 종속:
2. Kernel Thread
- 정의:
- 커널이 직접 생성, 관리하는 스레드.
- 커널이 스케줄링, 자원 관리, 블록킹 등을 처리.
- 장점:
- 한 스레드가 Block되어도 다른 스레드는 계속 실행 가능. (Thread Blocking 이 없음)
- 멀티프로세서 환경에서 병렬 처리 가능.
- 단점:
- 생성 및 관리 비용이 높음(커널 호출 필요).
Mapping of User & Kernel Thread
1. Many-to-One
- 정의:
- 여러 User Threads가 하나의 Kernel Thread에 매핑.
- 스레드 관리가 유저 레벨에서 이루어짐.
- 특징:
- 장점:
- 관리가 간단하며 유저 스페이스에서 스레드를 제어.
- 단점:
- 동시성 지원이 어려움
- 하나의 커널 스레드만 실행 가능하므로 여러 코어 활용 불가.
- 하나의 User Thread가 Block되면 모든 스레드가 멈춤.
- 동시성 지원이 어려움
- 장점:
- 사용 제한:
- Many-to-One은 Kernel Thread를 지원하지 않는 시스템에서 사용.
- 현대 시스템에서는 사용 빈도가 낮음.
2. One-to-One
- 정의
- 각 User Thread가 하나의 Kernel Thread와 매핑.
- User Thread가 생성되면, 대응되는 Kernel Thread가 생성됨.
- 특징
- 동시성 문제 해결
- 하나의 User Thread가 Block되어도 다른 Thread는 별도의 Kernel Thread를 통해 계속 실행 가능.
- 병렬 실행을 위해 멀티코어(Multiprocessor) 활용 가능
- 장점
- System Call 호출 문제 해결:
- Many-to-One 모델에서 발생했던 문제(하나의 Thread가 Block되면 전체가 멈추는 문제)가 해결됨
- System Call 호출 문제 해결:
- 단점
- Kernel Thread 생성 비용
- Kernel Thread의 수는 User Thread의 수와 동일하므로, 많은 User Thread를 생성하면 커널 자원을 많이 사용.
- 제한된 자원
- 운영체제에서 생성할 수 있는 Kernel Thread의 개수는 시스템 자원에 의해 제한.
- Kernel Thread 생성 비용
- 동시성 문제 해결
3. Many-to-Many
- 정의
- 여러 User Thread를 여러 Kernel Thread에 매핑.
- User Thread와 Kernel Thread의 수는 반드시 동일하지 않음.
- User Thread는 필요에 따라 Kernel Thread와 연결되며, 스케줄링에 의해 관리됨.
- 특징
- 동시성 및 유연성:
- Kernel Thread의 수가 제한되어 있어도, User Thread는 상대적으로 더 많은 수를 생성 가능.
- 동시 실행 및 System Call 처리 중에도 다른 Thread 실행 가능.
- 장점:
- Thread 수에 대해 고민할 필요가 없음
- Block 되는 현상에 대해 걱정할 필요가 없음
- 단점:
- User Thread와 Kernel Thread 간의 매핑을 조정하는 스케줄링 로직이 필요.
- 동시성 및 유연성:
Thread 로 인한 운영체제의 변화
- Process 기반에서 Thread 기반으로 변화
- 기존 Process 중심의 운영체제에서 Thread 중심의 운영체제로 전환:
- System Call 및 스케줄링이 Process 단위에서 Thread 단위로 변경.
- Thread 기반 시스템에서 고려해야 할 사항:
- Thread의 생성 및 종료:
- fork(), exec()와 같은 System Call은 Thread의 구조를 반영해 구현.
- 종료 처리:
- Multi-threaded 프로세스에서 함께 일하는 Thread 의 종료는 Process 보다 복잡해짐
- Thread의 생성 및 종료:
- 기존 Process 중심의 운영체제에서 Thread 중심의 운영체제로 전환:
- Multi-Threaded Programming 에 대한 지원
- 운영체제는 Multi-Threaded 프로그래밍을 지원하기 위해 다음 기능을 제공:
- Thread Scheduling:
- 여러 Thread를 효율적으로 스케줄링하여 CPU 자원을 분배.
- Thread 간 동기화 방법:
- Mutex, Semaphore와 같은 동기화 기법 제공.
- 메모리 공간의 분할:
- 스택, Thread-specific 데이터 등을 각 Thread에 할당.
- Thread Scheduling:
- 운영체제는 Multi-Threaded 프로그래밍을 지원하기 위해 다음 기능을 제공:
Thread Issues
1. Creation
Multithreaded Program 에서 fork 와 exec 의 의미가 달라져야 함
- fork
- 하나의 Program 내의 Thread 가 fork 를 호출하면, 모든 Thread 를 가지고 있는 Process 를 만들 것인지, 아니면 fork 를 요청한 thread 만 복사한 Process 를 만들 것인지 문제
- 리눅스에서는 2가지 버전의 fork 를 만들어 각각의 경우를 처리하도록 한다.
- 하나의 Program 내의 Thread 가 fork 를 호출하면, 모든 Thread 를 가지고 있는 Process 를 만들 것인지, 아니면 fork 를 요청한 thread 만 복사한 Process 를 만들 것인지 문제
- exec
- fork 를 하여 모든 Thread 를 복사한 경우 exec 를 수행하면 모든 Thread 들은 새로운 Program 으로 교체가 됨
- 교체될 Thread 들의 복사는 불필요한 작업
- fork 를 하고 exec 를 할 경우 fork 를 요청한 Thread 만이 복사되는 것이 더 바람직함
- 그러나 fork 를 하고 exec 를 수행하지 않은 경우에는 모든 Thread 의 복사가 필요하기도 함
- fork 를 하여 모든 Thread 를 복사한 경우 exec 를 수행하면 모든 Thread 들은 새로운 Program 으로 교체가 됨
Process Creation in Memory View
- 프로세스 생성 시 메모리 구조 변화:
- Parent Process:
- 부모 프로세스는 실행 중인 프로그램을 포함.
- Child Process:
- fork() 호출로 생성된 자식 프로세스는 부모 프로세스의 메모리를 복사.
- 메모리 복사는 **텍스트(Text)**와 데이터(Data) 섹션 포함.
- Parent Process:
- Unix 방식:
- fork():
- 부모 프로세스의 메모리를 복사하여 자식 프로세스를 생성.
- exec():
- 기존 메모리를 새 프로그램으로 대체
- fork():
2. Cancellation
- 정의:
- 특정 스레드 작업이 완료되기 전에 외부 요청으로 강제 중지.
- 하나의 스레드를 중지시키는 명령이 다른 스레드의 자원을 잠글 수 있음.
- 문제점
- 자원 잠금:
- 스레드가 자원을 사용하는 동안 중지되면, 다른 스레드가 동일 자원을 사용할 수 없음.
ex) 웹 브라우저에서 Image 를 읽어 오는 과정에 사용자가 Stop 버튼을 눌러 취소할 경우, Image 를 읽어오는 Thread 역시 중지가 되어야 함
- 스레드가 자원을 사용하는 동안 중지되면, 다른 스레드가 동일 자원을 사용할 수 없음.
- System Call에 의한 중지 문제:
- 시스템 호출 도중 스레드가 중지되면, 할당된 자원을 함부로 해제할 수 없음 (다른 Thread 가 그 자원을 사용하고 있을지도 모르기 때문)
- 자원 잠금:
3. Thead Pools
- 도입 배경
- Thead 가 자주 생성되고 제거되는 상황에서 새로이 Thread 를 만드는 시간이 실제 Thread 가 동작하는 시간보다 긴 경우가 있음
- 정의:
- Process 가 새로이 실행 할 때 정해진 수 만큼 (휴리스틱 하게) 의 Thread 를 만든 후 Pool 에 할당
- 새로운 Thread 가 필요하면 Pool 에서 가져오고, 작업이 끝나면 그 Thread 를 제거하지 않고 다시 Pool 에 넣어둠
- 새로운 스레드 생성 및 종료 비용을 줄이기 위해 사용.
4. Thread 간 IPC
- 정의:
- 멀티스레드 프로그래밍에서는 스레드 간 통신 및 동기화가 필요.
- 스레드는 동일한 프로세스 내 자원(Code, Memory, File)을 공유하므로 효율적.
- Thread 간 IPC 구현은?
- 동일한 Process 내의 Thread 간 통신은, 공유 Memory 가 효율적임
- Thread 들은 같은 Process 의 Data 영역을 공유하므로 자연스런 공유 Memory 가 가능해짐
- 동일한 Process 내의 Thread 간 통신은, 공유 Memory 가 효율적임
- 결국 IPC 가 최소화 됨
- Thread 들 간의 자원 공유로 인하여 가능해짐
- 다른 Process 에 존재하는 다른 Thread 와의 통신은?
- 다른 프로세스에 존재하는 스레드와 통신하려면 IPC 필요:
- 프로세스 간에는 메모리를 공유하지 않으므로, 별도의 IPC 메커니즘 필요.
ex) 메시지 큐, 소켓, 공유 메모리 등.
- 프로세스 간에는 메모리를 공유하지 않으므로, 별도의 IPC 메커니즘 필요.
- Process 의 경우와 비슷한 성능을 보임
- 이런 통신이 빈번하다면, Program 설계의 잘못
- 다른 프로세스에 존재하는 스레드와 통신하려면 IPC 필요:
반응형