Sharing Resources
- Local 변수들은 절대 Thread 간에 공유될 수 없다.
- 지역 변수는 각 스레드의 독립적인 스택 공간에 저장
- 지역 변수의 포인터를 다른 스레드에 전달하거나 공유하면, 해당 스레드가 접근할 수 없는 메모리 공간을 참조하게 되어 문제 발생
- 공유가능 한 것들
- 전역변수
- Stored in static data segment, thread로도 접근가능
- 동적할당된 객체 (Dynamic objects)
Race Condition
- 동시성(Concurrency)으로 인해 프로그램 실행 결과가 비결정적(Non-deterministic)으로 나타날 수 있습니다.
- 동일한 입력 값이라도 실행 시점이나 동작 타이밍에 따라 결과가 달라질 수 있습니다.
- 여러 프로세스나 스레드가 공유 데이터를 동시에 접근하거나 수정하려고 하면, 데이터 일관성(Consistency)이 깨질 위험이 있습니다
- 데이터 일관성을 유지하기 위해, 프로세스나 스레드를 순차적으로 수행하게 하는 기법이 필요하다.
- Process 간의 동기화 (Process Synchronization)
- 동기화는 역설적으로 동시성을 해칠 수 있다.
- 동기화 문제는 소프트웨어적으로 처리해야한다.

Critical Section
- 여러 Process들이 Shared-Data에 접근하는 Code 영역
- 한 번에 오직 하나의 Process만이 진입해야한다.
- 가능한 Critical Section을 작게 잡아주는 것이 성능향상에 좋음
- Entry Section → Critical Section → Exit Section → Remainder Section
Critical Section 해결 조건
- Mutual Exclusiton (상호 배제)
- 동시에 둘 이상의 프로세스가 Critical Section에 진입하지 못하도록 보장
- Mutex 로 구현
- Progress (진행)
- Critical Section에 누가 먼저 들어갈지 정해야한다.
- Deadlock(교착상태)이 존재하면 안된다. (무기한 연기)
- Bounded Waiting (유한 대기)
- Critical Section에 진입하기 위해 기다리는 시간에 제한이 존재
- starvation(기아 상태) 를 방지해야함
Process 접근 제어 Algorithm
- Shared Variables
- int turn = 0;
- turn = 0 일 때 P0, 1일때 P1이 접근 가능