프로그램 > 프로세스 > 스레드
먼저 프로세스와 스레드에 대해 알려면 프로그램에 대해 이해하고 넘어가야 한다!
프로그램이란 파일이 저장 장치에 저장되어 있지만, 메모리에는 올라가 있지 않은 정적인 상태를 말한다
- 모든 프로그램은 운영체제로부터 실행되기 위한 메모리 공간을 할당받아야 실행될 수 있다
- 그러나 프로그램은 아직 운영체제가 독립적인 메모리 공간을 할당해주지 않아서 실행되지 않고 가만히, 정적인 상태로 있는 것이다
즉, 프로그램은 아직 실행되지 않은 파일 그 자체를 의미한다
그리고 프로그램을 실행하는 순간 해당 파일은 컴퓨터 메모리에 올라가게 되고, 이 상태를 동적인 상태라고 한다
또한 이 상태의 프로그램을 프로세스라고 한다
프로세스(Process) 란?
- 프로세스는 간단하게 말하면 프로그램을 실행한 것이다
- 프로세스는 사용 중인 파일, 데이터, 프로세서의 상태, 메모리 영역 주소 공간, 스레드 정보, 전역 데이터가 저장된 메모리 부분 등 수 많은 자원을 포함하는 개념이다
- 종종 스케줄링의 대상이 되는 작업이라고 불리기도 한다
Q. 만약 프로그램이 복잡해지고 프로세스 하나만으로 실행시키기 벅차게 되었다면 어떻게 해야 할까?
"그럼 그 프로그램을 위한 프로세스를 여러 개 만들면 되지 않나요?"
네, 안됩니다.
왜냐하면 운영체제는 안정성을 취해서 프로세스마다 자신에게 할당된 메모리 내의 정보에만 접근할 수 있도록 제약을 두는데, 이를 벗어나는 정보에 접근하려면 오류가 나기 때문이다
따라서 프로세스와는 다르게 더 작은 실행 단위 개념이 필요하게 되었고, 이를 통해 탄생한 것이 스레드이다
스레드(Thread) 란?
- 스레드는 위에서 언급했듯이 프로세스의 한계를 극복하기 위해 만들어진 개념이다
- 하나의 프로그램 내에서 여러 개의 실행 흐름을 두기 위한 모델
- 프로세스는 하나 이상의 스레드를 가질 수 있다
- 프로세스와 달리 스레드 간 메모리를 공유하며 동작한다
- 스레드끼리 프로세스의 자원을 공유하면서 프로세스 실행 흐름의 일부가 되는 것이다
- 즉, 하나의 프로세서에서 병렬적으로 여러 개의 작업을 처리하기 위해서는 각 작업을 스레드화하여 멀티 스레딩이 가능하게 해야 한다
💡 한줄 요약
- 프로그램 : 코드 덩어리 파일
- 프로세스 : 프로그램을 실행한 것, 운영체제 입장에서 최소 작업 단위
- 스레드 : 프로세스의 코드에 정의된 절차에 따라 실행된 특정한 수행 경로, CPU 입장에서 최소 작업 단위
프로세스와 스레드의 작동 방식
프로세스는 메모리에 올라갈 때 운영체제로부터 시스템 자원을 할당받는다
이 때 운영체제는 프로세스마다 각각 독립된 메모리 영역을 Code/Data/Stack/Heap 의 형식으로 할당한다
각각 독립된 메모리 영역을 할당해주기 때문에 프로세스는 다른 프로세스의 변수나 자료에 접근할 수 없다
프로세스와 달리, 스레드는 메모리를 서로 공유할 수 있다
프로세스가 할당받은 메모리 영역 내에서 Stack 형식으로 할당된 메모리 영역은 따로 할당받고, 나머지 Code/Data/Heap 형식으로 할당된 메모리 영역을 공유한다
따라서 각각의 스레드는 별도의 Stack 메모리를 가지고 있지만, Heap 메모리는 서로 읽고 쓸 수 있게 된다
또한 한 프로세스는 하나 이상의 스레드를 갖는다!
프로세스 vs 스레드
- 프로세스는 완벽히 독립적이기 때문에 메모리 영역(Code/Data/Heap/Stack)을 다른 프로세스와 공유하지 않는 반면, 쓰레드는 해당 쓰레드를 위한 독립적인 스택만 생성할 뿐 그 이외의 메모리 영역(Code/Data/Heap)을 공유한다
Q. 만약 한 프로세스를 실행하다가 강제로 종료하면 다른 프로세스에게 영향을 끼칠까?
- 공유하고 있는 파일을 손상시키는 경우만 아니라면, 아무런 영향을 주지 않는다!
- 프로세스끼리는 자원을 공유할 수 없으니까!
Q. 그러나 한 스레드가 실행 도중 강제로 종료된다면?
- 스레드는 Code/Data/Heap 메모리 영역의 내용을 공유한다
- 따라서 어떤 스레드 하나에서 오류가 발생하면, 같은 프로세스 내의 다른 스레드 모두가 강제로 종료된다
Q. 쓰레드에서 Stack을 독립적으로 할당하는 이유는?
- 스택은 함수 호출 시 전달되는 인자, 되돌아갈 주소값 및 함수 내에서 선언하는 변수 등을 저장하기 위해서 사용되는 메모리 공간이다
- 따라서 스택 메모리 공간이 독립적이라는 것은 독립적인 함수 호출이 가능하다는 것이다
- 이는 독립적인 실행 흐름이 추가되는 것이다
- 따라서 실행 흐름의 추가를 위한 최소 조건이 독립된 스택 영역을 제공하는 것이다
Q. 쓰레드 간 Code 영역의 공유
- 프로세스는 독립적인 구조이기 때문에 다른 프로세스의 Code 영역에 있는 함수를 호출할 수 없다
- 그러나 쓰레드는 Code 영역을 공유하기 때문에 2개 이상의 쓰레드가 자신이 포함된 프로세스의 Code 영역에 있는 함수를 호출할 수 있다
Q. 쓰레드 간 Data 영역과 Heap 영역의 공유
- 전역 변수와 동적 할당된 메모리 공간을 공유할 수 있고, 이를 통해 쓰레드 간 통신을 할 수 있다
- 그러나 동시에 메모리에 접근하기 때문에 주의해야 한다
메모리 영역
1. Code 영역
- PC(피씨 카운터) - 다음 번에 실행될 명령어의 주소를 가지고 있는 레지스터
- 프로그램의 코드를 저장한다
2. Data 영역
- global 변수, static 변수를 저장한다
3. Heap 영역
- 메모리 관리, 동적 메모리 할당
- 시스템 콜로 관리한다
4. Stack 영역
- 임시 데이터 저장 - local 변수, return 어드레스
멀티 프로세스
- CPU를 여러 개 사용하여 여러 개의 스레드를 동시에 처리한다
- 2개 이상의 프로세서나 코어를 활용하는 시스템
멀티 프로세스의 장점
- 여러 개의 자식 프로세스 중 하나에 문제가 발생하면 그 자식 프로세스만 죽고 다른 다른 프로세스에는 영향이 가지 않는다
- 메모리 침범 문제를 OS 차원에서 해결한다
멀티 프로세스의 단점
- 2개의 프로세스는 완전히 독립된 2개의 프로그램 실행을 위해서 사용되기 때문에 Context-Switching 에서의 오버헤드가 발생한다
- context switching 과정에서 캐시 메모리 초기화 등 무거운 작업이 진행되고 많은 시간이 소모되는 등의 오버헤드가 발생한다
- 멀티 스레드의 경우에는 Code/Data/Heap 메모리 영역을 공유하지만 프로세스들은 각각의 독립된 메모리 영역을 할당받는다
- 따라서 context switching이 발생하면 캐시에 있는 모든 데이터를 리셋하고 다시 캐시 정보를 불러온다
- 프로세스 간의 어렵고 복잡한 통신 기법 (IPC : Inter-Process Communication)
- 프로세스는 각각의 독립된 메모리 영역을 할당받았기 때문에 하나의 프로그램에 속하는 프로세스들 사이의 변수를 공유할 수 없다
(프로세스는 쓰레드와 달리 자원을 공유하지 않기 때문에 프로세스가 쓰레드보다 context switching에 걸리는 시간이 길다)
💡 Context Switching이란?
- CPU에서 여러 프로세스를 돌아가면서 작업을 처리하는 과정
- 프로세스의 상태 정보를 저장하고 복원하는 일련의 과정이다
- 동작 중인 프로세스가 대기를 하면서 해당 프로세스의 상태(context)를 보관하고, 대기하고 있던 다음 순서의 프로세스가 동작하면서 이전에 보관했던 프로세스의 상태를 복구하는 작업을 말한다
멀티 스레드
- 프로세스 내 작업을 여러 개의 스레드로 분할함으로써 작업의 부담을 줄이는 프로세스 운영 기법
- 하나의 프로세스가 동시에 여러 작업을 실행하는데 목적을 둔다
- 하나의 응용 프로그램을 여러 개의 스레드로 구성하고 각 스레드로 하여금 하나의 작업을 처리하도록 한다
- 쉽게 말하자면, 프로그램을 여러 개 켜는 것보다 하나의 프로그램 안에서 여러 작업을 해결하는 것이다
- Windows, Linux 등 많은 운영체제들이 멀티 프로세싱을 지원하고 있지만, 멀티 스레딩을 기본으로 하고 있다
- 대표적인 멀티 스레드 응용프로그램으로는 웹 서버가 있다
멀티 스레드의 장점
1) 응답성 향상
- 한 스레드가 입출력으로 인해 작업이 진행되지 않더라도 다른 스레드가 작업을 계속하여 사용자의 작업 요구에 빨리 응답할 수 있다
2) 자원 공유
- 한 프로세스 내에서 독립적인 스레드를 생성하면 프로세스가 가진 자원을 모든 스레드가 공유하게 되어 작업을 원할하게 진행할 수 있다
- 또한 쓰레드 간 메모리 영역을 공유하기 때문에 context swithcing 또한 빠르다
- 통신 방법도 간단하여 프로그램 응답 시간이 단축된다
3) 효율성 향상 (시스템 자원 소모 감소)
- 불필요한 자원의 중복을 막음으로써 시스템의 효율이 향상된다
- 시스템 콜(프로세스를 생성하여 자원을 할당하는 것)이 줄어들어 자원의 효율적인 관리가 가능하다
4) 다중 CPU 지원
- 다중 CPU가 멀티스레드를 동시에 처리하여 CPU 사용량이 증가하고, 프로세스의 처리 시간이 단축된다
멀티 스레드의 단점
- 모든 스레드가 자원을 공유하기 떄문에 한 스레드에 문제가 생기면 전체 프로세스에 영향을 미친다
- 반면 프로세스를 여러 개 만드는 방식인 경우, 각 프로세스가 독립적이기 때문에 한 프로세스의 문제가 다른 프로세스로 전달되지 않는다
- 설계와 디버깅이 까다롭다
- 단일 프로세스 시스템인 경우 효과를 기대하기 어렵다
- 프로세스가 여러 개일 때는 프로그램을 멀티 프로세스로 처리하는 것보다 멀티 스레드로 처리하는 것이 효율적이다
- 다른 프로세스에서 스레드를 제어할 수 없다 (즉, 프로세스 밖에서 스레드를 제어할 수 없다)
- 멀티 스레드의 경우 자원 공유의 문제가 발생한다 -> 동기화 문제
멀티 프로세스보다 멀티 스레드를 지향하는 이유
- 스레드는 프로세스보다 경량이어서 프로세스에 비해 생성과 제거가 쉽다
- 스레드는 Stack을 제외한 메모리를 공유하기 때문에 멀티 프로세스에서 데이터를 공유하기 위해 사용하는 IPC 통신의 비용 부담이 감소한다
- 컨텍스트 스위칭 시 자원의 손실이 감소한다
- 프로세스 간 컨텍스트 스위칭이 단순히 CPU 레지스터 교체 뿐만 아니라, RAM과 CPU 사이의 캐시 메모리에 대한 데이터까지 초기화되므로 상당한 오버헤드가 발생한다
멀티 프로세스와 멀티 스레드의 적절한 상황
1) 멀티 프로세스
- 브라우저의 각 탭 (크롬)
- 한 프로세스가 비정상적으로 종료되더라고 다른 프로세스가 영향을 받지 않아야 되는 경우
- 자원을 공유할 필요가 없는 상황
2) 멀티 스레드
- 워드 프로세스와 같은 응용 소프트웨어
- 여러가지 기능과 메모리를 공유해야 하는 상황
💡 결론
멀티 스레드, 멀티 프로세스 중 어느 것이 더 좋다고 단정 짓기는 어렵다!
따라서 시스템마다 상황에 맞는 적합한 기법을 적용하는 것이 중요하다!
220725 스터디 질문 목록
Q. 코어 하나로 프로세스 2개가 진짜 동시에 실행될 수 있는가?
A. 불가능하다. 왜냐하면 코어가 하나일 때 각 프로세스들은 한 가지의 작업만 처리하기 때문이다 (-> 멀티태스킹의 개념)
Q. CPU 하나가 스레드 여러 개를 교차해서 실행하는 걸까? 아니면 진짜 동시에 실행하는 걸까?
A. 한 작업(프로세스) 내에서 여러 개의 스레드가 일을 분담해서 처리하게 된다. 그러므로 스레드 여러 개를 교차해서 실행하는 것이 맞다
Q. CPU vs 코어 vs 프로세서
A. 결론적으로 CPU > 프로세서 > 코어 다!
CPU
- 중앙 처리 장치
- 기억/연산/제어 기능을 담당하며 전체 컴퓨터의 논리적 사고를 처리한다
프로세서
- 제어 및 연산 기능을 수행한다.
- 컴퓨터가 하는 모든 일을 총괄하는 것이 CPU라면, 프로세서는 CPU를 보조하며 연산, 제어의 핵심 부분을 담당한다.
- 하지만 요즘에는 프로세서가 점차적으로 CPU라는 용어를 대체해서 쓰이고 있다
코어
- CPU 안에서 일하는 부품 중 하나이다
- 코어는 프로세서가 하는 일을 분담한다
Q. 단일프로세스 시스템에서는 왜 멀티스레딩을 쓰면 효과가 별로 없을까?
A. 컨텍스트 스위칭이나 동기화 등의 이유로 싱글 코어 멀티 스레딩은 스레드 생성 시간이 오버헤드로 작용하여 단일 스레드보다 느리다. 따라서 단일 스레드로 처리하는 것이 더 빠르게 된다
Q. 프로그램이 여러 개일땐 왜 멀티프로세싱보다 멀티 스레딩이 더 좋을까?
A. 멀티 프로세싱의 경우 프로세스 별로 자원을 배정해서 메모리에 올려야하는데, 수행할 작업에게 그 때마다 자원을 분배하는 것보단 한 번에 한 작업만을 멀티스레딩을 통해 빠르게 처리해서 끝내고 다음 작업을 수행하는 것이 메모리 측면이나 오버헤드를 고려했을 때도 효율적이기 때문이다.
참고 자료
https://unequaled-peach-7e5.notion.site/91e37e52ca114a94bf4c23f2c67d7ba7
https://github.com/InJun2/TIL/blob/main/CS-topic/OS/Process-Thread.md
https://www.youtube.com/watch?v=QmtYKZC0lMU&t=2s
위 영상은 아래 글에 정리했슴당!
https://yummy0102.tistory.com/403
'야미스터디 > OS' 카테고리의 다른 글
[OS] 인터럽트와 시스템 콜 (0) | 2022.08.24 |
---|---|
[OS] Critical Section 📌 (0) | 2022.08.05 |
[OS] 세마포어와 뮤텍스 📌 (0) | 2022.07.24 |
[OS] 교착 상태 (Dead Lock) 📌 (0) | 2022.07.21 |
[OS] 프로세스, 스레드 정리 (feat. 쉬운 코딩) (0) | 2022.07.15 |
댓글