프로세스(Process)
- 메모리에 적재되고 CPU 자원을 할당받아 프로그램이 실행되고 있는 상태
- 프로세스는 Code, Data, Stack, Heap 영역의 네가지 구조로 되어있다.
- 코드 영역(code area) : 프로그래머가 작성한 프로그램이 코드 영역에 작성된다.
- 데이터 영역(data area) : 코드가 실행되면서 사용한 변수나 파일들의 각종 데이터들이 모여있다.
- 스택 영역(stack area) : 호출한 함수가 종료되면 되돌아올 메모리의 주소를 스택에 저장하거나 변수 사용 범위에 영향을 미치는 영역을 구현 할때 사용된다.
- 힙 영역(heap area) : 동적으로 할당되는 데이터들을 위해 존재하는 공간이다.
- 서로 다른 프로세스간의 메모리 공간 접근은 허용되지 않는다.
- 운영체제 관점에서는 프로세스가 최소 작업 단위
스레드(Thread)
- 프로세스는 자원을 공유하지 않지만, 스레드는 자원을 공유하며 작동한다.
- 프로세스 내에서 할당받은 자원을 이용하는 실행 흐름의 단위이다.
- 하나의 프로세스는 반드시 하나 이상의 스레드를 갖는다.
- 스레드는 프로세스 내에서 각각 Stack 형식으로 된 메모리 영역만 따로 할당받고 Code, Data, Heap 형식의 메모리 영역은 공유한다.
- 각각의 스레드는 별도의 스택을 가지고 있지만 힙 메모리는 서로 읽고 쓸 수 있게 된다.
- CPU 입장에서의 최소 작업 단위
멀티 프로세스 (멀티 태스킹)
하나의 애플리케이션을 여러 개의 프로세스로 구성하여 각 프로세스가 하나의 작업을 처리하도록 하는 것.
특징
- 안정성이 좋다. 여러개의 자식 프로세스 중 하나에 문제가 발생해도, 다른 자식 프로세스에 영향이 확산되지 않는다.
- 구현이 비교적 간단하고, 각 프로세스들이 독립적으로 동작하며 자원의 서로 다르게 할당된다.
- 프로세스 간 통신을 하기 위해서는 IPC를 통해야 한다.
- 메모리 사용량이 많다.
- 스케쥴링에 따른 Context Switch이 많아지고, 성능 저하의 우려가 있다.
멀티 스레드
멀티태스킹이 하나의 운영체제 안에서 여러 프로세스가 실행되는 것이라면, 멀티스레드는 하나의 프로세스가 여러 작업을 여러 스레드를 사용해 동시에 처리하는 것을 의미한다.
특징
- 응답성이 좋다.
- 자원 공유가 쉽다. 스레드들은 부모 프로세스의 자원과 메모리를 공유 할 수 있다.
- 프로세스를 할당하는 것보다 스레드를 할당하는 것이 비용이 적다.
- 멀티프로세서 구조에서 각각의 스레드가 다른 프로세서에서 병렬로 수행될 수 있다.
- 동기화 그리고 교착상태가 발생하지 않도록 주의해야 한다.
- 자식 스레드 중 하나에 문제가 생긴경우 전체 프로세스에 영향을 줄 수 있다.
멀티 스레드 사용의 이점
1. 자원의 효율성증대
- 멀티 프로세스에 비해 자원을 할당하는 비용이 적다.
- 독립적인 프로세스와 달리 스레드 간 데이터를 주고 받는 것이 간단해지고 시스템 자원 소모가 줄어든다.
- Stack 메모리 영역을 제외한 다른 메모리 영역을 같은 프로세스 내 다른 스레드와 공유하기 때문에 메모리 낭비를 줄일 수 있다.
2. 응답 시간 단축 및 처리 비용 감소
- 프로세스간 IPC를 사용하여 통신하는 것은 상대적으로 비용이 크다.
- 반면, 스레드는 프로세스의 메모리 영역을 공유하여 스레드 간의 통신 비용이 적게 든다.
- 또한 프로세스간의 Context Switching은 느린 반면 스레드간의 Context Switching 은 빠른데, 그 이유는 Context Switching시 스레드는 Stack 영역만 처리하면 되기 때문.
(IPC: Interprocess Communication. 프로세스 간 통신. 프로세스들끼리 서로 데이터를 주고받는 행위 또는 그에 대한 방법.)
멀티 스레드 사용의 단점
1. 안정성 문제
- Synchronization Issue - 여러 개의 스레드가 동일한 데이터 공간(Critical Section)을 공유하면서 이들을 수정한다는 점에 필연적으로 생기는 문제.
- 하나의 스레드가 자신이 사용하던 데이터 공간을 망가뜨린다면, 해당 데이터 공간을 공유하는 모든 스레드를 망가뜨릴 수 있다.
- 스케줄링은 운영체제가 자동으로 해주지 않기 때문에 프로그래머가 적절한 기법을 직접 구현해야 하므로 프로그래밍할 때 멀티스레드를 사용하려면 신중해야 한다.
'CS' 카테고리의 다른 글
[CS] OSI 7 계층 (0) | 2023.01.28 |
---|---|
[CS] 해시(Hash)와 해시 충돌 해결 방법 (0) | 2023.01.28 |
리액티브 프로그래밍(Reactive Programming) (0) | 2023.01.13 |
객체지향 5원칙 SOLID (0) | 2023.01.10 |
멱등성과 HTTP메소드 (0) | 2023.01.10 |