프로세스와 스레드
프로세스(Proccess)
프로그램이 메모리에 적재되어 실행 중일 때 프로세스라고 부른다. 여기서 실행 중이란 CPU에 의해 현재 실행되고 있거나, 준비 상태로 기다리거나, 입출력 등으로 인해 중단되어 CPU로 부터 실행을 대기하고 있는 상태를 모두 말한다. 운영체제는 응용프로그램을 메모리에 적재하고 이때부터 프로세스라고 부르며, 실행을 관리한다.
프로스세는 코드, 데이터, 힙, 스택 영역으로 구성되며 이들은 모두 사용자 공간에 형성된다. 프로세스의 주소 공간은 가상 공간이다. 프로세스를 구성하는 영역들은 물리 메모리의 0번지에서 시작하지 않는다. 즉, 중간에 매핑 테이블을 두어 프로세스의 주소 공간과 물리 메모리의 물리 주소 공간을 관리한다. 현재 가장 많이 사용하는 주소 매핑 방법은 페이징(paging)이며, 매핑 테이블을 페이지 테이블(page table)이라고 한다.
운영체제는 PCB(Proccess Control Block)을 두어 전체 프로세스를 관리한다. 이는 프로세스 관리의 핵심 데이터로 프로세스 실행, 스케쥴링, 프로세스와 관련된 메모리 관리, 파일 입출력 등 많은 상황에서 커널에 의해 액세스되고 갱신된다.
운영체제는 동시에 여러 프로세스를 메모리에 올려놓고 번갈아 실행하기 때문에, 프로세스는 실행 중일 때도 있고 대기 상태에 있을 때도 있다.
- new: 프로세스를 생성하는 fork와 같은 시스템 호출이 실행되어 새로운 프로세스 생성된다.
- ready: 프로세스가 스케쥴링을 기다리는 ‘준비’ 상태이다. 스케쥴링 정책이 잘못되면 준비 큐에 오래 머무르는 기아 프로세스가 생기기도 한다.
- running: 프로세스가 CPU에 의해 현재 ‘실행’되고 있는 상태이다. 실행이 완료되면 커널은 프로세스를 Terminated/Zombie 상태로 만든다.
- waiting: 프로세스가 자원을 요청하거나, 입출력을 요청하고 완료를 기다리는 ‘블록’상태이다.
- terminated/zombie: 프로세스가 종료되어 프로세스가 차지하고 있던 메모리와 할당받았던 자원들을 모두 반환하고 열어 놓은 파일을 모두 닫는다. 완전히 프로세스가 소멸되지는 않았고 부모 프로세스가 종료코드를 읽어가면 완전히 사라진다.
- terminated/out: 부모 프로세스가 종료코드를 읽어가 커널이 PCB에서 해당 커널을 완전히 제거하고 테이블의 항목도 제거한다.
부모 프로세스가 먼저 종료된 경우 자식 프로세스들을 고아 프로세스라고 부른다. 이들은 init 프로세스에게 입양된다.
오늘 날 운영체제들은 프로세스 스케줄링 없이 시스템의 전체 스레드를 대상으로 스레드를 선택하는 스레드의 스케줄링을 실행한다.
스레드(Thread)
스레드는 실행 단위이며 스케쥴링 단위이다. 프로세스를 실행 된위로 하는 멀티태스킹에서 프로세스 생성과 컨텍스트 스위칭의 오버헤드가 크고, 프로세스간 통신에 어려움이 있어 비효율 적인 문제를 스레드가 해결해준다.
스레드의 주소 공간은 스레드가 사용할 수 있는 메모리 공간으로, 프로세스의 주소 공간 내에 형성되며 프로세스에 속한 모든 스레드들이 프로세스의 주소 공간을 나누어 사용한다. 다만, 스택 영역만 스레드마다 생성된다.
스레드도 프로세스와 마찬가지로 생성에서 소멸에 이르기까지 여러 상태를 거치면서 일생을 보낸다. 스레드의 상태는 일반적으로 ready, running, blocked, terminated로 나뉘며 스레드의 상태는 TCB에 저장된다.
다수의 스레드가 동시에 실행되는 상황은 concurrency와 parallelism으로 구분된다. concurrency는 1개의 CPU로 시간을 나누어 2개 이상의 스레드를 실행하는 것이고, parallelism은 2개 이상의 스레드가 각각 서로 다른 CPU에 동시에 실행되는 것이다.
스레드는 스케줄링 주체에 따라 커널에 의해 스케줄되는 커널 레벨 스레드와 스레드 라이브러리에 의해 스케줄되는 사용자 레벨 스레드 2종류로 나뉜다. 커널 레벨 스레드는 컨텍스트 스위칭에 오버헤드가 비교적 크지만 멀티코어에 대한 활용성이 높다. 반대로 사용자 레벨 스레드는 멀티코어를 제대로 활용하지 못하지만 컨텍스트 스위칭과 이식성 부분이 뛰어나다.
3줄 요약
- 프로세스는 프로그램이 메모리에 적재되어 실행되는 것을 의미하고, 스레드는 프로세스 내에 존재하는 실행 단위이다.
- 스레드는 프로세스에 속한 자원을 공유하며, 프로세스는 다른 프로세스와 메모리를 공유하지 않는다.
- 프로세스는 스레드들의 컨테이너이며 스레드들에게 공유 공간을 제공한다.
댓글남기기