프로세스와 스레드의 이해
🔍 프로세스
Word, Chrome 등의 프로그램이 실행되기 위해서는 필요한 데이터(프로그램 리소스)가 메모리에 적재되어야 한다. 운영체제로부터 메모리 등의 자원을 할당 받아 프로그램의 데이터들이 메모리에 적재되면 실행중인 프로그램이라는 의미로 ‘프로세스’라고 부른다.
✏️ 프로세스의 주소 공간
프로세스의 주소 공간은 코드, 데이터, 스택 힙 영역으로 구성된다. 이렇게 나눔으로써 데이터를 공유할 수 있게 되고 메모리 사용량이 줄어든다.
- 코드 영역 : 사용자가 작성한 프로그램 함수 코드가 CPU에서 수행할 수 있는 기계어 명령 형태로 변환되어 저장되는 공간 (컴파일 타임에 결정되며, 읽을 수만 있다.)
- 데이터 영역 : 전역 변수 또는 static 변수 등 프로그램이 사용하는 데이터를 저장하는 공간
- 스택 영역 : 호출된 함수의 수행을 마치고 복귀할 주소 및 데이터(지역변수, 매개변수, 리턴값 등)을 임시로 저장하는 공간.
- 힙 영역 : 프로그래머가 필요할 때마다 사용하는 메모리 영역으로 런타임 시점에 결정된다.
✏️ 프로세스 간 통신
프로세스는 운영체제로부터 각각의 독립된 메모리 영역을 할당 받는다. 따라서 프로세스 간 데이터를 교환할려면 프로세스 간 통신(IPC: Interprocess Communication)기법이 필요하다. 프로세스 간 통신에는 공유 메모리와 메세지 전달의 두 가지 모델이 있다.
✅️ 공유 메모리 모델
- 협력 프로세스들에 의해, 공유되는 메모리의 영역이 생성된다.
- 프로세스들은 공유 메모리를 이용하여 데이터를 읽고 씀으로써 데이터를 교환한다.
- 여러 프로세스가 같은 자원에 동시에 접근하는
충돌
이 발생할 수 있다.
✅ 메세지 전달 모델
- 메세지를 통하여 프로세스들 간에 데이터를 주고 받는다.
- 충돌을 회피할 필요가 없기 때문에 적은 양의 데이터를 교환하는 데 유용하다.
- 분산 시스템에서 공유 메모리보다 구현하기 쉽다.
- 시스템 콜을 사용하여 구현되기 때문에 커널 간섭 등의 부가적인 시간 소비 작업이 필요하다. 따라서 공유 메모리 모델보다 속도가 느리다.
✏️ 컨테스트 스위치
Word
,youtube
,게임
을 동시에 실행하고 있더라도 컴퓨터는 실제로 이 모든 작업을 동시에 처리하지 않는다. 대신 컴퓨터는 매우 빠른 속도로 이 작업을 번갈아 가면서 처리하는데 이를 컨텍스트 스위치라고 한다. 각각의 작업을 조금씩 번갈아 처리함으로써 컴퓨터가 여러 작업을 빠르고 효율적으로 처리할 수 있도록 도와준다.
✅ PCB(Process Control Block)
컨텍스트 스위치가 발생할 때 각각의 프로세스들의 정보는 PCB를 이용하여 관리된다.
✅ 실생활 예시
학생이 책을 읽던 도중에, 갑자기 영어 과제를 해야 하는 경우, 어디까지 읽었는지 책갈피를 꽂아 둔 다음 영어 과제를 시작한다. 이후 영어 과제가 끝나면 책갈피가 있는 부분으로 돌아와 책을 읽는다. 이처럼 컴퓨터도 PCB를 사용하여 이전 작업에 대한 정보를 저장하고, 새로운 작업을 시작하는 과정을 반복한다.
🔍 스레드
✏️ 스레드의 등장 배경
전통적인 웹 서버는 단일 스레드 프로세스로 작동했다. 단일 스레드이기 때문에 사용자의 요청이 여러개 들어오면 프로세스는 그 요청을 수행할 별도의 프로세스를 생성했다. 하지만 프로세스를 생성하는 것은 많은 시간과 자원을 필요로 한다. 스레드는 프로세스의 Data, Code, Heap 영역을 공유하여 사용함으로써 사용자의 요청을 더욱 효율적으로 처리할 수 있게끔 도와준다.
✏️ 스레드란?
- 프로세스 안에서 프로세스가 할당 받은 자원을 이용하여 실제 일을 처리하는 최소 실행 단위를 말한다.
- 스택 영역은 쓰레드마다 할당되며 Code, Data, Heap 영역은 스레드간 공유해서 사용된다
- 데이터를 공유하기 때문에 컨텍스트 스위칭시 다루어야 할 데이터가 프로세스보다 상대적으로 적다
- 동시성 문제가 발생할 수 있고, 하나의 스레드에 문제가 생기면 프로세스가 종료될 수 있다.
✏️ 스레드의 종류
✅️ 사용자 수준 스레드
- 응용프로그램에서 생성되어 사용되는 스레드이다.
- 사용자 수준 스레드는 커널에 의해 관리되지 않는다.
- CPU, Memory와 같은 자원에 직접 접근하기 위해 커널 스레드와 맵핑되어 사용된다.
✅ 커널 수준 스레드
- 운영체제에 의해 직접 관리되는 스레드이다.
- 커널 수준 스레드는 CPU, Memory와 같은 자원에 직접 접근할 수 있다.
- 일반적으로 시스템 호출 요구 사항으로 인해 사용자 수준 스레드보다 더 많은 오버헤드가 발생한다.
✅ 스레드 모델
1. 다대일 모델
- 많은 사용자 수준 스레드가 하나의 커널 스레드와 맵핑된다.
- 한 스레드에 문제가 생기면, 전체 프로세스에 문제가 생긴다.
- 한 번에 하나의 스레드만이 커널에 접근할 수 있기 때문에, 다중 스레드가 다중 코어 시스템에서 병렬로 실행될 수 없다.
2. 일대일 모델
- 각 사용자 스레드를 각각 하나의 커널 스레드로 사상한다.
- 사용자 스레드를 만들 때마다 하나의 커널 스레드가 생성되기 대문에 많은 수의 커널 스레드가 시스템 성능에 부담을 줄 수 있다.
3. 다대다 모델
- 다수의 사용자 스레드가 다수의 커널 스레드와 맵핑된다.
- 구현하기 어렵다
- 다대일 모델과 일대일 모델의 장점을 모아둔 것 같지만 대부분의 시스템에서 처리 코어 수가 증가함에 따라 커널 스레드 수를 제한하는 것의 중요성이 줄어들었다. 결과적으로 대부분의 운영체제는 일대일 모델을 사용한다.
🔍 결론
- 프로세스는 코드, 데이터, 스택, 힙 영역으로 구성되어 있으며, 운영체제로부터 CPU와 메모리 같은 자원을 할당 받는다.
- 프로세스는 독립적인 공간을 갖기 때문에 IPC라는 특별한 통신 기술이 필요하다.
- 공유 메모리는 직접 데이터 액세스를 허용할 수 있지만 충돌이 발생할 수 있다.
- 메시지 전달 모델은 충돌은 피할 수 있지만 시스템 호출과 커널 개입으로 인해 속도가 느려질 수 있다.
- 컨텍스트 전환은 컴퓨터가 여러 프로세스를 효율적으로 처리할 수 있도록 도와준다.
- 프로세스 제어 블록(PCB)은 이러한 전환 중에 각 프로세스의 상태를 관리하는 데 중요한 역할을 한다.
- 스레드는 단일 스레드 웹 서버의 비효율성에 대한 해결책으로 등장했다.
- 스레드는 프로세스의 데이터, 코드, 힙 영역을 공유함으로써 여러 사용자 요청을 보다 효율적으로 처리할 수 있게 한다.
- 스레드는 사용자 수준과 커널 수준으로 분류된다.
- 스레드 모델(다대일, 일대일, 다대다)은 사용자 스레드를 커널 스레드에 매핑하는 다양한 접근 방식을 제공하며, 각 모델에는 장점과 한계가 있다.
🔗 관련 글
🔗 참고
- 자바의정석
- 운영체제 공룡책
- 인프런 - 자바 동시성 프로그래밍(정수원)