11. 스레드
스레드 | 프로세스 |
CPU 입장에서의 작업 단위 (= 프로세스로부터 전달받은 스레드) |
운영체제 입장에서의 작업 단위 |
- 운영체제는 코드와 데이터를 메모리에 가져오고, 프로세스 제어 블록을 생성하고, 작업에 필요한 메모리 영역을 확보한 후
준비된 프로세스를 준비 큐에 삽입함
- 프로세스가 생성되면 CPU 스케쥴러는 프로세스가 해야할 일을 CPU에 전달하고 실제 작업은 CPU가 수행한다
: CPU 스케줄러가 CPU에 전달하는 일 하나 = 스레드
* 작업의 상대적인 크기
처리(job) > 프로세스 (task) > 스레드 (operation)
* 일괄 작업 batch job
- 여러 개의 스레드가 모여 프로세스를 이루고, 여러 개의 프로세스가 모여 처리가 되며, 여러 개의 프로세스를 모아서 한꺼번에 처리하는 방법
* 프로세스 간 통신 Inter Process Communication, IPC
- 서로 독립적인 프로세스가 데이터를 주고받을 때 이용하는 것
* 멀티스레드 통신
- 멀티스레드는 변수나 파일 등을 공유하고 전역 변수나 함수 호출 등의 방법으로 스레드 간 통신을 함
📍 스레드 관련 용어
◼️ 멀티스레드
: 프로세스 내 작업을 여러 개의 스레드로 분할함으로써 작업의 부담을 줄이는 프로세스 운영 기법
◼️ 멀티태스킹
: 운영체제가 CPU에 작업을 줄 때 시간을 잘게 나누어 배분하는 기법
➡️ 시분할 시스템 time-sharing system : 여러 스레드에 시간을 잘게 나누어 주는 시스템
◼️ 멀티 프로세싱
: CPU를 여러 개 사용하여 여러 개의 스레드를 동시에 처리하는 작업 환경
= 병렬처리에서의 슈퍼스칼라 기법
= 네트워크로 연결된 여러 컴퓨터에 스레드를 나누어 협업하는 분산 시스템
- 하나의 컴퓨터에 여러 개의 CPU 혹은 하나의 CPU내 여러 개의 코어에 스레드를 배정하여 동시에 작동하는 것
◼️ CPU 멀티스레드
한 번에 하나씩 처리해야 하는 스레드를 파이프라인 기법을 이용하여 동시에 여러 스레드를 처리하도록 만든 병렬 처리 기법
* 오늘날의 운영체제는 프로세스를 다양한 스레드로 나누어 여러 개의 코어에 배분함으로써 시스템의 효율을 높임
가벼운 프로세스 Light Weight Process LWP | 무거운 프로세스 Heavy Weight Process HWP |
* 스레드 라이브러리
: 운영체제가 지원하는 라이브러리를 통해 생성됨
- 마하 운영체제의 C-threads
- 솔라리스 운영체제의 threads
- 자바 : 라이브러리 형태가 아니라 프로그래밍 언어 자체에서 스레드를 제공함
- 스레드 클래스 내의 run() 함수를 오버라이딩하여 사용
📍 멀티스레드의 장단점
◼️ 장점
• 효율성 향상
: 여러 개의 프로세스를 생성하는 것과 달리 멀티스레드는 불필요한 자원의 중복을 막음으로써 시스템의 효율이 향상됨
- 프로세스 내 공유가 가능한 부분을 제외하고 실행과 관련된 부분을 스레드로 나누어 관리하며 자원의 중복 사용을 피함으로써 낭비를 막을 수 있음
- 하나의 프로세스에서 여러 스레드를 사용하면 작업의 효율을 높일 수 있음
• 응답성 향상
: 한 스레드가 입출력으로 인해 작업이 진행되지 않더라도 다른 스레드가 작업을 계속하여 사용자의 작업 요구에 빨리 응답할 수 있음
ex. 채팅프로그램으로 채팅을 하면서 파일을 주고 받기
• 자원공유
: 한 프로세스 내에서 독립적인 스레드를 생성하면 프로세스가 가진 자원을 모든 스레드가 공유하게 되어 작업을 원활하게 진행할 수 있음
• 다중 CPU 지원
: 2개 이상의 CPU를 가진 컴퓨터에서 멀티스레드를 사용하면 다중 CPU가 멀티스레드를 동시에 처리하여 CPU사용량이 증가하고 프로세스의 처리 시간이 단축됨
↔️ 단일 스레드는 프로세스 전체의 입출력이 끝날 때까지 대기 상태에 머물러야 하며, 요청한 입력이 끝나야만 다시 재생할 수 있음
◼️ 단점
- 모든 스레드가 자원을 공유하기 때문에 한 스레드에 문제가 생기면 전체 프로세스에 영향을 미침
↔️ 프로세스를 여러 개 만드는 방식의 경우 각 프로세스가 독립적이기 때문에 한 프로세스의 문제가 다른 프로세스로 전달되지 않음
📍 멀티스레드 모델
프로세스 - 커널 프로세스
- 사용자 프로세스
스레드 - 커널 스레드 kernel thread
- 사용자 스레드 user thread
: 사용자 스레드가 커널 스레드를 사용하려면 시스템 호출로 커널 기능을 이용해야 함
◼️ 사용자 레벨 스레드 user-level thread (1 to N 모델)
: 운영체제가 멀티스레드를 지원하지 않을 때 사용하는 방법 ( 초기의 스레드 시스템에서 이용됨)
- 사용자 레벨에서 스레드를 구현하기 때문에 관련 라이브러리를 사용하여 구현하며, 라이브러리는 커널이 지원하는 스케쥴링이나 동기화 같은 기능을 대신 구현해줌
➡️ 커널 입장에서 이 스레드는 하나의 프로세스처럼 보임
- 라이브러리가 직접 스케쥴링을 하고 작업에 필요한 정보를 처리하기 때문에 문맥 교환이 필요없음
• 단점
- 여러 개의 스레드가 하나의 커널 스레드와 연결되기 때문에 커널 스레드가 입출력 작업을 위해 디기 상태에 들어가면 모든 사용자 스레드가 같이 대기하게 됨
- 한 프로세스의 타임 슬라이스를 여러 스레드가 공유하기 때문에 여러 개의 CPU를 동시에 사용할 수 없음
: CPU를 여러 개 갖추고 멀티스레드를 지원하는 커널의 경우 스레드를 여러 CPU에 나누어 작업시키는 것이 가능하나 사용자 레벨 스레드는 하나의 프로세스로 인식되므로 작업을 나눌 수 없음
◼️ 커널 레벨 스레드 kernel-level thread (1 to 1 모델)
: 커널이 멀티스레드를 지원하는 방식
하나의 사용자스레드가 하나의 커널 스레드와 연결됨
- 독립적으로 스케쥴링이 되므로 특정 스레드가 대기 상태에 들어가도 다른 스레드는 작업을 계속할 수 잇음
- 커널이 제공하는 보호 기능과 같은 모든 기능을 사용할 수 도 있음
• 장점
: 커널 레벨에서 모든 작업을 지원하기 때문에 멀티 CPU를 사용할 수 있음
- 하나의 스레드가 대기 상태에 있어도 다른 스레드는 작업을 계속할 수 있음
- 커널의 기능을 사용하므로 보안에 강하고 안정적으로 작동함
• 단점
- 문맥 교환을 할 때 오버헤드 때문에 느리게 작동함
◼️ 멀티 레벨 스레드 multi-level thread (하이브리드 스레드 hybrid thread) - M to N 모델
: 사용자 레벨 스레드와 커널 레벨 스레드를 혼합한 방식
- 멀티 레벨 스레드에서는 커널 스레드의 개수가 사용자 스레드보다 같거나 적음
• 장점
- 하나의 커널 스레드가 대기 상태에 들어가면 다른 커널 스레드가 대신 작업을 하여 사용자 레벨 스레드보다 유연하게 작업ㅇ르 처리할 수 있음
• 단점
- 커널 레벨 스레드를 같이 사용하기 때문에 여전히 문맥 교환 시 오버헤드가 있어 사용자 레벨 스레드만큼 빠르지 않음
➡️ 빠르게 움직여야 하는 스레드는 사용자 레벨 스레드로 작동하고, 안정적으로 움직여야 하는 스레드는 커널 레벨 스레드로 작동함