TIL 54 | Process & Thread

임종성·2021년 10월 24일
1

TIL

목록 보기
22/22
post-thumbnail

Program

프로그램이란 파일이 저장 장치에 저장되어 있지만 메모리에는 올라가 있지 않은 정적인 상태를 말합니다.

프로그램이 실행되기 위해서는 운영체제가 실행되기 위한 메모리 공간을 할당해주어야 합니다. 메모리에 올라가 있지 않다는 뜻은 아직 운영체제가 프로그램에게 독립적인 메모리 공간을 할당해주지 않았다는 의미이고, 정적인 상태라는 것은 말 그대로 메모리 공간이 할당되지 않아 실행되지 않고 가만히 있는 상태를 뜻합니다.

한마디로 프로그램이라는 단어는 아직 실행되지 않은 파일 그 자체, 코드 덩어리를 가리키는 말입니다.

이러한 실행 파일에게 의미를 부여하기 위해, 프로그램을 실행시켜 봅시다. 프로그램을 실행하는 순간 운영체제는 메모리 공간에 올라가게 되어 동적인 상태가 됩니다. 이렇게 실행되고 있는 프로그램을 바로 프로세스라고 합니다.

Process

프로세스란 사전적인 의미로 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램을 뜻합니다.

프로세스는 메모리에 올라와 실행되고 있는 프로그램의 인스턴스(독립적인 개체)이고, 다시말해 운영체제로부터 시스템 자원을 할당받는 작업의 단위입니다.

여기서 시스템 자원이란 CPU 시간, 운영되기 위해 필요한 주소공간, 그리고 Code, Data, Stack, Heap으로 구성되어 있는 독립된 메모리 영역을 뜻합니다.

Process의 특징

기본적으로 프로세스당 최소 1개의 Thread를 가지고 있습니다. 그리고 프로세스는 위의 그림처럼 Code, Data, Stack, Heap의 구조르 가지는 독립된 영역을 가지고 있습니다. 따라서 한 프로세스는 다른 프로세스의 변수나 자료구조에 접근할 수 없고, 다른 프로세스의 자원에 접근하기 위해 프로세스 간 통신(Inter Process Communication)을 사용해야 합니다. IPC는 파이프, 파일, 소켓 등을 이용한 통신 방법입니다.

Process -> Thread

과거에는 프로그램을 실행할 경우 실행의 시작부터 끝까지 하나의 프로세스를 사용했습니다. 하지만 프로그램이 점점 복잡해지면서 하나의 프로세스만으로 프로그램을 실행하기는 힘들게 되었습니다. 더군다나 운영체제가 안정성을 위해 프로세스마다 자신에게 할당된 메모리 영역에만 접근할 수 있기에 한 프로그램을 위해 여러 프로세스를 사용한다면 많은 불편함이 존재했습니다.

따라서 프로세스와 다른 작은 실행 단위의 개념이 필요하였고, 이것이 바로 스레드입니다.

Thread

스레드란 사전적인 의미로 프로세스 내에서 실행되는 여러 흐름의 단위입니다.


스레드는 위에서 언급한 프로세스 특성의 한계를 해결하기 위해 만들어진 개념입니다. 따라서 스레드는 프로세스와는 다르게 스레드 간 메모리를 공유하며 작동합니다.

정확히 말하면 프로세스의 독립된 메모리 영역 구조인 Code, Data, Heap, Stack 중 Stack을 제외한 부분을 공유하고 Stack만 각각 따로 할당받습니다. 따라서 한 스레드가 Heap 메모리 등 프로세스 자원을 변경하면 다른 이웃 스레드(sibling thread)도 변경 결과를 즉시 볼 수 있습니다.

Multi Process vs Multi Thread

앞에서 우리는 스레드는 메모리를 서로 공유하는 흐름의 단위라고 하였습니다. 그렇다면 왜 우리는 이렇게 메모리를 공유하는 방식을 사용하는 걸까요? 단순히 여러 프로세스를 사용하는 것과 어떤 차이가 있을까요?

Multi Thread의 장점

Multi Thread는 하나의 프로세스가 여러 작업을 여러 스레드를 이용하여 동시에 처리하는 것을 의미합니다. 여러 프로세스를 사용한다면 프로세스 간의 Context-Switching시 단순히 CPU 레지스터 교체 뿐만 아니라 RAM과 CPU 사이의 캐시 메모리에 대한 데이터까지 초기화되므로 오버헤드가 큽니다.

그러나 스레드는 프로세스 내의 Stack 영역을 제외한 모든 메모리를 공유하기 때문에 스레드 간 데이터를 주고 받는 것이 간단하고 시스템 내 자원 소모가 줄어듭니다. 따라서 통신의 비용이 적어지므로 프로세스 간 통신(IPC)보다 작업 간 통신 부담이 줄어들고, Context-Switching시 스레드는 Stack영역만 처리하기에 전환 속도가 빠릅니다.

Multi Thread의 단점

스레드 간 메모리를 공유하는 것은 위와 같이 자원의 효율성이나 처리 비용 및 응답 시간에서 장점이 있지만, 반대로 메모리를 공유하기 때문에 스레드 하나에서 오류가 난다면 다른 스레드가 모두 종료되는 단점도 존재합니다.

또한 스레드 간의 자원 공유는 전역 변수(데이터 세그먼트)를 이용하므로 함께 상용할 때 충돌이 발생할 수 있습니다. 멀티스레드를 사용할 경우 스레드의 실행순서를 스케줄링하지 않는다면 자원에 접근하지 못하거나 적절치 못한 자원에 접근하는 오류가 발생할 수 있고, 이를 동기화 문제 라고 합니다.

TIL

운영체제가 프로세스에게 Code/Data/Stack/Heap 메모리 영역을 할당해 주고 최소 작업 단위로 삼는 반면, 스레드는 프로세스 내에서 Stack 메모리 영역을 제외한 다른 메모리 영역을 같은 프로세스 내 다른 스레드와 공유합니다.

프로세스는 다른 프로세스와 정보를 공유하려면 IPC를 사용하는 등의 번거로운 과정을 거쳐야 하지만, 스레드는 기본 구조 자체가 메모리를 공유하는 구조이기 때문에 다른 스레드와 정보 공유가 쉽습니다. 때문에 멀티태스킹보다 멀티스레드가 자원을 아낄 수 있게 됩니다. 다만 스레드의 스케줄링은 운영체제가 처리하지 않기 때문에 프로그래머가 직접 동기화 문제에 대응할 수 있어야 합니다.


참고자료
wearesoft
프로세스와 스레드의 차이
[OS] 프로세스와 스레드

profile
어디를 가든 마음을 다해 가자

0개의 댓글