CS 공부
스레드(Thread) + 프로세스 VS 스레드 본문
스레드(Thread)란
프로세스 내에서 실행되는 실행 단위
프로세스는 이러한 스레드를 한 개 이상으로 나눌 수 있다.
쓰레드는 프로그램 카운터와 스택 포인터 등을 비롯한 쓰레드 실행 환경 정보(Context 정보), 지역 데이터, 스택을 독립적으로 가지면서 코드, 전역 데이터, 힙을 다른 쓰레드와 공유한다.
스레드 사용 이유
프로세스의 처리 속도를 높이기 위해 하나의 프로세스가 수행해야할 여러 작업들을 나누어 수행할 수 있도록 설계된 것이 스레드 즉 한 개의 프로세서로 3개의 스레드로 구성하면 3개의 프로세서와 같은 효과를 낼 수 있다.
스레드의 장점
1. 사용자 응답성 증가
2. 프로세스 자원과 메모리 공유가능
3. 프로세스 컨텍스트 스위칭보다 쓰레드 컨텍스트 스위칭이 오버헤드가 더 적다.
4. 다중 처리로 성능과 효율 향상
다중 스레드는 프로그램 하나를 여러 실행 단위로 쪼개어 실행한다는 측면에서 다중 처리(다중 프로세싱)와 의미가 비슷하다. 하지만 동일 프로세스의 스레드는 자원을 공유하므로 자원 생성과 관리의 중복성을 최소화하여 실행 능력을 향상시킬 수 있다. 그리고 각 스레드는 커널이 개입하지 않고도 독립적으로 실행할 수 있어 서버에서 많은 요청을 효과적으로 처리할 수 있다.
보통 프로세스를 생성하면 해당 프로세스의 스레드도 함께 생성한다. 단, 스레드 생성에서는 운영체제가 부모 프로세스와 공유할 자원을 초기화할 필요가 없다. 해당 프로세스가 스택과 레지스터를 직접 제공하기 때문이다.
그러므로 프로세스의 생성과 종료보다는 오버헤드가 훨씬 적다. 여기서 스레드의 장점 하나는 스레드 한 개가 대기 상태로 변할 때 전체 프로세스를 대기 상태로 바꾸지 않는다는 것이다. 실행 상태의 스레드가 대기 상태가 되면 다른 스레드를 실행할 수 있다.
그러나 프로세스와 달리 서로 독립적이지는 않다. 프로세스 하나에 있는 전체 스레드는 프로세스의 모든 주소에 접근할 수 있으므로 스레드 한 개가 다른 스레드의 스택을 읽거나 덮어쓸 수 있다.
스레드 제어 블록(TCB)
프로세스가 프로세스 제어 블록에 정보를 저장하듯이 스레드도 스레드 제어 블록에 정보를 저장한다.
프로세스는 스레드를 한 개 이상 가질 수 있으므로, 결국 프로세스 제어블록은 스레드 제어 블록의 리스트를 가리킨다.
스레드의 구현
스레드는 운영체제에 따라 다음 세 가지 형태로 구현한다.
1) 사용자 수준 스레드 - 다대일 매핑
사용자 수준 슨레드는 스레드 라이브러리를 이용하여 작동하는 형태
스레드와 관련된 모든 행위를 사용자 영역에서 하므로 커널이 스레드의 존재를 알지 못함
스레드 라이브러리는 스레드의 생성과 종료, 스레드 간의 메시지 전달, 스레드의 스케줄링과 컨텍스트 등 정보를 보관한다.
스레드 교환에 커널이 개입하지 않아 커널에서 사용자 영역으로 전환할 필요가 없다.
커널은 스레드가 아닌 프로세스를 한 단위로 인식하고 프로세서를 할당한다.
다수의 사용자 수준 스레드가 커널 수준 쓰레드 한 개에 매핑 되므로 다대일 스레드 매핑이라고 한다.
장점
1. 이식성이 높음
커널에 독립적으로 스케줄링을 할 수 있어 모든 운영체제에 적용할 수 있다.
2. 오버헤드가 적음
스케줄링이나 동기화를 하려고 커널을 호출하지 않으므로 커널 영역으로 전환하는 오버헤드가 줄어든다.
3. 유연한 스케줄링이 가능
커널이 아닌 쓰레드 라이브러리에서 스레드 스케줄링을 제어하므로 응용 프로그램에 맞게 스케줄링할 수 있다.
단점
1. 시스템의 동시성을 지원하지 않음
스레드가 아닌 프로세스 단위로 프로세서를 할당하여 다중 처리 환경을 갖춰도 쓰레드 단위로 다중 처리를 하지 못한다. 동일한 프로세스의 스레드 한 개가 대기 상태가 되면 이 중 어떤 스레드도 실행하지 못한다.
2. 확장에 제약이 따름
커널이 한 프로세스에 속한 여러 스레드에 프로세서를 동시에 할당할 수 없어 다중 처리 시스템에서 규모를 확장하기가 어렵다.
3. 스레드 간 보호 불가능
스레드 간 보호에 커널의 보호 방법을 사용할 수 없다. 스레드 라이브러리에서 스레드 간 보호를 제공해야 프로세스 수준에서 보호가 가능하다.
2) 커널 수준 스레드 - 일대일 매핑
커널 수준 스레드는 커널(운영체제)에서 지원하는 형태
커널 수준 스레드는 사용자 수준 쓰레드의 한계를 극복하는 방법
커널이 스레드와 관련된 모든 작업을 관리한다.
한 프로세스에서 다수의 스레드가 프로세서를 할당받아 병행으로 수행하고, 스레드 한 개가 대기 상태가 되면 동일한 프로세스에 속한 다른 스레드로 교환이 가능하다. 이때도 커널이 개입하므로 사용자 영역에서 커널 영역으로 전환이 필요하다.
커널 수준 쓰레드는 사용자 수준 스레드와 커널 수준 스레드가 일대일로 매핑된다. 따라서 사용자 수준 스레드를 생성하면 이에 대응하는 커널 스레드를 자동으로 생성한다.
장점
커널이 직접 스케줄링 하고 실행하기 사용자 수준 스레드의 커널 지원이 부족한 문제를 해결 가능
커널이 각 스레드를 개별적으로 관리할 수 있어 동일한 프로세스의 스레드들을 병행으로 수행 할 수 있다.
단점
전체 프로세스가전체 프로세스와 쓰레드 정보를 유지하여 오버헤드가 커진다.
커널 영역으로 전환 시 스케줄링과 동기화를 하려면 많은 자원이 필요하다
3) 혼합형 쓰레드 - 다대다 매핑
1)과 2)의 혼합형
시스템 호출을 할 때 다른 스레드를 중딴하는 1)의 단점과 스레드 수를 제한하는 2)의 문제를 극복하는 방법
사용자 수준 스레드는 커널 수준 스레드와 비슷한 경량 프로세스에 다대다로 매핑
경량 프로세스는 커널 수준 스레드와 일대일로 매핑
결국 다수의 사용자 수준 스레드에 다수의 커널 쓰레드가 다대다로 매핑
프로세스 VS 스레드
정의
프로세스: 운영체제로부터 자원을 할당받은 작업의 단위.
스레드: 프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위.
메모리 영역 관련
프로세스: 각각 독립된 메모리 영역(Code/Data/Stack/Heap)을 할당 받고 서로의 변수나 자료에 접근 불가
스레드: 스레드는 stack 형식으로 할당 된 메모리는 따로 할당 받고 그 외 Code/Data/Heap 형식으로 할당된 메모리 영역을 공유한다.
오류 시 작업 종료
프로세스: 공유하는 파일을 손상시키는 경우가 아니라면 타 프로세스에게 아무런 영향을 안 줌
스레드: 메모리 영역을 공유하기에 스레드 하나에서 오류가나면 같은 프로세스 내 다른 스레드 모두가 강제 종료
멀티
프로세스: 멀티태스킹
스레드: 멀티스레드
멀티스레드의 장점
Context-Switching할 때 공유하고 있는 메모리만큼의 메모리 자원을 아낄 수 있다.
스레드는 프로세스 내의 Stack 영역을 제외한 모든 메모리를 공유하기 때문에 통신의 부담이 적어서 응답 시간이 빠르다.
멀티스레드의 단점
스레드 하나가 프로세스 내 자원을 망쳐버린다면 모든 프로세스가 종료될 수 있다.
자원을 공유하기 때문에 필연적으로 동기화 문제가 발생할 수밖에 없다.
참고: https://coding-start.tistory.com/199
'CS공부 > 운영체제' 카테고리의 다른 글
CPU 스케줄링 (0) | 2021.07.06 |
---|---|
인터럽트(+트랩) (0) | 2021.07.06 |
시스템 호출(System Call) (0) | 2021.07.05 |
PCB와 Context Switching, IPC (0) | 2021.07.05 |
프로세스 (0) | 2021.07.05 |