일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- #크랙미3번
- #크랙미4번
- #파밍
- java8
- Spring
- #보안이슈
- #크랙미 5번
- Easy
- java
- #심플즈 크랙미
- GraphQL
- #심플즈
- leetcode
- #abex
- #크랙미2번
- #보안뉴스
- springframework
- 리버싱
- #리버싱
- #크랙미 9번
- #abex크랙미4번
- #고클린
- #abex크랙미
- #크랙미 10번
- #크랙미
- Today
- Total
Halo World
멀티프로세스 vs 멀티쓰레드 본문
멀티 프로세스 vs 멀티 쓰레드
멀티 프로세스는 한 대의 컴퓨터에 서비스를 여러개 띄워 사용하는 방식으로, 프로세스는 하나의 애플리케이션이라고 보면 된다. 각 프로세스는 독립적인 메모리를 할당받기 때문에, 메모리를 공유할 수 없고 공유하기 위해서는 IPC(프로세스간 통신)을 이용해야 한다.
멀티 쓰레드는 한 프로세스 안에 쓰레드를 여러개 실행시키는 방식으로 각 쓰레드는 별도의 stack 영역을 갖지만 heap 영역이나, data 영역, code영역은 공유해서 사용한다.
어떤 것이 더 효율적일까?
일반적으로 하나의 프로세스에서 여러 작업을 동시에 실행하는 멀티 쓰레드 방식이 더 효율적이고 멀티 쓰레드 방식은 아래 두 가지의 이점을 갖는다.
1) 메모리 자원 공유
: 멀티 쓰레드 방식은 stack을 제외한 메모리를 공유하기 때문에 쓰레드 간의 자원을 공유하는 것이 더 쉽고 빠르고, IPC 통신 같은 복잡한 작업이 필요 없다.
2) Context Switching 시 작업 부하가 적다.
: 멀티 스레드 방식은 context switching 시 stack 영역에 대해서만 처리를 하면 되기 때문에 작업 부하가 멀티 프로세스에 비해 적다. 멀티 프로세스 방식은 CPU 레지스터 뿐 아니라, RAM과 CPU 사이의 캐시 메모리에 대한 데이터까지 초기화를 해야해서 오버헤드가 더 크다.
* Context Switching : 하나의 프로세스가 CPU를 사용 중인 상태에서 다른 프로세스가 CPU를 사용하도록 하기 위해, 이전의 프로세스의 상태를 보관하고 새로운 프로세스의 상태를 적재하는 작업
멀티 프로세스 환경에서 자원 공유 방법
IPC (Inter Process Communication) 통신을 통해 멀티 프로세스 환경에서 자원을 공유할 수 있다. IPC 통신은 커널 영역에서 제공하고, 제공하는 방식은 PIPE, Shared Memory, 메시지 큐 등 여러가지 방식이 있다.
IPC 통신 종류 참고 : jwprogramming.tistory.com/54
멀티 쓰레드 환경에서 공유 자원의 문제
멀티 쓰레드 방식은 효율적이긴하지만, 주의해서 사용해야 한다. Stack을 제외한 메모리 영역을 공유하기 때문에 이로 인한 문제가 발생하기 쉽다. Thread-safe 하게 사용하지 않는 경우, 여러 쓰레드가 한번에 같은 자원에 접근하여 자원의 값이 동기화 되지 않는 문제점이 발생할 수 있으므로, 공유 자원을 주의해서 사용해야 한다.
해결 방법 - JAVA 기준
임계영역에 대한 lock을 잘 설정해 주어야 하는데 여러 방법으로 해결할 수 있음.
1. Synchronized 키워드 사용
자바의 경우에는 Thread-safe를 지원하는 synchronized 키워드를 사용하여 공유 자원 문제를 해결할 수 있다. Synchornized 키워드를 이용하면 한번에 하나의 쓰레드만 한 자원에 접근하는 것을 보장해준다.
2. wait(), notify() 사용
임계영역에서 wait()과 notify() 메소드를 사용하여, 임계영역에 접근하는 쓰레드를 lock()하고 unlock()하는 것이 가능하다.
3. AOP 방법
예를 들어, multi thread가 한 DB에 접근하여 CRUD를 수행하는 경우, DB 데이터에 원자성이 유지될 수 있게 설정해주어야 하는데, Spring 에서 제공하는 @Transactional로 처리를 해줄 수 있음. 해당 어노테이션으로 AOP를 설정하면 메소드를 실행하기 전 프록시를 통해 lock, unlock처리가 가능하다.
https://narusas.github.io/2019/07/17/Spring-Transaction-Note.html
설명 참고 : kyun2.tistory.com/12
'개발자 인터뷰 준비' 카테고리의 다른 글
Twitter 시스템 설계 (0) | 2021.06.13 |
---|---|
JAVA 8 비동기 처리 (@Async) (0) | 2021.06.10 |
AWS SQS vs Kafka vs RabbitMQ (0) | 2021.06.09 |
Spring 버전별 차이 / 개선점 (0) | 2021.06.09 |
JAVA 버전별 개선점 (7, 8, 11) (0) | 2021.06.09 |