운영체제 공부를 하면 꼭 물어보는 내용인 프로세스와 쓰레드에 대해서 정리해보겠다.
프로세스는 프로그램의 실행 단위라고 할 수 있다. 즉, 우리가 크롬 브라우저를 실행하고, 카카오톡을 실행하고, VS CODE를 실행하고 하는 작업들은 각각 프로세스가 실행되는 것이라고 생각할 수 있다.
이러한 프로그램들은 운영체제의 통제 하에 실행이 된다.
즉, 운영체제가 프로세스를 관리한다고 생각해 볼 수 있다.
운영체제는 프로세스의 생성, 스케줄링, 종료를 담당하게 된다.
이러한 과정에서 OS로부터 시스템 자원을 할당 받는다.
시스템 자원에는 다음과 같은 것들이 있다.
위에서 프로세스가 운영체제로부터 시스템 자원을 할당받는 다고 하였다. 여기서 생각해볼 수 있는 프로세스의 특징이 있다.
독립된 메모리 영역을 가지게 된다.별도의 주소공간을 가지게 된다.즉, 프로세스간에는 서로의 메모리 주소공간에 접근할 수 없다. 그래서 기본적으로는 다른 프로세스의 변수에 접근할 수 없다.
프로세스간의 통신은 IPC, 파일 등을 이용해 할 수 있다.
우리는 컴퓨터를 사용할 때 여러 프로그램을 동시에 사용한다.
하지만 프로세스는 스케줄링 규칙에 따라 자기 차례가 되면 CPU를 할당 받아 작업을 진행해야한다. 그렇다면 CPU가 하나일 때는 동시에 작업이 안되는 걸까?
이 분야에서는 동시라는 말이 엄밀한 의미의 동시가 아니다. 동시성이란 마치 동시에 작업하는 것 처럼 느끼도록 하는 것이다.
이러한 동시성을 제공하기 위해서 CPU는 여러 프로세스를 이것 조금하고, 저것 조금하고 이렇게 돌아가면서 실행하면서 진행한다.
이 과정이 매우 빠르게 돌아가기 때문에 우리는 프로그램이 마치 동시에 실행되는 것처럼 느낄 수 있는 것이다.
두개 이상의 프로세서(CPU)가 하나 이상의 작업을 동시에 처리하는 것을 멀티 프로세스라고 한다.
여기서 '동시에'란, 동시성에서 동시가 아닌 엄밀한 의미의 '동시', 즉 한 번에 두 가지 이상의 일을 하는 것을 의미한다.
각 프로세서는 프로세스에 할당되어 작업을 처리한다.
프로세는 각각 독립된 메모리 영역, 주소공간을 가진다.
IE는 멀티 쓰레드 방식, Chrome은 멀티 프로세스 방식이다. IE는 한 탭에서 튕기면 모든 탭이 죽어버린다. 이는 뒤에서 설명할 쓰레드의 특징 때문이다. 하지만 Chrome은 각 탭이 각 프로세스로 실행되기 때문에 탭 하나가 죽어도 다른 탭에는 영향을 주지 않는다.
프로세스는 CPU를 할당받아 작업을 진행한다.
Context Switching 오버헤드가 발생한다.CPU가 현재 실행중인 프로세스의 정보(PCB)를 저장하고 다른 프로세스의 정보를 불러오는 과정
한 프로세스 내에서 여러 갈래의 작업이 진행될 수 있다. 이렇게 한 프로세스 내의 여러 실행 흐름을 쓰레드라고 한다.
여러 실행 흐름이라는 말은 한 프로세스 내에 여러 쓰레드가 있을 수 있다는 말이다.
멀티 쓰레드이다.
한 프로세스 내의 여러 쓰레드라고 하면 이 쓰레드는 프로세스에 할당 된 자원을 공유할 수 있다는 것을 알 수 있다.
하지만 모든 자원을 공유하는 것은 아니다.
쓰레드는 메모리 영역 중 코드, 데이터, 힙 영역을 공유한다. 즉, 각 쓰레드는 각자 다른 스택 영역(지역 변수, 함수 등)을 가지게 된다.
메모리 영역의 일부를 공유하기 때문에 CPU가 모든 정보를 저장하고 다른 정보를 불러와 교체를 할 필요가 없다.
즉, 컨텍스트 스위칭 오버헤드가 적다. 또한 메모리 영역의 자원을 공유할 수 있기 때문에 서로 긴밀하게 연결되어 메모리 사용을 효율적으로 할 수 있다.
하지만 단점도 있는 법. 자원을 공유한다는 것은 서로 영향을 끼칠 수 있다는 말이다.
즉, 한 놈에게 문제가 생기면 다른 애들한테도 영향을 줄 수 있다는 것!
또한 공유하는 자원에 여러 쓰레드가 접근하게되면 데이터의 일관성이 보장되지 않아 원하는대로 바뀌거나 사용되지 않을 수 있다. 이러한 상태를 Race Condition이 발생했다고 한다.
위의 IE와 Chrome의 차이
동기화 작업이 필요하다.
| 프로세스 | 쓰레드 |
|---|---|
| 프로그램의 실행 단위 | 프로세스 내의 여러 실행 흐름 |
| 독립된 메모리 영역, 주소공간 | Code, Data, Heap 공유, 독립된 Stack 영역 |
| 컨텍스트 스위칭 비용 큼 | 메모리 효율적, 컨텍스트 스위칭 비용 적음 |
| 서로 영향을 주지 않아 안정적 | 서로 영향을 줄 수 있다. Race Condition 발생 가능 |