프로세스 VS 스레드
- 프로세스
- 스레드
- 프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위
프로그램 VS 프로세스
- 프로그램
- 컴퓨터에서 실행할 수 있는 파일을 통칭. 아직 파일을 실행하지 않은 상태이기 때문에 정적 프로그램이라고 불렀고, 줄여서 프로그램이라고 부르게 됨
- 프로세스
- 프로세스는 프로그램을 실행시켜 정적인 프로그램이 동적으로 변하여 프로그램이 돌아가고 있는 상태. 컴퓨터에서 작업중인 프로그램을 의미.
- 프로그램에 운영체제가 실행되기 위한 메모리 공간을 할당해주어 실행된 상태.
- 프로그램 실행하는 순간 파일은 컴퓨터 메모리에 올라가고, 운영체제로부터 시스템 자원을 할당받아 프로그램 코드를 실행시킴
프로세스와 스레드
프로세스
- 과거에는 프로그램을 실행할 때 프로세스 하나만을 사용해 이용했으나 시간이 지날수록 프로그램이 복잡해지고 다양해지면서 프로세스 작업 하나만을 사용하여 프로그램을 실행하는데에 한계가 생김
- 그렇다고 동일한 프로그램을 여러 개의 프로세스로 만들게 되면, 그만큼 메모리를 차지하고 CPU에서 할당받는 자원이 중복되게 될 것 -> 이러한 한계를 해결하고자 스레드 탄생
- 기본적으로 하나의 프로세스가 생성될 때, 하나의 스레드가 같이 생성
스레드
- 스레드는 하나의 프로세스 내에서 동시에 진행되는 작업의 갈래, 흐름의 단위를 말함.
- 크롬 브라우저에서 여러 탭을 열었을때를 생각하면 이해가 빠름
- 일련의 작업 흐름들을 스레드라고 하고, 여러개가 있다면 멀티 스레드라고 부름
- 하나의 프로세스 안에 여러개의 스레드들이 들어있다고 생각하면 됨
일반적으로 하나의 프로그램은 하나 이상의 프로세스를 갖고, 하나의 프로세스는 반드시 하나 이상의 스레드를 가짐
프로세스 & 스레드의 메모리
프로세스 메모리 구조
- Code 영역 : 실행할 프로그램의 코드가 저장. 컴파일 시 결정됨.
- Data 영역 : 전역변수와 정적변수가 저장. 프로그램이 시작될 때 할당되어 프로그램 종료 시 소멸. (런타임 시 할당)
- Stack 영역 : 지역변수, 매개변수, 리턴값 등 잠시 사용되었다가 사라지는 데이터를 저장. 함수 호출 시 할당되고 함수 반환 시 소멸.
- Heap 영역 : 동적 데이터 영역. 메모리 주소 값에 의해서만 참조되고 사용되는 영역.
메모리 구역을 나누게 된 이유
어떠한 프로그램을 구현할 때, 각각의 변수, 함수, 클래스 등이 호출되고 해제되는 시기가 다르기 때문. 데이터를 공유하여 사용량을 줄이기 위해서!
스레드 메모리 할당
위처럼 스레드는 stack만 따로 할당받고 나머지 영역은 서로 공유함
Stack만 따로 할당받는 이유
- 스레드는 독립적인 동작을 수행하기 위해 존재
- 독립적으로 함수 호출이 가능해야 함
- 따라서 함수의 매개변수, 지역변수 등을 저장하는 스택 메모리 영역은 독립적으로 할당받아야 함
프로세스는 자신만의 고유 공간과 자원을 할당받아 사용하는데에 반해, 스레드는 다른 스레드와 공간, 자원을 공유하면서 사용하는 차이가 존재
멀티 프로세스 VS 멀티 스레드
- 멀티 스레드는 멀티 프로세스보다 적은 메모리 공간을 차지하고 Context Switching이 빠른 장점이 있음
- but, 동기화 문제와 하나의 스레드 장애로 전체 스레드가 종료될 위험을 갖고 있음
- 멀티 프로세스는 하나의 프로세스가 죽더라도 다른 프로세스에 영향을 주지 않아 안정성이 높지만, 멀티 스레드보다 많은 메모리공간과 CPU 시간을 차지하는 단점이 있음
- 동시에 여러 작업을 수행하는 점에서 동일하지만, 각각의 장단점이 있기에 적용하는 시스템에 따라 적합한 동작 방식을 선택해야 함.
멀티 프로세스
- 개념
- 두 개 이상의 다수 프로세서가 협렵적으로 하나 이상의 작업을 동시에 처리하는 것(병렬 처리)
- 각 프로세스 간 메모리 구분이 필요하거나 독립된 주소 공간을 가져야 할 경우 사용
- 장점
- 독립된 구조로 안정성이 높음
- 프로세스 중 하나에 문제가 생겨도 다른 프로세스에 영향을 주지 않음
- 여러개의 프로세스가 처리되어야 할 때 동일한 데이터를 사용하고, 이러한 데이터를 하나의 디스크에 두고 모든 프로세서가 이를 공유하면 비용적으로 저렴
- 단점
- 독립된 메모리 영역이기 때문에 작업량이 많을수록(Context Switching이 자주 일어나서 주소 공간의 공유가 잦을 경우) 오버헤드 발생으로 성능저하 발생
- Context Switching 과정에서 캐시 메모리 초기화 등 무거운 작업이 진행되고 시간이 소모되는 등 오버헤드 발생
Context Switching
- CPU는 한 번에 하나의 프로세스만 실행 가능
- CPU에서 여러 프로세스를 돌아가면서 작업을 처리하는데 이 과정을 Context Switching이라고 함
- CPU가 한 프로세스에서 다른 프로세스로 전환할 때 발생하는 일련의 과정
- 동작중인 프로세스가 대기를 하면서 해당 프로세스의 상태를 보관하고 대기하고 있던 다음 순서의 프로세스가 동작하면서 이전에 보관했던 프로세스의 상태를 복구하는 작업
멀티 스레드
- 개념
- 하나의 프로세스에 여러 스레드로 자원을 공유하며 작업을 나누어 수행하는 것
- 장점
- 시스템 자원소모 감소(자원의 효율성 증대)
- 프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어 자원을 효율적으로 관리할 수 있음
- 시스템 처리율 향상(처리비용 감소)
- 스레드 간 데이터를 주고 받는 것이 간단해지고 시스템 자원 소모가 줄어듦
- 스레드 사이 작업량이 작아 Context Switching이 빠름(캐시 메모리 비울 필요 없음)
- 간단한 통신 방법으로 프로그램 응답시간 단축
- 스레드는 프로세스 내 스택영역을 제외한 메모리 영역을 공유하기에 통신 비용이 적음
- 힙 영역을 공유하므로 데이터를 주고 받을 수 있음
- 단점
- 자원을 공유하기에 동기화 문제 발생 가능성 있음(병목현상, 데드락 등)
- 주의 깊은 설계가 필요하고 디버깅이 어려움(불필요 부분까지 동기화하면 대기시간으로 인해 성능저하 발생)
- 하나의 스레드에 문제가 생기면 전체 프로세스가 영향 받음
- 단일 프로세스 시스템의 경우 효과를 기대하기 어려움
멀티스레드의 동기화(임계영역 문제) 해결하기 위한 조건
- 멀티스레드의 동기화 문제
- 스레드들은 부모 프로세스의 메모리 공간을 공유하는데 여러 스레드가 동일한 메모리 공간을 접근하면서 동기화 문제가 발생함
- 임계영역 문제를 해결하기 위한 조건
- 상호 배제
- 어떤 프로세스가 임계영역에서 실행중이라면 다른 프로세스들은 임계영역에서 실행될 수 없음
- 진행
- 임계영역에서 실행중인 프로세스가 없고 들어가야 하는 프로세스가 여러개 있다면 어느것이 들어갈지 적절히 선택해주어야 함
- 한정된 대기
- 다른 프로세스의 기아 방지를 위해 한 번 임계 구역에 들어간 프로세스는 다음 임계구역에 들어갈 때 제한을 두어야 함.
참고
https://inpa.tistory.com/entry/%F0%9F%91%A9%E2%80%8D%F0%9F%92%BB-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%E2%9A%94%EF%B8%8F-%EC%93%B0%EB%A0%88%EB%93%9C-%EC%B0%A8%EC%9D%B4
https://wooody92.github.io/os/%EB%A9%80%ED%8B%B0-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80-%EB%A9%80%ED%8B%B0-%EC%8A%A4%EB%A0%88%EB%93%9C/
https://nice-engineer.tistory.com/entry/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EC%8A%A4%EB%A0%88%EB%93%9C