개요
데브코스에서 Random Bit Flip 액션 일지인 동행 스크럼 활동을 하다가 창현님의 소개로 코다님의 영상을 보게 되어 정리하게 되었습니다. 😊
Process 란?
위 이미지처럼 프로그램(Ex : 코드가 구현된 파일)이 프로세스(Ex : 실행이 되어 무언가가 된 것)가 되면서 총 2가지 일이 발생합니다.
- 먼저 프로세스가 필요로 하는 재료들이 메모리에 올라가야 합니다. 즉, 메모리 영역을 확보하게 됩니다. 😎
- 그리고 해당 프로세스의 정보를 담고 있는 PCB(Process Control Block)이 생성과 동시에 함께 만들어 집니다.
PCB는 다음과 같은 정보들을 담습니다~
근데 프로세스 모든 영역이 독립적인 것 같은데, 다른 프로세스와 통신하려면 어떻게 해야 할까요?
대표적으로, 프로세스 간에 통신을 위해 사용하는 것이 IPC(Inter-Process Communication) 입니다.
IPC의 대표적인 방식은 메시지 교환(Message Passing)과 공유 메모리(Shared Memory)가 있습니다.
이번에는 프로세스 실행 예시를 들어 볼까요?
우리는 보통 개발을 하기 위해, 구글 홈페이지와 인텔리제이, 슬랙 등을 동시에 사용합니다.
이렇게 대부분 하나의 프로세스만을 사용하는 것보다 동시에 여러 프로세스를 사용하죠?
하지만, 하나의 프로세스가 CPU를 점유하고 있다면, 다른 프로세스를 실행시키지 못합니다. ㅠ
때문에, CPU는 다수의 프로세스를 동시에 실행하기 위해 시분할로 전환하며 실행합니다.
이때, 전환하는 것이 바로 컨텍스트 스위칭입니다. 🤓
하지만 이는 매우 복잡하기 때문에, 나온 것이 바로 경량화된 프로세스 버전인 스레드인 것입니다.
Thread 란?
쓰레드는 위 이미지처럼 코드, 데이터, 힙 영역을 공유 자원으로 사용하고 스택 영역만 독립적으로 사용합니다. 🤔
때문에 프로세스와 달리 콘텍스트 스위칭이 발생할 때, 캐싱 적중률이 올라가서 더욱 효율적 이겠죠?
하지만 쓰레드도 단점은 존재하겠죠?
네 맞습니다. 자원이 공유되고 있기 때문에, 동기화 작업이 필수적으로 필요하죠.
멀티 프로세스와 멀티 쓰레드
멀티 프로세스와 멀티 쓰레드는 모두 처리 방식의 일종입니다.
즉, 한 어플리케이션에 대한 처리 방식이라 생각하면 편할 것입니다. 😙
그럼 먼저, 멀티 프로세스에서의 예시를 들어봅시다.
한 어플리케이션에서 다수의 사용자가 로그인을 요청하는 상황이라고 가정해봅시다.
이때 멀티 프로세스에선 동시에 처리할 수 없고 매번 하나의 로그인만 처리할 수 있겠죠?
그래서 아래 이미지처럼 부모 프로세스가 포크해서 자식 프로세스를 만들어 일을 처리할 것입니다.
그리고 당연히 자식 프로세스는 부모와 별개로 메모리 영역을 확보할 것입니다.
반면에, 쓰레드는 아래 이미지처럼 한 프로세스 내에서 구분지어진 실행 단위입니다. 🤗
여기서 멀티 쓰레드의 예시를 들어보면 다음과 같습니다.
인텔리제이에서 테스트를 돌리는 동시에 소스 코드를 수정하는 상황을 들 수 있습니다.
즉, 한 어플리케이션에 대한 작업의 단위가 나뉘어질 때가 많은데, 이때 각 쓰레드가 그 작업을 다루는 것입니다.
요약하면 다음과 같습니다.
프로세스 | 쓰레드 |
각 프로세스는 독립적이다. | 쓰레드끼리 긴밀하게 연결되어 있다. |
IPC를 사용해 통신한다. | 공유된 자원으로 통신 비용이 절감된다. |
자원 소모적이고 개별 메모리를 차지한다. | 공유된 자원으로 메모리가 효율적이다. |
Context Switching 비용이 크다. | Context Switchinga 비용이 적다. |
동기화 작업이 필요하지 않다. | 공유 자원 관리를 해야 한다. |
근데 요약해보니 멀티 프로세스보다 멀티 쓰레드가 훨씬 좋아보이죠?
왜 멀티 프로세스를 사용할까요?
예를 들어, 인터넷 익스플로러를 사용할 때 여러 개의 탭에 중요한 작업을 띄어두고 처리하다가 한 탭에 문제가 생기면 쓰레드끼리는 긴밀하게 연결되어 있기 때문에, 전체에 문제가 갑니다.
하지만? 멀티 프로세스를 사용하는 구글 크롬은 다소 비효율적인 부분이 있지만, 멀티탭 간에 영향이 덜 가죠? 모두 장단점이 있습니다. ☺️
Multi-Core
멀티 코어는 멀티 프로세스, 쓰레드와는 조금 다른 관점으로 바라봐야 합니다!
멀티 프로세스와 멀티 쓰레드는 일종의 처리 방식이라 소프트웨어 분야에 가깝습니다.
하지만 멀티 코어는 하드웨어 측면에 가깝습니다! 그리고 멀티 코어는 동시성과 병렬처리를 잘 이해해야 합니다.
아래 이미지 처럼, 싱글 코어를 가진 CPU가 있다고 가정해봅시다.
싱글 코어를 가진 CPU가 실행 단위를 처리할 땐 동시에 여러 가지가 진행되기 위해서 빠른 텀으로 전환되며 실행되어야 합니다.
즉, 여러 실행 단위를 번갈아 실행가며 동시에 일어나는 것처럼 보이게 하는 것이 바로 동시성입니다.
다시 요약하면 동시성은 짧은 순간에 CPU의 시간을 분할해서 동시에 하는 것처럼 보이게 하는 것입니다. 🤫
하지만 멀티 코어는 다음과 같습니다.
멀티 코어는 병렬 처리, 즉, 물리적으로 여러 코어를 사용해 다수의 실행 단위를 동시에 처리할 수 있게 하는 것이죠.
요약하면 다음과 같습니다.
Concurrency 동시성 | Parallelism 병렬 처리 |
하나의 코어에서 하나 이상의 프로세스(혹은 쓰레드)가 번갈아가면서 진행되지만 동시에 진행되는 것처럼 보이는 것 | 둘 이상의 코어에서 동시에 하나 이상의 프로세스(혹은 쓰레드)가 한꺼번에 진행되는 것 |
Reference
'Activity > 데브코스 - 백엔드 엔지니어링' 카테고리의 다른 글
벡엔드 데브코스 TIL - 동시성 이슈 해결하기 (4) | 2023.10.11 |
---|---|
벡엔드 데브코스 TIL - 프로젝트로 단축 URL 알아가기 (0) | 2023.10.04 |
벡엔드 데브코스 TIL - 프록시 패턴 발표 (1) | 2023.07.12 |
벡엔드 데브코스 TIL - 싱글톤 패턴 발표 (4) | 2023.06.08 |
백엔드 데브코스 TIL - 놓치기 쉬운 JAVA 이야기 (2) | 2023.06.02 |