multi thread & multi process

황서준·2023년 6월 21일

computer science

목록 보기
1/4
post-thumbnail

오늘은 멀티 스레드와 멀티 프로세스에 대해 알아보려고 한다. 개념 정리에 어려움이 많아서 기록하고, 또 기록하려고 한다. 벨로그뿐만 아니라 다양하게(공책에 적고, 메모도 하고, 여러 번 반복하다 보면 내 지식이 되지 않을까 기대하며...


스레드와 프로세스 관계

일반적으로 하나의 프로세스는 하나의 스레드를 갖고 작업을 수행한다. 내가 이해하기로는 스레드는 프로세스의 하위 개념(?)인 듯하다.


그렇다면 멀티 스레드는?

멀티 스레드는 말 그대로 스레드가 2개 이상이라고 생각하면 된다. 더 자세히 들여다 보면 하나의 프로세스 안에서 둘 이상의 스레드가 동시에 작업을 진행하는 것이다.


멀티 프로세스란?

멀티 프로세스는 멀티 스레드와 약간 차이가 있다. 알아본 바로는 여러 개의 CPU를 사용하여 여러 프로세스를 동시에 수행하는 것이라고 한다.


멀티 스레드와 멀티 프로세스

멀티 스레드멀티 프로세스는 여러 흐름을 동시에 수행한다는 공통점을 갖고 있다. 하지만 앞서 말한 것과 같이 멀티 스레드가 일종의 하위 개념의 존재라 둘 사이에 다른 점이 있다. 멀티 프로세스는 각 프로세스가 독립적인 메모리를 갖고 별도 실행되지만, 멀티 스레드의 경우 각 스레드가 자신이 속한 프로세스의 메모리를 공유한다는 점이다.


각각의 장점

1) 멀티 스레드 장점

시스템 자원의 낭비가 적다. 각 스레드가 자신이 속한 프로세스 메모리를 공유하기 때문. 따라서 하나의 스레드가 작업할 때 다른 스레드가 별도로 동시 작업이 가능해, 사용자와의 응답성이 좋아진다(고 한다).

스레드 간 작업량이 적어서 Context Switching이 빠르다.(캐시 메모리를 비울 필요가 없다.)

힙 영역을 공유하므로 데이터를 주고 받을 수 있다.

2) 멀티 프로세스 장점

안정적이다. 메모리 침범 문제를 OS 차원에서 해결해 준다.하나의 프로세스가 비정상적으로 정지되더라도 다른 프로세스에 영향을 주지 않는다.


각각의 단점

1) 멀티 스레드의 단점

스레드 간 자원 공유하기 때문에 하나의 스레드만 오류가 나도 전체 스레드에 영향을 끼칠 수 있다. (병목 현상, 데드 락)

설계에 주의가 필요하고, 디버깅에 어려움이 있다.(성능 저하 발생)

단일 프로세스의 경우 효과가 미비하다.

동기화 이슈 ... critical section / 전역변수 공유로 인한 충돌 발생

1-2) 해결 방법

우선 세 가지 조건을 만족해야 한다.
- 상호 배제(mutual exclusion)
- 한정 대기(bounded waiting)
- 진행의 융통성(progress flexibility, progress)

가장 단순한 방법은 LOCK을 사용하는 것. critical section에 진입한 프로세스가 LOCK을 부여받고 critical section에서 빠져나올 때 반납하는 개념이다. 이 경우 다른 프로세스의 접근이 불가능한 상태가 되므로 충돌을 방지할 수 있다.

(다른 방법이 더 있는 것으로 아는데 우선 여기까지...)

2) 멀티 프로세스의 단점

독립된 메모리 영역이기 때문에 작업량이 많아질수록 오버헤드가 많이 발생하여 성능저하로 이어질 가능성이 높다.

Context Switching 과정에서 캐시 메모리 초기화 등 작업으로 인해 오버헤드가 발생한다.

Context Switching이란? 
- CPU는 한 번에 하나의 프로세스만 실행 가능
- CPU에 여러 프로세스를 돌아가며 실행하는 것을 Context Switching이라고 함
- 동작 중인 프로세스가 대기, 해당 프로세스의 상태(Context)를 보관, 
- 다음 순서인 프로세스가 동작하며 이전 프로세스의 상태를 복구하는 작업을 말한다.

각각의 쓰임... 어떤 상황에서?

단순히 스레드 간 공유 데이터를 읽기만 할 경우 동기화 기술을 사용할 필요가 없으므로 멀티 스레드를 사용하는 것이 좋다. 하지만 데이터를 읽고 쓰는 작업이 빈번하다면, 동기화 기술을 사용해야 하고, 이 경우 데드 락과 같은 비정상적인 동작이 일어날 수 있기 때문에 멀티 프로세스를 사용하는 것이 좋다.

profile
프론트엔드 개발자를 꿈꾸며!

0개의 댓글