프로그램 > 프로세스 > 스레드
먼저 프로세스와 스레드에 대해 알려면 프로그램에 대해 이해하고 넘어가야 한다!
프로그램이란 파일이 저장 장치에 저장되어 있지만, 메모리에는 올라가 있지 않은 정적인 상태를 말한다
- 모든 프로그램은 운영체제로부터 실행되기 위한 메모리 공간을 할당받아야 실행될 수 있다
- 그러나 프로그램은 아직 운영체제가 독립적인 메모리 공간을 할당해주지 않아서 실행되지 않고 가만히, 정적인 상태로 있는 것이다
즉, 프로그램은 아직 실행되지 않은 파일 그 자체를 의미한다
그리고 프로그램을 실행하는 순간 해당 파일은 컴퓨터 메모리에 올라가게 되고, 이 상태를 동적인 상태라고 한다
또한 이 상태의 프로그램을 프로세스라고 한다
프로세스(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. 멀티 프로세싱의 경우 프로세스 별로 자원을 배정해서 메모리에 올려야하는데, 수행할 작업에게 그 때마다 자원을 분배하는 것보단 한 번에 한 작업만을 멀티스레딩을 통해 빠르게 처리해서 끝내고 다음 작업을 수행하는 것이 메모리 측면이나 오버헤드를 고려했을 때도 효율적이기 때문이다.
참고 자료
싱글스레드(Single thread) vs 멀티스레드 (Multi thread)
오늘은 싱글 스레드와 멀티 스레드가 무엇인가와 이 둘의 장단점에 대해서 알아보자!!일단, 시작에 앞서 이해를 돕기 위해 이 그림을 봐주길 바란다.=> 싱글 스레드와 멀티 스레드의 차이는 이
velog.io
프로세스와 스레드의 차이
프로세스와 스레드의 차이는 프로세스와 스레드, 그리고 프로그램이 작동하는 방식에 대해서 잘 이해하고 있는지 확인하기 위해 기술면접에서 단골 질문 사항으로 나온다.
velog.io
https://unequaled-peach-7e5.notion.site/91e37e52ca114a94bf4c23f2c67d7ba7
멀티프로세스와 멀티스레드의 차이
🌹 정리 by 장미(https://velog.io/@newbiekim/)
unequaled-peach-7e5.notion.site
https://github.com/InJun2/TIL/blob/main/CS-topic/OS/Process-Thread.md
GitHub - InJun2/TIL: todo-list
todo-list. Contribute to InJun2/TIL development by creating an account on GitHub.
github.com
https://www.youtube.com/watch?v=QmtYKZC0lMU&t=2s
위 영상은 아래 글에 정리했슴당!
https://yummy0102.tistory.com/403
프로세스, 스레드 정리 (feat. 쉬운 코딩)
https://www.youtube.com/watch?v=QmtYKZC0lMU&t=2s 오늘의 토픽 🌱 공부하다가 이 영상을 봤는데 너무 유익해서 간단하고 쉽게 영상 내용 정리하고 마저 공부하려고! 프로그램 (program) 컴퓨터가 실행할 수 있
yummy0102.tistory.com
'야미스터디 > 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 |
댓글