프로세스
프로세스는 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램을 말한다. 우리가 작업 관리자에 들어가 보았을 때 보이는 것들이 바로 프로세스라고 할 수 있다.
위의 사진에서 알 수 있는 것은 프로세스가 앱과 background 프로세스로 나누어져 있다는 것이다. 앱은 다른 말로 foreground 프로세스라고 할 수 있다.
하나의 프로세스에 할당되는 총 메모리 공간을 크게 커널 영역과 사용자 영역으로 나눌 수 있다. 커널 영역에서는 많은 프로세스가 CPU를 필요로 할 때 자원을 배분하는 PCB(Process Control Block, 프로세스 제어 블록)가 생성된다. 사용자 영역에는 프로그램이 동작하기 위한 각각 독립된 4가지의 메모리 영역을 가진다. (Code, Data, Stack, Heap)
- 커널 영역 - PCB가 생성되는 공간
- 스택 영역 - 지역변수, 매개변수, 리턴값, 데이터를 일시적으로 저장하는 공간
- 힙 영역 - 동적 할당 시 사용되며 프로그래머가 직접 할당하는 공간, 언젠가 반환해야 하는 공간
- 데이터 영역 - 전역변수, 정적변수, 배열 등, 초기화 된 데이터는 DATA 영역에 저장되고 초기화 되지 않은 데이터는 BSS 영역에 저장된다.
- 코드 영역 - 코드 자체를 구성하는 메모리 장소
※ Context Switching
- 기존 프로세스의 Context를 PCB에 백업하고, 새로운 프로세스를 실행하기 위해 Context를 PCB로 부터 복귀하여 새로운 프로세스를 실행하는 것. 보통 인터럽트가 발생하거나, 실행 중인 CPU 사용 허가 시간을 모두 소모하거나, 입출력을 위해 대기해야 하는 경우에 발생한다.
- 프로세스를 수행하는 도중 이벤트가 발생해서 대기 상태로 전환 시키게 되면, CPU가 하는일이 없어진다. 그래서 이때 CPU를 놀게 두지말고 다른 프로세스를 실행시키고 Context Switching 하는 것이 효율적이다. 이 과정은 overhead 이지만 감수해야하는 부분이다.
스레드
스레드는 어떠한 프로그램, 특히 프로세스 내에서 실행되는 흐름의 단위를 말한다. 일반적으로 프로세스는 하나의 스레드를 가짐으로 이런 프로세스들은 '단일 스레드 프로세스' 라고 볼 수 있다. 하지만 프로그램 환경에 따라 둘 이상의 스레드를 동시에 실행할 수 있고 이런 방식을 '멀티 스레드' 라고 한다. 이젠 프로세스의 내부로 가보겠다.
이 그림에서 알 수 있듯 프로세스는 자신만의 고유한 공간을 할당받아 사용하는데 반해, 스레드는 다른 스레드와 공간, 자원을 공유하면서 사용한다는 점이 매우 중요한 부분이다. (스레드는 스택 영역만 따로 할당 받음)
프로세스가 실행되는 프로그램이라면 스레드는 프로세스를 구성하는 실행의 흐름 단위이다.
멀티 프로세스와 멀티 스레드
멀티 프로세스는 여러 프로세스를 동시에 실행하는 것을 말하고, 멀티 스레드는 여러개의 스레드로 프로세스를 동시에 실행하는 것을 말한다.
만약 우리가 하나의 작업을 3번 반복해서 실행해야 한다고 생각해보자. 멀티 프로세스와 멀티 스레드를 이용해서 3번 반복 실행하는 결과는 동일할 것이다. 하지만 멀티 프로세스는 자원을 공유하지 않기 때문에 메모리에 동일한 내용이 중복될 수 있다. 멀티 스레드는 자원을 공유하고 있기 때문에 메모리를 효율적으로 사용할 수 있다. 다만 만약 공유하고 있는 자원에 문제가 발생한다면 멀티 스레드 전체가 작동이 안되는 문제를 야기할 수 있다.
Reference
'개발자의 기본 소양 > OPERATING SYSTEM' 카테고리의 다른 글
PCB (Process Control Block, 프로세스 제어 블록) (0) | 2023.06.28 |
---|---|
운영체제(5) - CPU Scheduling Algorithm (0) | 2023.05.30 |
운영체제(4) - DeadLock (교착 상태) (0) | 2023.05.30 |
운영체제(3) - 공유 자원과 임계 영역 (0) | 2023.05.29 |
운영체제(1) - 시작하기 (0) | 2022.12.28 |