프로세스란?
프로그램이 실행되면 프로세스 인스턴스가 생성된다.
인스턴스가 생성된다는 의미는 프로그램 실행에 필요한 내용이 컴퓨터 메모리(RAM)에 적재된다는 뜻이다.
일반적으로 프로세스와 프로그램을 같은 개념으로 이야기하는 경우도 많은데 이는 엄밀히 다른 개념이다.
프로그램 : 어떤 작업을 하기 위해 실행할 수 있는 파일 또는 프로그램이다. = 정적인 상태 Ex) 카카오톡, 그림판, 크롬
즉, 어떠한 일을 위해 실행할 수 있는 파일을 뜻한다.
프로세스 : 메모리에 적재되고 CPU 자원을 할당받아 프로그램이 실행되고 있는 상태이다. = 동적인 상태
즉, 일을 처리하는 일련의 과정을 뜻한다.
프로그램(Program) 이란
- 사전적 의미 : “어떤 작업을 위해 실행할 수 있는 파일”
- 메모리에 올라오지 않은 정적인 상태(코드 덩어리)
프로세스의 특징
- 프로세스는 각각 독립된 메모리 영역(Code, Data, Stack, Heap의 구조)을 할당받는다.
- 기본적으로 프로세스당 최소 1개의 스레드(메인 스레드)를 가지고 있다.
- 각 프로세스는 별도의 주소 공간에서 실행되며, 한 프로세스는 다른 프로세스의 변수나 자료구조에 접근할 수 없다.
- 한 프로세스가 다른 프로세스의 자원에 접근하려면 프로세스 간의 통신(IPC, inter-process communication)을 사용해야 한다.
- Ex. 파이프, 파일, 소켓 등을 이용한 통신 방법 이용
멀티 태스킹
멀티태스킹이란 OS를 통해 CPU가 필요한 자원(시간)을 프로세스 또는 스레드간에 나누는 행위를 말한다.
이를 통해 여러 응용 프로그램을 동시에 열고 작업 할 수 있다는 장점이 있다.
음악을 들으면서, 메세지를 확인할 수 있는 이유는 모두 멀티태스킹 덕분이다.
프로세스는 4가지의 영역의 구조로 이루어져 있다.
- 코드 영역(code area) : 프로그래머가 작성한 프로그램이 코드 영역에 작성된다.
- 데이터 영역(data area) : 코드가 실행되면서 사용한 변수나 파일들의 각종 데이터들이 모여있다.
- 스택 영역(stack area) : 호출한 함수가 종료되면 되돌아올 메모리의 주소를 스택에 저장하거나 변수 사용 범위에 영향을 미치는 영역을 구현 할때 사용된다.
- 힙 영역(heap area) : 동적으로 할당되는 데이터들을 위해 존재하는 공간이다.
코드 영역과 데이터 영역은 선언할때 그 크기가 결정되는 정적 영역이지만,
스택 영역과 힙 영역은 프로세스가 실행되는 동안 크기가 바뀌는 동적 영역이다.
원칙적으로 서로 다른 프로세스간의 메모리 공간 접근은 허용되지 않는다.
만약 프로세스간 서로 다른 자원에 접근하려면 프로세스간의 통신을 해야한다.
스레드 란?
과거에는 프로그램을 실행시킬 때 실행시작부터 실행 끝까지 하나의 프로세스만으로 운영을 하였다. 하지만 시간이 흐를수록 더욱 복잡해지는 프로그램으로 인해 하나의 프로세스만으론 운영이 벅차게 되었다. 그래서 한 프로그램을 처리하기 위해 여러 개의 프로세스를 만들게 되었다. 하지만 프로세스마다 자신에게 할당된 메모리 내의 정보에만 접근할 수 있도록 제약을 두고 있고, 이를 벗어나는 정보에 접근하려면 오류가 발생한다. 이에 탄생한 개념이 스레드이다.
스레드는 어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위를 말한다.
일반적으로 하나의 애플리케이션(프로그램)은 하나 이상의 프로세스를 가지고 있고, 하나의 프로세스는 반드시 하나 이상의 스레드를 갖는다.
즉 프로세스를 생성하면 기본적으로 하나의 메인 스레드가 생성되는 셈이다.
스레드는 프로세스 내에서 각각 Stack만 따로 할당받고, Code, Data, Heap 영역은 공유한다.
스레드는 한 프로세스 내에서 동작되는 여러 실행의 흐름으로, 같은 프로세스 안에 있는 여러 스레드들은 같은 힙 공간을 공유한다.
한 스레드가 프로세 자원을 변경하면, 다른 이웃 스레드(sibiling thread)도 그 변경 결과를 즉시 볼 수 있다.
스레드의 특징
- 스레드는 프로세스 내에서 각각 Stack만 따로 할당받고 Code, Data, Heap 영역은 공유한다.
- 스레드는 한 프로세스 내에서 동작되는 여러 실행의 흐름으로, 프로세스 내의 주소 공간이나 자원들(힙 공간 등)을 같은 프로세스 내에 스레드끼리 공유하면서 실행된다.
- 같은 프로세스 안에 있는 여러 스레드들은 같은 힙 공간을 공유한다. 반면에 프로세스는 다른 프로세스의 메모리에 직접 접근할 수 없다.
- 각각의 스레드는 별도의 레지스터와 스택을 갖고 있지만, 힙 메모리는 서로 읽고 쓸 수 있다.
- 한 스레드가 프로세스 자원을 변경하면, 다른 이웃 스레드(sibling thread)도 그 변경 결과를 즉시 볼 수 있다.
멀티스레드 란
멀티 스레드는 하나의 어플리케이션을 여러 개의 스레드로 구성하여 하나의 스레드가 하나의 작업을 처리하도록 하는 것이다.
일반적으로 멀티스레드를 사용하는 이유는 사용자와 상호작용하는 어플리케이션에서 단일 스레드로 Network 또는 DB 와 같은 긴 작업을 수행하는 경우 해당 작업을 처리하는 동안 사용자와 상호작용이 불능인 상태가 될 수 있기 때문이다.
멀티 스레드는 다음과 같은 특징이 있다.
- 응답성이 좋다. 프로그램의 일부분(자식 스레드)이 오류 또는 긴 작업으로 인해 중단되어도 프로그램이 계속 적으로 수행된다.
- 자원 공유가 쉽다. 스레드들은 부모 프로세스의 자원과 메모리를 공유 할 수 있다.
- 프로세스를 할당하는 것보다 스레드를 할당하는 것이 비용이 적다.
- 멀티프로세서 구조에서 각각의 스레드가 다른 프로세서에서 병렬로 수행될 수 있다.
- 구현 및 테스트, 디버깅이 어렵다
- 너무 많은 스레드 사용은 오버헤드를 발생시킨다.
- 동기화 그리고 교착상태가 발생하지 않도록 주의해야 한다.
- 자식 스레드 중 하나에 문제가 생긴경우 전체 프로세스에 영향을 줄 수 있다.
프로세스와 스레드의 차이
프로세스와 스레드는 개념의 범위부터 다르다. 스레드는 프로세스 안에 포함되어 있기 때문이다.
운영체제가 프로세스에게 Code/Data/Stack/Heap 메모리 영역을 할당해 주고 최소 단위 작업 단위로 삼는 반면, 스레드는 프로세스 내에서 Stack 메모리 영역을 제외한 다른 메모리 영역을 같은 프로세스 내 다른 스레드와 공유한다.
프로세스는 다른 프로세스와 정보를 공유하려면 IPC를 사용하는 등의 번거로운 과정을 거쳐야 하지만, 스레드는 기본구조 자체가 메모리를 공유하는 구조이기 때문에 다른 스레드와 정보 공유가 쉽다. 때문에 멀티태스킹보다 멀티스레드가 자원을 아낄 수 있게 된다. 다만 스레드의 스케줄링은 운영체제가 처리하지 않기 때문에 프로그래머가 직접 동기화 문제에 대응할 수 있어야 한다.
'Computer Science > OperatingSystem' 카테고리의 다른 글
[OS] CPU 스케줄링이란? (0) | 2023.04.17 |
---|---|
[OS] 참조의 지역성과 참조 집합 (0) | 2023.03.05 |
[OS] 가상 메모리(Virtual Memory System) 란? (0) | 2023.02.23 |
[OS] 운영체제 란? (0) | 2023.01.11 |
[OS] DeadLock(교착상태) 란 (0) | 2023.01.07 |