스레드 알아보기
* 혼자공부하는 컴퓨터구조 운영체제를 공부하며 정리한 내용입니다.
실무에서 스레드를 고려하며 코딩하는 경우가 아주 많다.
Thread는 프로세스를 구성하는 실행 흐름의 단위이다.
하나의 프로세스는 하나 이상의 스레드를 가질 수 있다.
(한 프로세스를 여러 개의 스레드로 동시에 실행할 수 있다.)
실행 흐름이 여러개인 프로세스를 멀티 스레드 프로세스라고 한다.
-> 프로세스를 이루는 여러 명령어 동시 실행 가능
스레드는 무엇으로 구성되어 있길래 나누어서 실행할 수 있을까
스레드의 구성요소
- 하나의 스레드마다 각기 다른 스레드 ID
- 프로그램 카운터를 비롯한 레지스터 값
- 스택
중요요소
- 프로세스를 이루는 스레드들은 실행에 필요한 최소한의 정보를 갖고있는데
- 하지만 프로세스를 이루는 스레드들은 프로세스의 자원을 공유하며 실행이 된다.
- 위 사진에서도 1,2,3이 병행 실행되고 있다고는 하지만 똑같은 메모리의 코드영역을 공유하고 있다.
=> 스레드마다 각기다른 최소한의 정보를 갖고있지만 프로세스의 자원은 공유하고 있다.
전통적인 관점에서는 CPU에 처리해야될 작업을 전달할 때 프로세스 단위로 전달한다고 기술하고 있지만 요즘은 실제로 들여다보면 프로세스단위가 아닌 각각의 쓰레드인 경우가 많다.
리눅스에서는 프로세스와 스레드를 명시적으로 구분하지 않는 운영체제도 있다. (리눅스 개발자의 메일)
멀티 프로세스와 멀티 스레드
(두개가 실제 코드레벨에서 어떻게 다른지 설명할 수 있어야 한다.)
동일한 작업을 수행하는 단일 스레드 프로세스 여러개 실행 vs 하나의 프로세스를 여러 스레드로 실행
어떤 차이가 있을까?
둘다 hello, os는 세번 찍힌다.
그러나 차이는 있다.
프로세스끼리는 기본적으로 자원을 공유하지 않지만, 쓰레드끼리는 같은 프로세스내 자원을 공유한다.
프로세스를 fork하면 코드 / 데이터 / 힙 영역 등 모든 자원이 복제되어 저장된다.
저장된 메모리 주소를 제외하면 모든 것이 동일한 프로세스 3개가 통째로 메모리에 적재된다.
참고) fork 직후 같은 프로세스를 통째로 메모리에 중복 저장하지 않으면서 동시에 프로세스끼리 자원을 공유하지 않는 방법도 있다.
이를 쓰기 시 복사(copy on write)기법이라고 한다. (프로세스와 스레드 중간방법?정도의 느낌)
스레드들은 각기 다른 스레드 ID, 프로그램카운터 값을 포함한 레지스터값, 스택을 가지며 프로세스가 가진 자원을 공유한다.
정리
- 프로세스끼리는 자원을 공유하지 않고 독립적으로 실행
- 스레드는 프로세스의 자원을 공유한다. 협력과 통신에 유리하다 -> 그러나 이게 문제가 될 수 있음
프로세스끼리는 자원을 공유하지 않음.
- 프로세스 간에도 자원을 주고받을수 있다 : 프로세스간통신 (IPC)
- 파일을 통한 프로세스간 통신, 공유 메모리를 통한 프로세스간 통신, 이외에도 소켓 파이프라인 등 검색하면 더 나온다.
->> 프로세스끼리는 기본적으로 공유하지 않지만 불가능한것은 아니다. 쓰레드만큼 유리하지 않을 뿐이다.
스레드는 프로세스의 자원을 공유한다.