프로세스 (Process)
프로그램과 프로세스
프로그램은 윈도우의 *.exe 파일이나 Mac의 *.dmg 파일과 같은 컴퓨터에서 실행할 수 있는 파일을 통칭한다. 아직 파일을 실행하지 않은 상태이기 때문에 정적 프로그램 즉, 프로그램이라고 부른다. 이와 대조적으로 프로세스는 다음에 실행할 명령어를 지정하는 프로그램 카운터와 관련 자원의 집합을 가진 능동적인 존재이다.
프로그램 | 프로세스 |
어떤 작업을 하기 위해 실행할 수 있는 파일 | 실행되어 작업중인 컴퓨터 프로그램 |
파일이 저장 장치에 있지만 메모리에는 올라가 있지 않은 정적인 상태 | 메모리에 적재되고 CPU 자원을 할당받아 프로그램이 실행되고 있는 상태 |
코드 덩어리 | 코드 덩어리를 실행한 것 |
프로세스 주소 공간
프로그램을 실행 시켜 정적인 프로그램이 동적으로 변하여 프로그램이 돌아가고 있는 상태를 말한다. 즉, 컴퓨터에서 작업 중인 프로그램을 의미하는 것이다. 프로세스는 운영체제로부터 자원을 할당받은 작업의 단위로 정의할 수 있다. 아래는 프로세스 메모리 배치이다.
텍스트 및 데이터 섹션의 크기는 고정되기 때문에 프로그램 실행 시간 동안 크기가 변하지 않는다. 하지만 스택 및 힙 섹션은 프로그램 실행 중에 동적으로 줄어들거나 커질 수 있다. 스택 및 힙 섹션이 서로의 방향으로 더 커지더라도 운영체제는 서로 겹치지 않도록 해야 한다.
프로세스의 자원 공유
단순히 CPU 레지스터 교체 뿐만 아니라 RAM과 CPU 사이의 캐시 메모리까지 초기화되므로 자원 부담이 크다는 단점이 존재한다. 다중 작업이 필요한 경우 스레드를 이용하는 것이 효율적이다.
프로세스간 정보를 공유하는 방법
- IPC (Inter-Process Communication)
- LPC (Local Inter-Process Communication)
- Shared Memory - 별도의 공유 메모리를 만들어서 정보를 주고 받도록 설정
프로세스 상태 전이
프로세스는 실행되면서 그 상태가 변한다. 프로세스의 상태는 부분적으로 그 프로세스의 현재의 활동에 따라서 정의된다. 프로세스는 다음 상태 중 하나에 있게 된다. 운영체제는 프로세스의 상태를 감시하고, 상태를 기반으로 프로세스 스케쥴링을 통해 프로세스를 관리하고 제어한다. ready 상태에 있는 여러 프로세스 중에서 어떤 프로세스를 running 상태로 바꿀지 등 스케쥴링 알고리즘에 의해 동작한다.
- new : 프로세스가 생성 중
- running : 명령어 실행 중
- waiting : 프로세스가 어떤 이벤트가 일어나기를 기다리는 중
- ready : 프로세스가 처리기에 할당되기를 기다림
- terminated : 프로세스의 실행 종료
- Admitted (new -> ready) : 프로세스 생성을 승인 받음
- Scheduler Dispatch (ready -> running) : 준비 상태에 있는 여러 프로세스들 중 하나가 스케줄러에 의해 실행됨
- Interrupt (running -> ready) : Timeout, 예기치 않은 이벤트가 발생하여 현재 실행 중인 프로세스를 준비 상태로 전환하고, 해당 작업을 먼저 처리
- I/O or event wait (running -> waiting) : 실행 중인 프로세스가 입출력이나 이벤트를 처리해야 하는 경우, 입출력이나 이벤트가 끝날 때 까지 대기 상태로 전환
- I/O or event completion (waiting -> ready) : 입출력이나 이벤트가 모두 끝난 프로세스를 다시 준비 상태로 만들어 스케줄러에 의해 선택될 수 있는 상태로 전환
이들 이름은 임의적이고, 운영체제마다 변한다. 그렇지만, 이들이 나타내는 상태들은 모든 시스템에서 찾아볼 수 있다.
프로세스의 한계
과거에는 프로그램을 실행할 때 프로세스 하나만을 사용해서 이용했었다. 하지만 기술이 발전됨에 따라 프로세스 작업 하나만을 사용해서 프로그램을 실행하기에는 한계가 있었다. 하나의 프로세스만 이용하여 프로그램을 실행하기에는 메모리의 낭비가 발생한다. 스레드는 프로세스와 다르게 스레드 간 메모리를 공유하며 동작한다.
스레드 (Thread)
스레드의 개념
스레드란 CPU 이용의 기본 단위이며, 하나의 프로세스 내에서 동시에 진행되는 작업 갈래, 흐름의 단위를 말한다. 스레드는 스레드 ID, 프로그램 카운터, 레지스터 집합, 그리고 스택으로 구성된다. 스레드는 같은 프로세스에 속한 다른 스레드와 코드, 데이터 섹션, 그리고 열린 파일이나 신호와 같은 자원들을 공유한다.
전통적인 프로세스는 하나의 제어 스레드를 가지고 있다. 만일 프로세스가 다수의 제어 스레드를 가진다면, 프로세스는 동시에 하나 이상의 작업을 수행할 수 있다. 지금 시대에서 거의 모든 스프트웨어 응용들은 다중 스레드를 이용한다. 노래를 들으며, 인터넷 검색을 하고 다른 화면에서는 유튜브를 시청하는 것이 가능한 이유이다. 하나의 프로세스 안에서 여러가지 작업들의 흐름이 동시에 진행되기 때문에 가능한 것인데, 이러한 일련의 작업들을 스레드라고 하며 여러 개가 있다면 멀티 스레드라고 부른다.
스레드의 자원 공유
스레드는 프로세스가 할당받은 자원을 이동하는 실행의 단위이다. 스레드가 여러 개 존재하면 우리는 멀티 태스킹이 가능하다. 스레드끼리 프로세스의 자원을 공유하면서 프로세스 실행 흐름의 일부가 되기 때문에 동시 작업이 가능한 것이다.
이때 프로세스의 4가지 메모리 영역 중 스레드는 Stack만 할당받아 복사하고 나머지는 프로세스 내 다른 스레드들과 공유된다. 각 스레드가 독립적인 Stack을 가지고 있다는 말은 독립적인 함수 호출이 가능하다는 의미이다. 그리고 독립적인 함수 호출이 가능하다는 것은 독립적인 실행 흐름이 추가된다는 뜻이다. 즉, Stack을 가짐으로서 스레드는 독립적으로 실행된다. 하나의 프로세스에서 여러 스레드를 가짐으로서 각각의 스레드는 독립적으로 실행이 됨으로서 우리는 하나의 PC 환경에서 여러 작업을 동시에 진행할 수 있게 되는 것이다.
CPU의 작업 처리 방식
병렬성 (parallelism)
- 직관적으로 명령어를 메모리에서 뽑아 해석하고 실행하는 반도체 유닛인 여러 개의 코어에 맞춰 여러 개의 프로세스, 스레드를 돌려 병렬로 작업들을 동시에 수행하는 것을 말한다.
동시성 (Concurrency)
- 둘 이상의 작업이 실행되는 것이다. 병렬성이 물리적으로 동시에 실행되는 것이라면, 동시성은 동시에 실행하는 것 처럼 보이게 하는 것이다.
그렇다면, 여기서 의문이 든다. 동시에 작업하는 것은 여러 가지 작업을 동시에 수행함으로서 오는 이점이 있을 것이다. 하지만, 동시에 실행되는 것 처럼 보이게 하는 것은 어떤 의미이며, 어떤 이유로 사용하는 것인가? 즉, 동시성의 필요한 이유는 무엇인가?
동시성이 필요한 이유
동시성은 단일 스레드에서 엮여 있던 "무엇을 할 것인가"와 "언제 끝날 것인가"간의 의존성을 해소시켜 준다. 이는 처리량과 구조 개선에 도움을 줄 수 있다.
- 하드웨어적 한계
- 논리적인 효율
구체적인 내용은 동시성이 필요한 이유 라는 글을 참고하자.
참고
공룡책