프로세스(Process)
프로그램이 메모리에 적재되어 실행 중일 때 프로세스라 부른다. 예를 들어 크롬을 실행하면 크롬 프로세스가 실행되고, 노트패드를 실행하면 노트패드 프로세스가 별개로 동작한다.
운영체제는 프로그램을 실행하면서 디스크에 저장된 데이터를 메모리로 로드한다. 프로세스는 운영체제로부터 독립된 메모리 영역(코드, 데이터, 스택, 힙)을 할당받는다.
프로그램: 특정 작업을 수행하기 위한 명령어의 집합
예시)
크롬에서 탭마다 독립된 프로세스를 실행시켜 한 탭이 오류나도 다른 탭은 유지될 수 있도록 한다.
특징
- 운영체제는 프로그램을 메모리에 적재하고 이를 프로세스로 다룬다. 프로세스마다 고유한 번호(프로세스 ID)를 할당한다.
- 운영체제는 프로세스에 실행에 필요한 메모리를 할당하고 이곳에 코드와 데이터 등을 적재한다.
- 프로세스들은 서로 독립적인 메모리 공간을 가지므로 다른 프로세스와 메모리를 공유하지 않는다.
- 실행-대기-잠자기-실행-대기-잠자기-종료 등의 생명 주기를 가진다.
하나의 프로그램을 여러 번 실행하면 프로그램이 실행될 때마다 독립된 프로세스가 생성된다. 크롬을 3번 실행시키면 크롬 프로세스가 3개 생성된다. 이들은 서로 다른 프로세스 번호를 부여받고 완전히 별개의 프로세스로 다뤄진다.
메모리 영역 구조
- 스택: 지역 변수, 함수의 매개변수, 반환 주소 값 등이 저장되는 영역. 높은 주소 값에서 낮은 주소 값으로 메모리 할당
- 힙: 사용자에 의해 동적 메모리 할당이 일어나는 영역. 낮은 주소 값에서 높은 주소 값으로 메모리 할당
- 데이터: 전역 변수, 정적 변수, 배열, 구조체 등이 저장되는 영역
- 코드: 실행할 코드가 기계어로 컴파일되어 저장되는 영역
스택 영역과 힘 영역은 동적으로 메모리 할당이 가능해 두 영역 사이에 빈 메모리 공간이 존재한다. 메모리 영역을 공유하기 때문에 서로의 영역을 침범하는 문제가 발생할 수 있다.
스택 오버플로: 스택 영역이 힙 영역을 침범하는 경우
힙 오버플로: 힙 영역이 스택 영역을 침범하는 경우
생성
새로운 프로세스는 기존 프로세스에서 fork() 함수를 호출해 생성한다. fork() 함수에는 함수를 호출한 프로세스를 복사하는 기능이 있는데, 기존 프로세스를 부모 프로세스, 복사된 프로세스를 자식 프로세스라 한다. 부모 프로세스에서 fork()를 호출하면 부모 프로세스는 자식 프로세스의 PID 값을, 자식 프로세스는 0을 반환한다.
PCB(프로세스 제어 블록)
PCB는 프로세스를 제어하기 위해 프로세스에 대한 정보를 저장하는 구조체이다. 프로세스의 현재 상태, 프로세스 ID(PID), 부모 프로세스의 PID, 자식 프로세스의 PID, PC(Program Counter, 다음 실행할 명령어의 주소), 프로세스의 우선순위 등을 저장한다.
스레드(Thread)
스레드는 프로세스에서 실제로 실행되는 흐름의 단위이다. 프로세스를 생성할 때 커널은 프로세스 내에 1개의 스레드를 생성한다. 이를 메인 스레드라 한다. 프로세스는 여러 개의 스레드를 가진다.
사례)
미디어 플레이어 응용프로그램은 미디어 입력 스레드, 디코딩 스레드, 비디오 스레드, 오디오 스레드 등으로 구성된다. 각 스레드는 독립적으로 작업을 수행하고 다른 스레드에게 데이터를 전달하면서 유기적으로 실행된다.
공유 공간
프로세스는 스레드들이 공유할 수 있는 공간을 제공하여 스레드들은 프로세스의 주소 공간을 나누어 사용한다. 프로세스 내에 작성된 함수들을 호출할 수 있고 프로세스 내에 선언된 전역 변수를 액세스할 수 있으며 프로세스의 힙을 공유한다. 즉, 스레드가 동적 할당받는 곳이 바로 프로세스의 힙이며 한 스레드가 동적 할당받은 메모리를 다른 스레드가 액세스할 수 있다.
프로세스는 독립적인 메모리 영역을 갖지만, 스레드는 스택 영역만 독립적이고 그 외 영역은 다른 스레드와 공유한다.
사용자 레벨 스레드 vs 커널 레벨 스레드
스레드를 관리하는 주체에 따라 둘로 구분된다.
- 사용자 레벨 스레드: 사용자가 라이브러리를 이용해 생성 및 관리
- 커널 레벨 스레드: 커널이 스레드를 생성 및 관리
멀티 스레드 환경에서 사용자 레벨 스레드와 커널 레벨 스레드는 3가지 관계를 맺을 수 있다.
- 다대일 모델: 사용자 레벨 스레드 n개에 커널 레벨 스레드 1개가 매핑되어 사용자 레벨에서 스레드를 관리
- 일대일 모델: 사용자 레벨 스레드 1개에 커널 레벨 스레드 1개가 매핑. 사용자 레벨 스레드 수 만큼 커널 레벨 스레드가 생성되므로 성능이 저하될 수 있음
- 다대다 모델: 사용자 레벨 스레드 n개에 커널 레벨 스레드 m개가 매핑