운영체제에 대해서 배우려고 하면 가장 초반에 접하는 것이 프로세스와 스레드 일 것입니다. 이 프로세스와 스레드는 한번에 묶어서 배우는 경우가 많은데, 이번 글에서 프로세스와 스레드에 대한 개념을 다뤄보도록 하겠습니다.
프로세스 란?
우리는 평소에 "프로그램(program)" 이라는 용어를 많이 씁니다. "프로그램 깔았다", "프로그램 실행했다" 등.. 우리는 컴퓨터 상에서 동작하는 어떠한 어플리케이션을 주로 "프로그램" 이라고 지칭합니다. 그러면 프로그램은 정확히 무얼 나타내는 것이며 프로세스는 또 별도의 개념일까요?
우선 프로세스에 대해서 알아보기 위해 프로그램과의 차이점에 대해서 간단히 얘기해보겠습니다.
프로그램 vs 프로세스
프로그램의 사전적인 의미 부터 찾아보겠습니다.
컴퓨터 프로그램은 컴퓨터에서 실행될 때 특정 작업(specific task)을 수행하는 일련의 명령어들의 모음(집합)이다. (참고)
위와 같이 정의가 되어 있는데 무슨 뜻일까요? 중요한 부분은 "일련의 명령어들의 모음" 이라는 부분인데요, 즉 프로그램은 어떠한 특정 작업을 수행하기 위해서 컴퓨터가 실행해야 할 명령들을 하나의 파일 형태로 저장되어 있다고 보시면 됩니다. window 로 보게 된다면 exe 확장자가 붙은 파일이 그 예가 될 수 있어요.
그러면 프로세스에 대한 사전적인 의미를 찾아보겠습니다.
프로세스(process)는 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램을 말한다. (참고)
앞서 나왔던 프로그램의 개념이 등장하면서 프로세스를 정의하고 있는데, 다시 말해서 명령어들의 모음을 "프로그램" 이 저장하고 있으면 이를 실제로 컴퓨터 상에서 실행되고 있는 상태를 "프로세스" 라고 해요.
예를 들어보겠습니다.
서점에 가면 수많은 책들이 있습니다. 이 책들은 서점에 가면 항상 존재하고, 갑자기 증발하지 않고, 책 내용이 바뀌거나 하지 않습니다.
우리는 언제든지 서점에 가서 책을 꺼내 읽을 수 있고 중간쯤 보다 내려놓고 다른 책을 읽을 수도 있습니다.
여기서 서점에 있는 수많은 책들은 모두 프로그램들 입니다. 사람이 직접 읽기 전까지는 아무 역할도 하지 못한채 서점에 저장만 되어 있는 상태에요, 하지만 사람이 그 책을 펴서 읽어가면, 그땐 프로그램이 실행되는 상태가 되고 이러한 상태의 프로그램을 프로세스 라고 볼 수 있습니다.
위처럼 프로세스는 컴퓨터가 프로그램을 실행하고 있는 상태이므로, Memory 위에 올라가 있는 상태입니다.
스레드 란?
그러면 스레드는 무엇일까요? 프로그램은 명령어들의 모음이고, 프로세스는 이 명령어들을 실행하고 있는 상태라는 것을 알았는데 스레드는 또 뭘까요. 이번에도 사전적인 의미 부터 알아보겠습니다.
스레드(thread)는 어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위를 말한다. 일반적으로 한 프로그램은 하나의 스레드를 가지고 있지만, 프로그램 환경에 따라 둘 이상의 스레드를 동시에 실행할 수 있다. (참고)
스레드의 개념을 보니 다시 프로세스와, 프로그램의 개념이 등장합니다. 위 정의에서 중요한 부분은 "프로세스 내에서 실행되는 흐름" 이라고 표현이 된것이 중요합니다. 다시 말해, 스레드는 프로세스 내에서 동작하는 흐름입니다.
예를 들어서, 우리가 위 그림 처럼 프로세스를 여러개 띄었다면 각각의 프로세스들은 독립적으로 각자가 실행해야될 것들을 실행합니다. 서로의 Memory 영역에 침범하지 않고 실행이 되는데요, 스레드는 하나의 프로세스 안에 공통으로 접근할 수 있는 자원을 가진 흐름 들 이라고 볼 수 있습니다.
예를 들어서, 하나의 process 에 두개의 thread 가 실행되고 있다면, 대략적으로 아래 그림과 같다고 볼 수 있습니다. 각각의 프로세스들과 달리 하나의 process 안에 자원을 공유하며 실행되고 있습니다.
그러면, 프로세스를 쓸때는 언제이고 스레드를 쓸때는 언제일까요?
위 그림을 통해서 프로세스와 스레드를 비교해보면 프로세스는 각 프로세스간 자원을 공유하지 않고, 스레드는 하나의 프로세스 안에서 자원을 공유하고 있는 특징이 있습니다. 이 두 특징으로만 본다면 자원공유가 많이 일어나고 유기적으로 동작해야 한다면 즉 하나의 어플리케이션 안에서 나뉘어지는 실행이라면 스레드가 적합할 것이고, 공유할 자원이 거의 없고, 어플리케이션 또한 목적이 서로 다르다면 서로 다른 프로세스로 분리하는 것이 적합해 보입니다.
스레드의 문제
스레드의 큰 특징은 자원을 공유한다는데 있습니다. 이러한 특징이 존재하면서 자연스럽게 동기화 문제가 발생하게 되는데요, 하나의 스레드에서 동일한 변수를 수정하였을때 생길 수 있는 여러 문제 들이 있습니다. 이번 글에서 모두 다루기 보다 하나의 주제로 빼는것이 좋을 듯 하여, 동기화 문제는 다음 게시글 에서 다뤄보도록 하겠습니다.
이번 글에서 프로세스와 스레드 그리고 번외로 프로그램에 대해서 간단하게 살펴보았습니다. 각각을 구성하고 있는것들은 훨씬 복잡하고 다양한 특징들이 있지만 우선은 이정도 개념으로 정리하도록 하겠습니다.
'컴퓨터구조' 카테고리의 다른 글
systemd 를 통해 service 를 stop 시킬 때, 주의해야할 점 (0) | 2023.04.01 |
---|---|
CPU, RAM, Disk 등 무엇이며, 어떻게 연결되어 있을까? - (2) (3) | 2022.03.31 |
CPU, RAM, Disk 등 무엇이며, 어떻게 연결되어 있을까? - (1) (1) | 2022.03.20 |
댓글