프로세스 (Process)
프로세스는 실행 중인 프로그램이라고 할 수 있다.
프로그램은 컴퓨터에 저장되어 있는 코드 덩어리이며, 아직 실행되지 않은 정적인 상태를 말한다.
프로그램을 더블클릭하여 실행하면 메모리에 올라가고 동적인 상태가 되는데 이를 보고 프로세스라고 한다.
위 그림과 같이 프로세스는 Code, Data, Stack, Heap의 형식으로 독립된 메모리 영역을 할당한다.
각각 독립된 메모리 영역을 할당해 주기 때문에 프로세스는 다른 프로세스의 변수나 자료에 접근할 수 없다.
스레드 (Thread)
스레드는 프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위이다.
운영체제의 스케줄러에 의해 독립적으로 관리될 수 있는 프로그래밍된 명령의 가장 작은 시퀀스이다.
하나의 프로세스는 하나 이상의 스레드를 갖고 있다.
프로세스와의 가장 큰 차이점은 스레드는 공유 자원을 가지고 있어 동료 스레드와 메모리를 서로 공유할 수 있다.
위 그림과 같이 한 프로세스 안에서 스레드는 별도의 Stack영역을 가지고 있지만, Heap메모리는 서로 읽고 쓸 수 있게 된다. (공유자원을 가진다.)
멀티 프로세스
멀티 프로세스는 하나의 응용 프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 하나의 작업을 처리하도록 하는 것이다.
장점
- 하나의 프로세스에 문제가 발생해도 다른 자식 프로세스에 영향이 확산되지 않는다. 안정성이 좋다.
- 구현이 비교적 간단하다.
- 멀티 스레드와 같이 별도의 동기화 작업이 필요하지 않다.
단점
- 독립된 메모리 영역이기 때문에 작업량이 많을수록 (Context Switching이 자주 일어나서 주소 공간의 공유가 잦을 경우) 오버헤드가 발생하여 성능 저하가 발생할 수 있다.
- Context Switching 과정에서 캐시 메모리 초기화 등 무거운 작업이 진행되고 시간이 소모되는 등 오버헤드가 발생한다.
Context Switching
CPU는 한 번에 하나의 프로세스만 실행 가능하기 때문에 멀티 프로세스를 하기 위해서는 여러 프로세스를 돌아가면서 작업을 처리하는 데 이 과정을 Context Switching이라 한다.
동작 중인 프로세스가 대기를 하면서 해당 프로세스의 상태(Context)를 보관하고, 대기하고 있던 다음 순서의 프로세스가 동작하면서 이전에 보관했던 프로세스의 상태를 복구하는 작업을 말한다.
멀티 스레드
하나의 프로세스에 여러 스레드로 자원을 공유하며 작업을 나누어 수행하는 것이다.
장점
- 프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어 자원을 효율적으로 관리할 수 있다.
- 스레드 간 데이터를 주고받는 것이 간단해지고 시스템 자원 소모가 줄어든다.
- 스레드 사이 작업량이 작아 Context Switching이 빠르다.
- 힙 영역을 공유하기 때문에 데이터를 주고받을 수 있어 통신 비용이 적고 응답시간이 단축된다.
단점
- 자원을 공유하기에 동기화 문제가 발생할 수 있다. (병목현상, 데드락 등)
- 하나의 스레드에 문제가 생기면 전체 프로세스가 영향을 받는다.
- 단일 프로세스 시스템의 경우 효과를 기대하기 어렵다.
실전
Q. 프로세스와 스레드의 차이에 대해 설명해 주세요.
A. 프로세스는 정적 상태의 코드 덩어리인 프로그램이 실행되어 동적 상태가 된 것을 의미합니다. 운영체제에 의해 관리되면 프로세스마다 독립적인 Code/Data/Heap/Stack 공간을 할당받습니다. 스레드는 프로세스 내에서 실행되는 작업의 단위입니다. 스레드는 프로세스 내에서 독립된 Stack 영역을 할당받지만 Code/Data/Heap 영역의 데이터는 공유받을 수 있습니다.
Q. 그럼 멀티 프로세스와 멀티 스레드에 대해서도 설명해 주세요.
A. 먼저 멀티 프로세스는 하나의 응용 프로그램을 여러 개의 프로세스로 나누어서 실행하는 것을 의미합니다. 각각의 프로세스는 독립적인 메모리를 가지고 있기 때문에 안정적입니다. 하지만 프로세스 간의 통신 비용이 증가하고 콘텍스트 스위칭 비용이 높아 성능상의 오버헤드가 발생할 수 있습니다.
멀티 스레드는 하나의 프로세스 안에서 여러 스레드가 동시에 실행되는 것을 의미합니다. 각 스레드는 프로세스 안에서 공유되는 자원이 있기 때문에 스레드 간 데이터 공유가 쉽고 빠릅니다. 하지만 이로 인해 동기화 문제가 발생할 수 있어 일관성을 유지하기 어렵게 만들 수 있습니다. 또한 하나의 스레드에 문제가 생기면 전체 프로세스가 영향을 받기 때문에 안정성이 낮습니다.
멀티 프로세스는 독립성과 안정성이 중요한 경우에, 멀티 스레드는 작업 간의 소통이 많고 자원 공유가 필요한 경우에 유용합니다.
참고
'멋진 개발자 > ETC..' 카테고리의 다른 글
개발자 성장 기록 62 - OAuth (0) | 2024.05.22 |
---|---|
개발자 성장 기록 41 - 단위 테스트와 TDD(테스트 주도 개발) (0) | 2024.04.06 |
개발자 취준 기록 30 - SOLID OOP 5대 원칙 (0) | 2024.03.25 |
[항해 취업코스] 개발자 취준 기록 26 - 객체 지향 프로그래밍 (0) | 2024.03.20 |