멀티 프로세스 대신 멀티 쓰레드 사용 이유 & Thread Safe

송해광·2022년 9월 26일
0

OS

목록 보기
2/8

Multi-Process : 하나의 OS안에서 여러 프로세스가 동시에 실행되는 것

$$ 동시에 실행되는 건 아니다! ( CPU는 한번에 하나의 프로세스만 실행가능하기 때문 -> 빠르게 Context-Switching이 발생하면 사용자는 빠른 속도 때문에 동시라고 착각!) $$

Multi-Thread : 하나의 프로세스안에서 여러 쓰레드가 동시에 실행되는 것

멀티 프로세스 대신 멀티 쓰레드를 사용하는 이유는!?

1. 메모리 측면 ( 자원의 효율성 증대 )

-> 멀티 프로세스 환경에서 오버헤드가 크기 때문! ( Context-Switching 시 CPU 레지스터 교체 + RAM 과 CPU 사이 캐시 데이터 초기화 )
-> 쓰레드는 프로세스 내의 Stack 메모리를 공유하기 때문에 데이터를 주고 받는 게 상대적으로 간단

2. 속도 측면 ( 처리 비용 감소 및 응답 시간 감소 )

-> 쓰레드는 stack을 제외한 메모리 영역을 공유하기 때문에 Context-Switching과 쓰레드 간 통신 시 Stack영역만 처리하면 된다. ( 통신 비용 감소, 속도 빠름 )

그렇다면, 무조건 멀티 쓰레드가 좋을까?
멀티 쓰레드가 멀티 프로세스보다 성능이 좋다는 건 맞는데 멀티 쓰레드 환경에서 신경써야 할 부분이 있다.

쓰레드가 메모리 영역을 공유한다면 동기화 문제가 발생할 수 있기에!

Thread Safe

멀티쓰레드 환경에서 여러 쓰레드가 동시에 하나의 공유 자원(객체, 변수)에 접글할 때, 프로그램에 문제 없이 의도한 대로 동작하는 것

Thread Safe 하기 위해서 공유 자원에 접근하는 Critical Section(임계영역)을 동기화 기법으로 제어 필요!

세부 방법

1. Re-entrancy

어떤 함수가 한 스레드에 의해 호출되어 실행 중일 때, 다른 스레드가 그 함수를 호출하더라도 그 결과가 각각에게 올바로 주어져야 한다.

2. Thread-local storage

공유 자원의 사용을 최대한 줄여 각각의 스레드에서만 접근 가능한 저장소들을 사용함으로써 동시 접근을 막는다.

이 방식은 동기화 방법과 관련되어 있고, 또한 공유상태를 피할 수 없을 때 사용하는 방식이다.

3. Mutual exclusion ( 가장 일반적 - 한 쓰레드가 접근하면 다른 쓰레드를 막는다. )

공유 자원을 꼭 사용해야 할 경우 해당 자원의 접근을 세마포어 등의 락으로 통제한다.

4. Atomic operations

공유 자원에 접근할 때 원자 연산을 이용하거나 '원자적'으로 정의된 접근 방법을 사용함으로써 상호 배제를 구현할 수 있다.

참고자료 : https://velog.io/@sooyoungh/OS-%EB%A9%80%ED%8B%B0-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EB%8C%80%EC%8B%A0-%EB%A9%80%ED%8B%B0-%EC%8A%A4%EB%A0%88%EB%93%9C%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0

https://landwhale2.github.io/os/67/

https://gompangs.tistory.com/entry/OS-Thread-Safe%EB%9E%80

profile
끝까지 해보고 하는 후회는 반성이 되어 앞을 보게 하지만 끝까지 하지 않고 하는 후회는 미련이 되어 뒤를 보게 한다.

0개의 댓글