운영체제의 프로세스의 가장 중요한 두가지는 스케줄링과 동기화이다.
동시다발적으로 실행되는 프로세스들은 공동의 목적을 올바르게 수행하기 위해 서로 협력하며 영향을 주고 받기도 한다. 이 과정에서의 자원의 일관성을 보장해야 한다.
공동의 목절을 위해 동시에 수행되는 프로세스
예시) 🎫 워드 프로세서 프로그램
- 맞춤법 검사 프로세스
- 입력 내용을 화면에 출력하는 프로세스..
프로세스들의 수행 시기를 맞추는 것이며 크게 두가지를 의미.
1. 실행 순서 제어 : 프로세스를 올바른 순서대로 실행하기
2. 상호 배제 : 동시에 접근해서는 안되는 자원에 하나의 프로세스만 접근하게 하기
당연하게 실행의 문맥을 갖는 모든 대상은 동기화의 대상 => 스레드 역시 동기화의 대상임.
Writer : BOOK.txt 파일에 값을 저장하는 프로세스
Reader : BOOK.txt 파일에 저장된 값을 읽어들이는 프로세스
📌 이 두 프로세스가 무작정 실행되어선 안된다.!
Reader프로세스는 Book.txt 안에 값이 존재한다 라는 특정 조건이 만족되어야만 실행 가능 .
그래서 동시에 실행되는 프로세스에 대해 올바른 순서대로 실행하는 것이 첫 번째 프로세스의 동기화 이다.
공유가 불가능한 자원의 동시 사용을 피하기 위해 사용되는 알고리즘
현재 계좌에 잔액 : 10만원
프로세스 A : 현재 잔액에 2만원을 추가하는 프로세스
프로세스 B : 현재 잔액에 5만원을 추가하는 프로세스
위 프로세스의 로직은 아래와 같다.
잔액을 읽어들이고 -> 잔액에 더하고 -> 더한 값을 저장한다.
만약 두 프로세스를 동시에 실행한다면 17만원이 남게 될까???
-> 그렇지 않다.
'잔액' 이라고 하는 자원에 동시에 접근을 해서 생기는 문제점이다. 그래서 접근에 대한 제한을 줘야한다.
물건을 계속해서 생산하는 생산자(producer, 프로세스 혹은 스레드)
물건을 계속해서 소비하는 소비자(consumer, 프로세스 혹은 스레드)
' 총 합 ' 이라고 하는 변수를 공유한다.
static int total = 10 ;
void producer() {
buffer.save(data) // 버퍼에 데이터 삽입
total++; // '총합' 변수 1 증가
}
void consumer() {
buffer.delete(data) // 버퍼에 데이터 빼내기
total--; // '총합' 변수 1 감소
}
이 상태에서 생산자를 10만번, 소비자를 10만번 실행하면 ' 총 합(total)'은?????? => 10이 나올 것이라 예상하지만.
동기화가 되지 않는다면 총합이 올바른 값이 나오지 않는다. => 총합(자원)에 동시헤 접근해서 발생하는 문제..
당연하게 동시에 접근하려고 한다면 문제가 발생하고 자원의 일관성이 깨진다. 이러한 문제를 레이스 컨디션(race conditon)이라고 한다.
그렇다면 레이스 컨디션이 생기는 근본적인 원인은 무엇인가??
고급언어(java, 파이선, c) => 저급언어로 변환하고 이를 실행하는 과정에서 문맥교환이 일어난다.
( 고급언어에서 코드 한줄이 저급언어에서는 여러줄로 변환된다. )
위와 같이 총합은 10을 예상햇으나 문맥교환이 발생하여 총합 9가 나올 수도 있다는 것이다.
상호 배제( mutual exclusion ) : 한 프로세스가 임계구역에 진입했다면 다른 프로세스는 임계구역에 들어올 수 없다.
진행( progress ) : 임계 구역에 어떤 프로세스도 진입하지 않았다면 임계 구역에 진입하고자 하는 프로세스는 들어갈 수 있어야 한다.
유한대기 ( bounded waiting) : 한 프로세스가 임계 구역에 진입하고 싶다면 그 프로세스는 언젠가는 임계 구역에 들어올 수 있어야 한다.(임계 구역에 들어오기위해 무한정 대기해서는 안된다.)
가치 있는 정보 공유해주셔서 감사합니다.