본문 바로가기
CONCEPT/OS

[OS] 멀티 프로세스, 멀티 스레드

by 1005 2025. 3. 14.

 
하나의 프로세스를 동시에 쓰레드 개수만큼 병행해서 실행할 수 있다.

단일 스레드 프로세스: 실행 흐름이 하나인 프로세스
멀티스레드 프로세스: 실행 흐름이 여러개인 프로세스 -> 프로세스를 이루는 여러 명령어 동시 실행 가능

스레드 구성 요소
: 스레드 ID, 프로그램 카운터를 비롯한 레지스터 값, 스택 등 (실행에 필요한 최소한의 정보를 유지하며 실행됨.)

3개의 스레드로 병행 실행되는 프로세스에 대한 예시

 
프로세스를 이루는 모든 스레드들은 프로세스의 자원을 "공유"하면서 실행된다. 
스레드 1,2,3은 모두 똑같은 코드, 데이터, 힙 영역을 공유함. 스택 영역은 각각 독립적으로 공간을 가짐.
 
* 리눅스 토발즈는 프로세스와 스레드를 굳이 구분할 필요가 없다고 설명함. 프로세스와 스레드는  "실행의 문맥"일 뿐이며 그냥 하나라고 보면 된다고 답변함. 
* 리눅스 운영체제에서는 프로세스와 스레드를 구분해서 쓰지않고 task 라는 용어를 사용함.
* 요즘 운영체제에서는 CPU한테 처리해야 될 작업을 전달할 때 프로세스 단위가 아닌 스레드 단위로 전달함.
  즉, 프로세스를 통째로 전달하기보다는 스레드 단위로서 CPU를 할당받아서 사용하고 할당을 해제하는 식.


Q) 동일한 작업을 수행하는 단일 스레드 프로세스 여러 개 실행 (멀티 프로세스) vs 하나의 프로세스를 여러 스레드로 실행 (멀티 스레드)

둘 다 "hello, os"라는 문자열이 3번 출력됨.

 
프로세스끼리는 기본적으로 자원을 공유하지 않지만 스레드끼리는 같은 프로세스 내의 자원을 공유한다는 차이점이 있다.
 
- 멀티 프로세스 
프로세스를 fork하면 코드/데이터/힙 영역 등 모든 자원이 복제되어 저장됨. 
저장된 메모리 주소를 제외하면 모든 것이 동일한 프로세스 두 개가 통째로 메모리에 적재.
fork를 세 번 네 번하면 메모리에는 같은 프로세스가 통째로 세 개 네 개 적재.
즉, 프로세스 끼리는 "남남"이다.

 
참고) fork 직후 같은 프로세스를 통째로 메모리에 중복 저장하지않으면서 동시에 프로세스끼리 자원을 공유하지 않는 방법도 있다. 이를 쓰기 시 복사(copy on write) 기법이라 한다.  
 
- 멀티 스레드
스레드들은 각기 다른 스레드 ID, (별도의 실행을 위해 꼭 필요한) 프로그램 카운터 값을 포함한 레지스터 값, 스택을 가질 뿐 프로세스가 가지는 자원(= 코드, 데이터, 힙 영역 + 파일)을 공유함.


스레드가 자원을 공유한다고 하는 점은 "협력과 통신"에서 비교적 멀티 프로세스에 비해 유리할 수 있지만 반드시 장점만 있는 것은 아니다. 공유하는 자원에 문제가 생기는 경우가 있을 수 있기 때문이다.
 
스레드만 통신을 하는 건 아니다. 프로세스도 할 수 있다.
 
보통 통신이라고 하면 네트워크를 통해서 데이터를 주고 받는 통신 방법을 떠올리기 쉽지만 같은 컴퓨터 내에 프로세스나 스레드끼리 데이터를 주고 받는 것도 통신이라고 부를 수 있다.
 
프로세스간 통신(IPC:inter process communication의 약자)
: 파일을 통한 프로세스 통신, 공유 메모리 영역을 통한 프로세스 통신 등

댓글