CH12) 프로세스 동기화 - 1

Jobmania·2023년 7월 19일
0

운영체제

목록 보기
7/13
post-thumbnail

12-01) 동기화란?

운영체제의 프로세스의 가장 중요한 두가지는 스케줄링과 동기화이다.

동시다발적으로 실행되는 프로세스들은 공동의 목적을 올바르게 수행하기 위해 서로 협력하며 영향을 주고 받기도 한다. 이 과정에서의 자원의 일관성을 보장해야 한다.

1. 동기화의 의미

공동의 목절을 위해 동시에 수행되는 프로세스

예시) 🎫 워드 프로세서 프로그램

  • 맞춤법 검사 프로세스
  • 입력 내용을 화면에 출력하는 프로세스..

(프로세스) 동기화란?

프로세스들의 수행 시기를 맞추는 것이며 크게 두가지를 의미.
1. 실행 순서 제어 : 프로세스를 올바른 순서대로 실행하기
2. 상호 배제 : 동시에 접근해서는 안되는 자원에 하나의 프로세스만 접근하게 하기

당연하게 실행의 문맥을 갖는 모든 대상은 동기화의 대상 => 스레드 역시 동기화의 대상임.

1. 실행 순서 제어를 위한 동기화( reader writer problem )

Writer : BOOK.txt 파일에 값을 저장하는 프로세스
Reader : BOOK.txt 파일에 저장된 값을 읽어들이는 프로세스

📌 이 두 프로세스가 무작정 실행되어선 안된다.!
Reader프로세스는 Book.txt 안에 값이 존재한다 라는 특정 조건이 만족되어야만 실행 가능 .

그래서 동시에 실행되는 프로세스에 대해 올바른 순서대로 실행하는 것이 첫 번째 프로세스의 동기화 이다.

2. 상호 배제를 위한 동기화( Bank account problem )

공유가 불가능한 자원의 동시 사용을 피하기 위해 사용되는 알고리즘

현재 계좌에 잔액 : 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가 나올 수도 있다는 것이다.

운영체제가 임계구역 문제를 해결하는 세가지 원칙(상호 배제를 위한 동기화를 위한 3가지 원칙)

  1. 상호 배제( mutual exclusion ) : 한 프로세스가 임계구역에 진입했다면 다른 프로세스는 임계구역에 들어올 수 없다.

  2. 진행( progress ) : 임계 구역에 어떤 프로세스도 진입하지 않았다면 임계 구역에 진입하고자 하는 프로세스는 들어갈 수 있어야 한다.

  3. 유한대기 ( bounded waiting) : 한 프로세스가 임계 구역에 진입하고 싶다면 그 프로세스는 언젠가는 임계 구역에 들어올 수 있어야 한다.(임계 구역에 들어오기위해 무한정 대기해서는 안된다.)

profile
HelloWorld에서 RealWorld로

1개의 댓글

comment-user-thumbnail
2023년 7월 19일

가치 있는 정보 공유해주셔서 감사합니다.

답글 달기