운영체제(Operation System)란 컴퓨터 시스템의 자원들을 효율적으로 관리하며, 사용자가 컴퓨터를 편리하고 효과적으로 사용할 수 있도록 환경을 제공하는 여러 프로그램의 모임이다.
프로세스(process)란 일반적으로 CPU에 의해 처리되는 사용자 프로그램, 시스템 프로그램 즉 실행중인 프로그램을 의미하며, 작업(Job), 태스크(Task)라고도 한다.
프로그램은 일반적으로 하드 디스크 등에 저장되어 있는 실행 코드를 뜻하고, 프로세스는 프로그램을 구동하여 프로그램 자체와 프로그램의 상태가 메모리 상에서 실행되는 작업 단위를 지칭한다.
프로세스와 프로그램의 차이는 프로그램 자체는 생명이 없다. 프로그램은 보조 기억장치에 존재하며 실행되기를 기다리는 명령어와 정적인 데이터의 묶음이다. 이 프로그램의 명령어와 정적 데이터가 자원을 할당받고 메모리에 적재되면 프로세스가 된다.
프로세스는 각각 독립된 영역(Code, Data, Stack, Heap)을 할당 받는다.
Code(Text) 영역
Code 영역은 실행 명령을 포함하는 코드들이 들어가는 부분이다.
프로그램을 시작할 때 컴파일한 프로그램(기계어)이 저장되어 있고, 읽기 전용 영역이기때문에 프로세스가 함부로 변경할 수 없고 변경 시 오류를 발생시킨다.
Data 영역
프로그램이 실행될 때 생성되고 프로그램이 종료되면 시스템에 반환된다.
전역변수, 정적변수, 배열, 구조체 등이 저장된다.
Data 영역은 다시 Data(GVAR) 영역과 BSS 영역으로 나눌 수 있다.
초기화된 데이터는 Data(GVAR) 영역에 저장되고 초기화되지 않은 데이터는 BSS 영역에 저장된다.
Heap 영역
Stack 영역
스레드(Thread)란 어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위이다.
멀티 프로세스(Multi Process)란 하나의 응용 프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 하나의 작업을 처리하도록 하는 것이다.
장점
단점
Context Switching 과정에서 캐시 메모리 초기화 등 무거운 작업이 진행되고 많은 시간이 소모되는 등 오버헤드가 발생한다.
프로세스는 각각 독립된 메모리 영역을 가지고 있기 때문에 프로세스 사이에서 공유하는 메모리는 없다. 따라서 Context Switching 이 발생하면 캐시에 있는 모든 데이터를 모두 리셋하고 다시 캐시 정보를 불러와야 한다.
독립된 영역 때문에 프로세스간의 통신이 필요하다.
멀티 스레드는 하나의 프로그램을 여러 개의 스레드로 구성하는 방식이다.
장점
멀티 스레드는 Stack을 제외한 자원들을 공유하고 있기 때문에 Context Switching 시에 캐시 메모리를 비울 필요가 없고 이를 통해서 리소스를 아낄 수 있다.
Stack 이외의 메모리를 공유하고 있기 때문에 통신의 부담도 적다.
단점
내부의 메모리를 공유하고 있어서 한 프로세스의 스레드가 문제가 생기면 해당 프로세스 안의 다른 스레드에도 문제가 생긴다.
같은 데이터를 공유하기에 데이터 동기화에 신경을 써야한다.
멀티 프로세스 vs 멀티 스레드
멀티 스레드는 멀티 프로세스보다 적은 메모리 공간을 차지하고 Context Switching 이 빠르다는 장점이 있지만, 오류로 인해서 하나의 스레드에 문제가 생기면 다른 스레드에도 문제가 생길 수 있다는 점과 동기화 문제를 가지고 있다. 반면에 멀티 프로세스는 하나의 프로세스가 문제가 생기더라도 다른 프로세스에는 영향을 끼치지 않는다는 장점이 있지만, 멀티 스레드보다 많은 메모리 공간과 CPU 시간을 차지한다는 단점이 있다.
이 두가지는 동시에 여러 작업을 수행한다는 점을 동일하지만 적용해야 하는 시스템에 따라 멀티 프로세스와 멀티 스레드를 잘 선택해야 한다.