멀티 프로세싱과 멀티 스레딩
멀티 프로세싱
멀티 프로세싱은 여러 개의 프로레스를 통해 동시에 두 가지 이상의 일을 수행할 수 있는 것을 말한다. 이를 통해 하나 이상의 일을 병렬적으로 처리할 수 있으며, 프로세스 중 일부에 문제가 발생하더라도 다른 프로세스를 이용해 처리할 수 있어 신뢰성이 높다.
프로세스는 모두 독립적인 메모리 공간을 할당 받기 때문에, 프로세스끼리 서로 데이터를 주고 받기 위해서는 IPC(Inter Process Communication)을 사용해야 한다. IPC는 프로세스끼리 데이터를 주고받고 공유 데이터를 관리하는 메커니즘으로, 종류로는 공유 메모리, 파일, 소켓, 익명 파이프, 명명 파이프, 메시지 큐가 있는데, 이들 모두 이미 메모리를 공유하고 있는 스레드 보다는 속도가 떨어진다.
멀티 스레딩
멀티 스레딩은 프로세스 내 작업을 여러 개의 스레드로 처리하는 기법이다. 스레드끼리는 서로 자원을 공유하기 때문에 효율성이 높다는 장점이 있다. 한 스레드가 중단되어도 다른 스레드는 실행 상태일 수 있어 중단되지 않은 빠른 처리가 가능하다. 하지만 한 스레드에 문제가 생기면 다른 스레드에도 영향을 끼쳐 스레드로 이루어져 있는 프로세스에 영향을 줄 수 있는 단점이 있다.
이외에도 멀티 스레딩을 기반으로 프로그래밍할 때는 동일한 자원에 동시에 접근하는 동기화 작업에 신경써줘야 한다. 서로 다른 스레드가 데이터와 힙 영역을 공유하기 때문에 어떤 스레드가 다른 스레드에서 사용중인 변수나 자료구조에 접근하여 엉뚱한 값을 읽어오거나 수정할 수 있다. 그렇기 때문에 멀티스레딩 환경에서는 동기화 작업이 필요하다. 동기화를 통해 작업 처리 순서를 컨트롤 하고 공유 자원에 대한 접근을 컨트롤 하는 것이다. 하지만 이로 인해 병목현상이 발생하여 성능이 저하될 가능성이 높다.
공유 자원과 임계 영역
공유 자원
굥유 자원(Shared resource)은 시스템 안에서 각 프로세스, 스레드가 함께 접근할 수 있는 모니터, 프린터, 메모리, 파일 등의 자원이나 변수 등을 의미한다. 이 공유 자원을 두 개 이상의 프로세스가 동시에 읽거나 쓰는 상황을 경쟁 상태라고 한다.
임계 영역
임계 영역(Critical section)은 둘 이상의 프로세스, 스레드가 공유 자원에 접근할 때 순서 등의 이유로 결과가 달라질 수 있는 코드 영역을 말한다. 임계 영역에서 문제가 일어나지 않도록 하기 위해서 다음 세 가지 조건을 충족시켜 주어야 한다.
- 상호 배제(Mutual exclusion) - 하나의 프로세스가 임계 영역에 들어가 있다면 다른 프로세스는 들어갈 수 없어야 한다.
- 진행(Progress) - 임계 영역에 들어간 프로세스가 없는 상태에서 들어가려 하는 프로세스가 여러 개라면 어느 것이 들어갈지 결정 해주어야 한다.
- 한정 대기(Bounded waiting) - 다른 프로세스의 기아를 방지하기 위해, 한 번 임계 구역에 들어간 프로세스는 다음 번 임계 영역에 들어갈 때 제한을 두어야 한다.
임계 영역 문제를 해결하기 위한 방법은 크게 뮤텍스, 세마포어, 모니터 세 가지가 있다.
- 뮤텍스
뮤텍스(Mutex)는 프로세스나 스레드가 공유 자원을 lock()을 통해 잠금 설정하고, 사용한 후 unlock()을 통해 잠금을 해제하는 객체이다. 상태는 잠금과 잠금 해제만 존재하고, 잠금이 설정되면 다른 프로세스나 스레드는 잠긴 코드 영역에 접근할 수 없다.
- 세마포어
세마포어(Semaphore)는 wait()으로 자신의 차례가 올 때 까지 기다리도록 하고, signal()로 다음 프로세스에게 순서를 넘기는 방식으로 공유 자원에 대한 접근을 처리하는 방법이다. 프로세스가 공유 자원에 접근하면 세마포어에서 wait() 작업을 수행하고, 해제하면 signal() 작업을 수행한다.
종류로는 상태 값을 0과 1만을 가져 하나의 프로세스나 스레드만 접근 가능케 하는 바이너리 세마포어, 그 이상의 값을 가져 여러 자원에 대한 접근을 제어하는 데 사용하는 카운팅 세마포어가 있다.
- 모니터
모니터는 둘 이상의 스레드나 프로세스가 공유 자원에 안전하게 접근할 수 있도록 공유 자원을 숨기고 해당 접근에 대해 인터페이스만 제공하는 방식이다. 모니터는 모니터 큐를 통해 공유 자원에 대한 작업들을 순차적으로 처리한다.
교착 상태
교착 상태(deadlock)란, 두 개 이상의 프로세스들이 서로가 가진 자원이 해제되길 기다리며 실행이 중단된 상태를 말한다.
교착 상태가 되기 위한 조건은 네 가지로, 한 가지만 달성되지 않아도 교착 상태는 일어나지 않는다.
- 비선점 (Nonpreemptive) : 다른 프로세스의 자원을 뺏을 수 없음.
- 상호 배제(Mutual Exclusion) : 한 번에 한 프로세스만 공유 자원에 접근 가능하며, 접근 권한이 제한적일 경우.
- 순환 대기 (Circular wait) : 두 개 이상의 프로세스가 자원 접근을 기다릴 때, 관계가 순환적 구조.
- 점유 대기 (Hold & Wait) : 공유 자원에 대한 접근 권한을 가진 채로 다른 자원에 대한 접근 권한을 요구.
교착 상태를 해결하기 위한 방법은 다음과 같다
- 예방: 자원을 할당할 때 애초에 조건이 성립되지 않도록 설계한다.
- 회피: 안정 상태, 즉 교착 상태 가능성이 없을 때만 자원을 할당하며, 프로세스당 요청할 자원들의 최대치를 통해 자원 할당 가능 여부를 파악하는 ‘은행원 알고리즘’을 사용한다.
- 탐지: 교착 상태가 발생하면 사이클이 있는지 찾아보고, 이에 관련된 프로세스를 하나씩 지운다.
- 무시: 교착 상태는 드물게 일어나고 탐지하거나 예방하는 비용이 매우 크기 때문에, 이를 무시하고 특별한 조치를 취하지 않는 방법이다.
예상 질문
- 멀티 프로세싱과 멀티 스레딩의 차이점을 설명해주세요.
답변
1. 멀티 프로세싱과 멀티 스레딩 모두 여러 개의 작업을 동시에, 혹은 병렬로 처리할 수 있도록 해주는 것을 말합니다. 2. 멀티 프로세싱은 프로세스를 여러 개 생성해 작업을 처리하는 방법으로, * 하나의 프로세스가 죽어도 다른 프로세스에 영향을 끼치지 않고 계속 실행된다는 장점이 있지만, * 멀티 스레딩보다 많은 메모리 공간과 CPU 시간을 차지한다는 단점이 있습니다. 3. 멀티 스레딩은 하나의 프로세스 내에 여러 개의 스레드를 생성해 작업을 처리하는 방법으로, * 멀티 프로세싱보다 적은 메모리 공간을 차지하고 문맥 전환이 빠르다는 장점이 있지만, * 하나의 스레드에 문제가 생기면 전체 스레드가 영향을 받는다는 점과, 같은 자원을 공유하기 때문에 스레드 세이프 처리(임계 영역의 자원에 대한 동기화 처리)를 해주어야 한다는 단점이 있습니다.- 스레드 세이프가 무엇인지 설명해 주세요.
답변
스레드 세이프란, 임계 영역에 있는 자원이 여러 스레드로부터 동시 다발적인 접근이 일어나도 경쟁 상태가 발생하지 않고 프로그램이 의도대로 실행되는 것을 말합니다.- 경쟁 상태가 무엇인지 설명해 주세요.
답변
경쟁 상태는 두 개 이상의 프로세스나 스레드가 공유 자원을 동시에 읽거나 써, 프로그램이 의도된 대로 실행되지 않는 것을 의미합니다. 은행에 천원을 입금하는 작업 두 건이 동시에 발생하는 경우에, 원래라면 이천원이 추가되어야 하지만, 하나의 결과가 처리되기 전에 잔고를 읽어들임으로 둘 모두 천원을 추가한 결과를 저장하는 것입니다.- 임계 영역이 무엇인지 설명해 주세요.
답변
1. 임계 영역은 둘 이상의 프로세스 또는 스레드가 공유 자원에 접근할 때, 순서 등의 이유로 결과가 달라질 수 있는 코드 영역을 말합니다. 2. 임계 영역 문제를 예방하기 위해서는 세가지 조건을 만족시켜줘야 합니다. 3. 첫 번째 조건은 상호 배제로, 하나의 프로세스가 임계 영역에 들어가 있다면 다른 프로세스는 들어갈 수 없도록 해야 합니다. 4. 두 번째 조건은 진행으로, 임계 영역에 들어간 프로세스가 없는 상태에서 들어가려 하는 프로세스가 여러 개라면 어느 것이 먼저 들어갈지 결정 해주어야 합니다. 5. 세 번째 조건은 한정 대기로, 임계 구역에 들어갔던 프로세스는 다음 번 임계 영역에 들어갈 때 제한을 두어야 합니다.- 임계영역 문제를 해결하기 위한 방법에는 무엇이 있나요?
답변
* 대표적으로 뮤텍스, 세마포어, 모니터 세 가지 방식이 있습니다. 1. 뮤텍스는 * 동기화 할 자원이 하나일 때 사용하는 방법으로, * 임계 영역에 들어간 프로세스가 자원을 점유하며 lock()을 호출해 잠금을 걸고, unlock()을 호출해 자원을 해제하는 방식입니다. 2. 세마포어는 * 동기화 할 자원이 하나 이상일 때 사용할 수 있는 방법으로, * 임계 영역에 들어갈 때 wait()을 호출해 진입을 알려 진입 가능 숫자를 줄이고, 나올 때 signal()을 호출해 숫자를 다시 늘리는 방식입니다. * 진입 가능 숫자가 0 과 1로 이루어져 하나의 프로세스만 진입하게 하는 바이너리 세마포어, 그 이상의 숫자로 설정해 여러 프로세스가 진입할 수 있도록 하는 카운팅 세마포어가 있습니다. 3. 모니터는 * 프레임워크나 라이브러리 차원에서 제공하는 방법으로, * 공유 자원을 특정 인터페이스로만 진입할 수 있도록 하고, 진입을 큐로 관리해 순서대로 접근할 수 있도록 하는 방법입니다. * 자바는 이 방식을 사용하며, synchronized 키워드를 사용해 관리합니다.- 교착 상태가 무엇인지 설명해 주세요.
답변
교착 상태란, 두 개 이상의 프로세스들이 서로가 가진 자원이 해제되길 기다리며 실행이 중단된 상태를 말합니다.- 교착 상태의 조건에는 무엇이 있나요?
답변
* 교착 상태가 되기 위한 조건은 네 가지로, 그 중 한 가지만 달성되지 않아도 교착 상태는 일어나지 않습니다. 1. 첫 번째는 비선점으로, 다른 프로세스가 가진 자원을 뺏을 수 없다는 조건입니다. 2. 두 번째는 상호 배제로, 한 번에 한 프로세스만 공유 자원에 접근 가능하다는 조건입니다. 3. 세 번째는 순환 대기로, 두 개 이상의 프로세스가 자원 접근을 기다릴 때, 그 관계가 순환적인 구조로 되어 있다는 조건입니다. 4. 네 번째는 점유 대기로, 공유 자원에 대한 접근 권한을 가진 채로 다른 자원에 대한 접근 권한을 요구한다는 조건입니다.- 교착 상태는 어떻게 해결하나요?