병행 프로세서 1
1️⃣ 병행 프로세스의 개요
1-1. 병행성과 병행 프로세서
병행성은 여러 개의 프로세스 또는 쓰레드가 동시에 수행되는 시스템의 특성을 의미한다.
또한, 동시에 수행되는 여러 개의 프로세스 또는 쓰레드를 병행 프로세스라고 한다.
여러 개의 CPU, 즉 멀티프로세서 시스템에서 병행 프로세스가 실행되는 경우, 메무리 구조에 따라 실행되는 형태가 다시 차이가 있다.
강결합 시스템에서는 여러 CPU가 하나의 기억장치를 공유한다. 이 경우 하나의 운영체제가 모든 CPU와 시스템 하드웨어를 제어한다.
강결합 시스템에는 master/slave 환경이나 SMP(Symmetric MultiProcessing; 대칭구조)가 해당된다.
✅ 강결합 시스템 요점 정리
- 여러 CPU가 하나의 기억장치를 공유함
- 하나의 운영체제가 모든 CPU와 시스템 자원을 통합적으로 제어함
- 병행 프로세스 실행 시 공유 메모리를 통해 효율적인 협업 가능
- 대표적인 구조:
- Master/Slave 방식
- SMP (Symmetric MultiProcessing, 대칭 다중처리)
약결합 시스템에서는 2개 이상의 독립된 컴퓨터 시스템이 네트워크로 서로 연결된다. 각 시스템은 자신의 운영체제와 기억장치를 가지고 있으며, 독립적으로 운영되고 필요할 때 통신을 한다.
이 시스템은 통신선을 통해 서로 다른 시스템의 파일을 참조할 수 있으며, 때에 따라서는 각 시스템의 부하를 조절하기 위해 부하가 적은 시스템에 작업을 보낼 수도 있다.
시스템 간의 통신을 위해 메시지 전달이나 원격 프로시저 호출 방식(Remote Procedure Calls; PRC)을 사용한다.
약결합 시스템에는 클러스터 구조가 해당된다.
✅ 약결합 시스템 요점 정리
- 2개 이상의 독립된 컴퓨터 시스템이 네트워크로 연결되어 구성됨
- 각 시스템은 자체 운영체제와 기억장치를 가지고 독립적으로 동작함
- 필요 시 통신선을 통해 파일 참조 및 작업 전송 가능
- 부하 분산을 위해 작업을 다른 시스템에 위임할 수 있음
- 시스템 간 통신 방식:
- 메시지 전달(message passing)
- 원격 프로시저 호출(Remote Procedure Call; RPC)
- 대표적인 예: 클러스터 시스템
- 클러스터 구조 : 여러 대의 컴퓨터(노드)가 네트워크로 연결되어, 마치 하나의 시스템처럼 동작하도록 구성된 시스템 구조.
1-2. 프로세스 관의 관계
병행 프로세스는 프로세스 간의 관계에 따라 독립 프로세스일 수 도 있고, 협력 프로세스일 수 도 있다.
독립 프로세스란 수행 중인 다른 프로세스에 영향을 주지도 않고 받지도 않는 프로세스를 의미한다.
즉, 독립 프로세스는 자신이 사용하는 데이터를 다른 프로세스와 공유하지 않고, 또한 자신의 상태도 다른 프로세스와 공유하지 않는다.
독립 프로세스의 실행은 결정적(deterministic)이며 재생 가능하다. 즉 다른 프로세스의 영향을 받지 않기에 입력 데이터만 동일하면 실행결과는 항상 동일하다.
또한 독립 프로세스는 다른 프로세스와 무관하게 중단되거나 재시작될 수 있다.
✅ 독립 프로세스 요점 정리
- 다른 프로세스에 영향을 주지도, 받지도 않는 프로세스
- 데이터와 상태를 공유하지 않음
- 실행은 결정적(deterministic)이며, 입력이 같으면 결과도 항상 동일
- 다른 프로세스와 상관없이 중단·재시작 가능
협력 프로세스란 수행 중인 다른 프로세스와 영향을 주고 받으며 동작하는 프로세스를 의미한다.
즉, 협력 프로세서는 다른 프로세스와 데이터를 공유하며, 또한 자신의 상태도 다른 프로세스와 공유한다.
협력 프로세스의 실행은 비결정적(nondeterministic)이며 재생 불가능하다. 즉, 다른 프로세스의 영향을 받을 수 있기에 입력 데이터가 동일하더라도 실행결과는 달라질 수 있다.
예를 들어, 두 사람이 하나의 계좌를 이용하여 돈을 입금하거나 출금하는 경우를 가정하고,
계좌의 잔고가 10,000일 때, 한 사람은 프로세스 A를 통해 5,000원을 입금하려 하고 동시에 다른 사람은 프로세스 B를 통해 15,000원을 출금하려 한다.
프로세스 B가 출금을 위해 잔고를 확인하려는 때까지 만약 프로세스 A가 입금을 마쳤다면 잔고가 15,000원 이므로 프로세스 B는 출금을 진행하겠지만,
프로세스 A가 입금을 마치지 못했다면 프로세스 B는 잔고가 부족해서 출금이 불가하다는 결과를 내게 된다.
✅ 협력 프로세스 요점 정리
- 다른 프로세스와 데이터 및 상태를 공유하며 상호작용하는 프로세스
- 실행은 비결정적(nondeterministic)이며, 입력이 같아도 결과가 달라질 수 있음
- 다른 프로세스의 실행 순서나 타이밍에 따라 결과가 달라짐
- 예: 여러 프로세스가 동시에 같은 계좌를 조작하는 상황
2️⃣ 병행성 문제
협력 프로세는 병행성과 관련한 다양한 문제가 발생할 수 있다. 관련 문제를 확인해보자.
2-1. 상호 배제
상호배제는 2개 이상의 프로세스가 동시에 임계영역을 수행하지 못하도록 하는 것이다.
임계영역이란 2개 이상의 프로세스가 동시에 사용하면 안되는 공유자원을 액세스하는 프로그램 코드 영역을 의미한다.
예를 들어, 동일한 계좌에 두 사람이 동시에 입금한다고 가정해보자. 계좌의 잔고는 10,000이고, 한 사람은 프로세스 A를 통해 5,000원을 입금하려 하고
다른 사람은 프로세스 B를 통해 8,000원을 입금하려 한다. 각 프로세스의 수행과정은 계좌의 잔고를 읽고, 거기에 입금액만큼을 더한 후, 더해진 액수를 계좌에 쓰는 것이다.
정상적으로 완료된다면 잔고는 23,000원이 될 것이다.
우선 프로세스 A는 계좌에서 잔고 10,000원을 읽고 5,000원을 더해 15,000원을 다시 계좌의 잔고로 쓰려고한다.
그런데 프로세스 A가 15,000원을 계좌의 잔고로 쓰기 전에 프로세스 B가 잔고 10,000원을 읽고, 그 후 프로세스 A에 의해 계좌의 잔고가 15,000원이 된다.
이후 프로세스 B는 자신이 읽은 잔고 10,000원에 8,000원을 더해 18,000원을 다시 계좌의 잔고로 쓴다. 이 경우 최종 잔고는 18,000원이 된다.
이와 같이 잔고가 틀리게 되는 이유는 두 프로세스가 공유하는 계좌에 대한 점유관계를 명확하게 처리하지 못했기 때문이다.
만약 프로세스 A가 먼저 잔고 10,000원을 읽었다면, 프로세스 A가 5,000 입금을 완료하여 잔고가 15,000원이 된 후 프로세스 B가 새로운 잔고 15,000원을 읽어야 문제가 발생하지 않을 것이다.
즉, 계좌의 잔고를 읽고 입금액을 더한 후 더해진 액수를 계좌에 쓰는 일련의 입금과정에 해당하는 코드가 하나의 임계영역이 되고, 한 프로세스가 임계영역에 해당하는 입금과정을 수행중이라면
다른 프로세스가 입금과정을 수행하지 못하도록 하는 것이 바로 상호 배제이다.
2-2. 동기화
프로세스 동기화는 2개 이상의 프로세스에 대한 처리 순서를 결정하는 것이다.
예를 들어, 프로세스 A가 어떤 작업을 처리한 후에 프로세스 B가 이어서 처리해야 하는 코드가 있다면,
프로세스 B는 프로세스 A가 해당 작업의 처리를 마칠 때까지 특정 코드를 수행하지 않고 기다리도록 하는 것이 동기화이다.
예를 들어, 한 계좌에서 다른 계좌로 10,000원을 송금한다고 가정해보자.
프로세스 A는 출금을 담당하고 프로세스 B는 입금을 담당할 때, 프로세스 A가 10,000원 출금을 처리한 후에 프로세스 B가 이어서 10,000원 입금을 처리하도록 동기화가 필요하다.
2-3. 세마포어
세마포어는 상호배제와 동기화 문제를 해결하기 위해 데이크스트라가 제안한 도구이다.
우선, 세마포어를 정의한 후 상호 배제와 동기화 문제를 해결하는 방법을 살펴보자.
세마포어 s는 정수형 공용변수로, 사용 가능한 자원의 수 또는 잠김이나 풀림의 상태를 값으로 갖는다. 그래서 처음 세마포어 s를 선언할 때 상황에 맞는 값(0 이상인 정수)으로 초기화한다.
이후 세마포어 s는 2개의 기본연산 P와 V에 의해서만 사용될 수 있다. 즉, 연산 P와 V를 통하지 않고는 세마포어 s의 값을 확인하거나 수정할 수 없다.
→ 세마포어는 병행 프로세서2에 자세히 요약해놓았다.
세마포어는 상호배제와 동기화 문제를 해결하기 위한 정수형 공용 변수로, 2개의 기본 연산 P와 V에 의해서만 사용될 수 있다.
처음 세마포어 s를 선언할 때 상황에 맞는 값(0이상인 정수)로 초기화한다.
💪 내용 요약
- 병행성은 여러개의 프로세스 또는 쓰레드가 동시에 수행되는 시스템의 특성을 의미하고, 동시에 수행되는 여러 개의 프로세스 또는 쓰레드를 병행 프로세스라고한다.
- 병행 프로세스는 프로세스 간의 관계에 따라 독립 프로세스 또는 협력 프로세스이다.
- 협력 프로세스는 병행성과 관련하여 상호배제, 동기화, 통신과 관련한 다양한 문제가 발생할 수 있다.
- 임계영역은 2개 이상의 프로세스가 동시에 사용하면 안되는 공유자원을 액세스하는 프로그램 코드 영역을 의미한다.
- 상호배제는 2개 이상의 프로세스가 동시에 임계영역을 수행하지 못하도록 하는 것이다.
- 동기화는 2개 이상의 프로세스에 대한 처리순서를 결정하는 것이다.
- 세마포어는 상호배제와 동기화 문제를 해결하기 위한 정수형 공용 변수로, 2개의 기본 연산 P와 V에 의해서만 사용될 수 있다.