➡️ 프로세스가 (1) 공유자원(ex. cpu)에 접근하려고 할 때나, (2) 공유 데이터에 동시에 접근하려고 할 때
(여러 개의 프로세스들이 logical address space를 공유하면서 데이터에 접근하려고 할 때)
여러 프로세스가 독립적으로 동시 접근할 경우 데이터 불일치성 문제가 발생할 수 있다.
동기화 대상인 프로세스 간의 정보를 주고 받는 것을 동기화라고 한다. 따라서 서로 독립적으로만 움직이지 않는다.
기본적으로, 여러 프로세스들이 시스템 안에 동시에 존재한다.
기본적으로, 프로세스는 서로에 대한 정보를 갖고 있지 않고 독립적으로 움직인다.
참고
- Concurrency(병행성) : Multiple Processes use the processor alternatiely
여러 프로세스가 "한" 프로세서(cpu)를 번갈아 사용한다.
- Parellelism(병렬성) : Mutliple Processors in the system, Multiple processes simultaneously use them.
여러 프로세스가 "여러" 프로세서(cpu)들을 동시에 사용한다.
여러 프로세스들이 존재하면서, 같은 데이터를 동시에 번갈아 가면서 접근하고 조작한다.
프로세스의 접근 순서에 따라서 데이터 최종 결과가 달라진다면 'race condition'이라 한다.
따라서 race condition 문제를 해결해야 한다.
두 프로세스가 있을 때, memory에는 count 라는 변수가 있고 p1가 p2가 접근해야 한다고 생각해 보자.
p1은 count값을 1 증가시키고 p2도 count값을 1 증가시킨다.
그렇다면 결과값이 count = 2여야 정상이고, consistent한 것이다.
만약 p1이 cpu에서 위 과정을 모두 진행하고 나서 p2가 그 뒤에 위 과정을 진행한다면, 문제는 발생하지 않고 data consistency는 지켜진다.
그 때 p2가 실행되면, p2는 count=0을 레지스터에 가져오고, 위 연산을 실행하여 count = 1이 된다.
그리고 나서 다시 p1이 cpu를 사용하고 남은 (3)을 진행하면 count = 1이 된다.
새로운 노드 bp1을 linked list 사이에 끼워 놓기 위해서는 4가지 포인터 조정 필요하다.
📌 Machine Instruction Cycle
기계어 명령 하나를 실행하는 과정
1) 메모리에 가서 명령을 읽어오는 Instruction Fetch
2) 명령을 해독하는 Instruction Decode
3) 필요에 따라 operand를 fetch함(메모리 등에서 가져옴)
4) Execution 해당 명령을 실행함
5) 인터럽트 체크
1~4번의 단계에서 인터럽트가 들어올 수 있지만 그 1-4를 다 마치고 나서야 인터럽트를 검사하기 때문에, 하나의 기계어 명령이 끝난 후에야 인터럽트 여부를 알 수 있다. 즉 하나의 기계어 명령은 일단 실행되면 중간에 끝나지 않는다는 점에서 기계어 명령 하나는 atomic하며, 분리 불가능하고, 중간에 인터럽트를 받지 못한다. 그러나 기계어 명령들 사이사이에는 인터럽트 받을 수 있다. 이 때 Race Condtion 등의 문제가 발생한다.
두 개 이상의 프로세스들이 접근하고 공유하는 데이터
각 프로세스마다 공유 데이터에 접근하는, '각 프로세스의' 코드 영역
ex) count <- count + 1 ;
두 개 이상의 프로세스들이 같은 critical section에 들어가서 코드를 실행하지 못하도록 하는 것
예시 1에서, p1이 2번까지만 실행했는데 p2가 critical section에 들어가지 못하도록 하는 것
(1) enterCS() primitive
한 프로세스가 critical section에 들어오기 전에, enterCS를 수행하여 다른 프로세스가 critical section에 있는지 확인하는 것
다른 프로세스가 이미 있다면 대기한다.(2) exitCS() primitive
critical section을 다 수행하고 나갈 때, 다른 프로세스에게 내가 빠져나갔다는 것을 알리는 것
=> enterCS와 exitCS를 통틀어 'Mutual Exclusion Primitive'라고 한다.
(1) Mutual exclusion
두 개 이상의 프로세스가 Critical section에 동시에 진입하지 못한다.
(2) Progress
Critical section에 아무것도 없는데도 프로세스에 진입하지 못하는 것은 안 된다.
(3) Bounded waiting
어떤 프로세스는 critcal section에 계속 진입할 수 있는데 어떤 프로세스만 들어가지 못하는 경우 (starvation처럼) 는 발생하면 안된다.