🎯 프로그램(Program) 과 프로세스(Process) 그리고 쓰레드(Thread)
✅ 용어 개념 정리
프로그램이란 단어는 운영체제를 공부하지 않아도 모두가 아는 단어입니다. 프로그램이라 하면 컴퓨터에서 실행할 수 있는 정적인 상태의 파일 입니다.
여기서 정적인 상태란 프로그램이 시작되지 않은 상태를 뜻합니다.
그러면 프로그램이 시작된 상태는 무엇일까?
프로세스(Process)가 바로 프로그램이 동적으로 실행된 상태 입니다. 모든 프로그램은 운영체제가 실행되기 위한 메모리 공간을 할당해 줘야 실행할 수 있습니다. 그래서 프로그램을 실행하는 순간 파일은 컴퓨터 메모리에 올라가게 되고, 운영체제로부터 시스템 자원(CPU)을 할당받아 프로그램 코드를 실행시켜 우리가 서비스를 이용할 수 있게 되는 것입니다.
즉, 프로그램과 프로세스의 차이는 실행 여부 로 구분할 수 있습니다.
그렇다면 쓰레드(Thread) 는 무엇일까?
쓰레드란, 하나의 프로세스 내에서 동시에 진행되는 작업 단위 입니다.
쉽게 비유하자면, 크롬 브라우저가 실행되면 하나의 프로세스가 실행되는겁니다. 우리는 크롬을 사용할때 한 페이지만 사용할 수 있는게 아닙니다. 여러개의 페이지를 열어 동시에 다양한 작업을 수행할 수 있습니다.
즉, 하나의 프로세스 내부에서 여러가지 작업들이 동시에 진행되기에 가능한 것인데, 이러한 일련의 작업 흐름들을 스레드라고 합니다. 이때 스레드가 여러개면 멀티 스레드라고 합니다.
🎯 프로세스 구조
프로그램이 실행되어 프로세스가 생성되면 총 4 개의 메모리 영역을 할당 받게 됩니다.
(1) 스택 영역 : 호출한 함수가 종료되면 되돌아올 임시적인 자료를 저장하는 독립적인 공간입니다. Stack 은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸됩니다. (만약 Stack 영역을 초과하면 stack overflow 에러가 발생)
(2) 힙 영역 : 생성자, 인스턴스와 같이 동적으로 할당되는 데이터들이 모여있습니다. 즉, 사용자에 의해 메모리 공간이 동적으로 할당되고 해제됩니다.
(3) 데이터 영역 : 코드가 실행되면서 사용하는 변수, 데이터 들이 모여있습니다.
(4) 코드(텍스트) 영역 : 프로그램을 만들때 사용된 프로그래밍 코드가 CPU로 해석이 가능한 기계어 형태로 저장되어 있습니다.
# 여기서 중요한 점은 stack 영역과 heap 영역은 사용자가 어떻게 동작하는지에 따라 영역이 동적으로 변경됩니다.
🎯 쓰레드의 자원 공유 (멀티 쓰레드)
스레드는 프로세스가 할당 받은 자원을 이용하는 실행 단위입니다. 스레드가 여러개 있으면 우리는 동시에 여러 작업을 할 수 있습니다. ex) 파일을 다운받으며 웹 서핑이 가능. 스레드끼리 프로세스의 자원을 공유하면서 프로세스 실행 흐름의 일부가 되기 때문에 동시 작업이 가능한겁니다.
아래 사진을 보면 하나의 프로세스 안에 여러개의 스레드가 들어있는 상태입니다.
각각의 쓰레드는 프로세스의 Stack 영역만 할당받아 복사하고, Code, Data, Heap 은 프로세스 내부에서 다른 스레드와 공유됩니다. 정리해보면, 각각의 스레드는 별도의 stack 을 할당받지만 heap 메모리는 고유하기 때문에 서로 다른 스레드에서 가져와 읽고 쓸 수 있습니다.
이렇게 프로세스 내부에서 여러개의 쓰레드가 자원을 공유하는 이유는, 자원의 생성과 관리의 중복성을 최소화해 프로그램 성능을 올리기 위함입니다.
🎯 프로세스 자원 공유 (멀티 프로세싱)
쓰레드도 자원을 공유하는데 프로세스도 공유할 수 있을까?
기본적으로 각 프로세스는 별도의 메모리 공간에서 실행되기 때문에, 한 프로세스는 다른 프로세스의 자원에 접근할 수 없습니다. 하지만 방법이 없는 것은 아닙니다.
다음과 같은 방법을 이용해 프로세스는 서로 자원을 공유합니다.
(1) IPC (Inter - Process Communication) 사용
(2) LPC (Local inter - Process Communication) 사용
(3) 별도로 공유 메모리를 만들어서 정보를 주고받는 방법 사용
그러나 프로세스 자원 공유는 단순히 CPU 레지스터 교체뿐만이 아니라 RAN 과 CPU 사이의 캐시 메모리까지 초기화되기 때문에 자원 부담이 크다는 단점이 있어 다중 작업이 필요한 경우 다중 스레드를 이용하는 것이 훨씬 효율적입니다.
🎯 Context Switching - 프로그램 동시 실행의 원리
✅ 병렬성
병렬성은 물리적으로 동시에 수행될 수 있는 성질입니다.
직관적으로 해석해보면, 명령어를 메모리에서 뽑아 해석하고 실행하는 반도체 유닛인 여러개의 코어에 맞춰 여러개의 프로세스 , 스레드를 돌려 병렬로 작업을 동시에 수행하는 것을 말합니다.
병렬성은 주로 하드웨어 레벨에서 이루어지며, 물리적으로 병렬 처리를 지원하는 시스템에서 사용됩니다.
✅ 동시성
동시성이란 논리적으로 동시에 수행될 수 있는 성질입니다. 논리적으로 동시에 수행될 수 있다는 말은 "여러 작업이 동시에 진행되는 것처럼 보임" 을 뜻 합니다. 이는 실제로 프로세서가 동시에 실행되는게 아니라 번갈아 실행되는 것을 의미합니다.
예를 들어 우리 컴퓨터에서 여러 프로그램을 동시에 실행시키는 상황을 생각해봅시다. 웹 브라우저에서 동시에 여러 탭을 열어 여러 웹 페이지들 동시에 로드하거나 텍스트 편집기에서 동시에 여러 파일을 편집하는 경우에 동시에 처리하는 것 처럼보이지만 이는 사실 매우 빠른 속도로 왔다갔다 하며 조금씩 프로그램을 실행합니다.
이렇게 하는 이유는 여러 작업을 동시에 처리하는 것처럼 보이게 만들어 사용자에게 더 빠른 반응성을 제공하기 위해서입니다. 이러한 과정을 컨텍스 스위칭(Context Switching) 이라고 합니다
✅ 그렇다면 왜? 동시성이 필요할까?
동시성은 동시에 돌아가는 것 처럼 보이는거지, 실제로 동시에 동작하는게 아닙니다. 그렇다면 왜 이런 방법을 채택했을까? 이유는 다음과 같습니다.
(1) 하드웨어적 한계 : CPU 는 많은 양을 동시에 처리하면 발열이 발생하는 문제가 있기에 코어의 성능을 올리는 대신 코어를 여러개 탑재해 CPU 를 만들고 있습니다. 하지만 수십, 수백개의 코어를 넣어 만들면 컴퓨터가 너무 커져 사실상 상용화되는 컴퓨터로선 적합하지 않습니다. 결국 이러한 하드웨어적 한계 때문에 수십, 수백개의 프로세스를 돌리기 위해선 동시성이 필요합니다.
(2) 논리적인 효율성 : 만약 10개의 작업중 1개는 오래 걸리는 작업이고, 나머지 9개는 빠르게 처리될 수 있는 작업입니다. 하지만 동시성을 사용하지 않았을때, 최악의 경우 1개의 오래 걸리는 작업부터 시작되면 나머지 9개의 작업 빠르게 끝날 수 있는 작업임에도 1개의 작업때문에 비효율적으로 실행될 수 있습니다.
이러한 비효율적인 측면을 개선하고자 작업을 아주 잘게 나눠 번갈아 가면서 처리하는 동시성 개념을 채택한 것입니다.
참고 블로그
👩💻 완전히 정복하는 프로세스 vs 스레드 개념
한눈에 이해하는 프로세스 & 스레드 개념 전공 지식 없이 컴퓨터의 프로그램을 이용하는데는 문제 없어 왔지만 소프트웨어를 개발하는 사람으로서 컴퓨터 실행 내부 요소를 따져보게 될때, 아
inpa.tistory.com
'운영체제' 카테고리의 다른 글
[운영체제] 교착 상태(Dead Lock ) 정리 (0) | 2024.07.01 |
---|---|
[운영체제] 프로세스 동기화 정리 (0) | 2024.06.29 |
[운영체제] CPU 스케줄링 정리 (1) | 2024.06.27 |
[운영체제] 스레드 정리 (0) | 2024.06.27 |
[운영체제] 프로세스 정리 (0) | 2024.06.27 |