[CS] 운영체제 - 프로세스 동기화

이상혁·2023년 9월 20일
0

Computer science

목록 보기
12/15
혼자 공부하는 컴퓨터 구조 + 운영체제를 읽고 공부한 내용입니다.

동기화란

실행 중인 여러 프로세스들을 실행 순서와 자원의 일관성을 보장하는 것을 동기화라고 한다.

동기화의 의미

프로세스 동기화는 프로세스들 사이의 수행 시기를 맞추는 것을 의미한다.
수행 시기를 맞춘다는 것은 2가지를 의미하는데
실행 순서 제어상호 배제를 의미한다.

실행 순서 제어는 프로세스를 올바른 순서대로 실행하는 것이며
상호 배제는 동시에 접근해서는 안 되는 자원에 하나의 프로세스만 접근하게 하는 것이다.

실행 순서 제어는 만약 책을 쓰는 프로세스와 책을 읽는 프로세스가 있다.
이 두 프로세스는 무작정 아무 순서 없이 실행이 되서는 안 된다.
먼저, 책을 쓰는 프로세스가 실행이 되고 책을 읽는 프로세스가 실행이 되어야 한다.
이렇게 프로세스가 올바른 실행 순서로 실행이 되어야 하는 것이 동기화가 되는 것이다.

상호 배제는 공유가 불가능한 자원의 동시 사용을 피하기 위해서 사용하는 알고리즘이다.
만약, 통장의 잔액이 5만원이 있을 때, 잔액에서 2만원을 더하는 A프로세스와 4만원을 더하는 B프로세스가 있다.
이 A, B프로세스가 동시에 실행이 된다면 값이 11만원이 되어야 하는데 동기화가 제대로 이루어지지 않으면 값이 엉뚱하게 나올 수 있다.

과정을 살펴보면
프로세스 A가 잔액을 가지고 오고 2만원을 더한다.
그리고 문맥교환이 일어나서
프로세스 B가 잔액을 가지고 오고 4만원을 더한다.
다시 문맥 교환이 일어나고
프로세스 A가 자신이 더했던 값을 저장을 한다.
이 때, 더했던 값은 7만원이고 잔액에 7만원이 저장이 된다.
프로세스 B도 자신이 더했던 값을 저장을 한다.
그런데 프로세스 B가 잔액을 불러왔을 때는 7만원이 저장 되기 전이기 때문에 더한 값으로 9만원이 나오고
이 값을 저장하면 잔액은 9만원이 된다.

이렇게 동기화가 제대로 되지 않으면 원하는 값을 얻을 수 없다.
그래서 상호배제를 위한 동기화는 동시에 접근을 하면 안 되는 값을 막아주는 동기화이다.

공유 자원과 임계 구역

공유 자원은 동시에 실행이 되는 프로세스들이 공동으로 사용하는 자원이다.
그리고 동시에 접근을 하면 문제가 생기는 자원, 즉 공유 자원에 접근을 하려는 코드 영역을 임계 구역이라고 한다.

임계 구역은 2개 이상의 프로세스가 접근을 하면 안 되지만 잘못 된 접근으로 프로세스들이 동시에 접근을 해서 코드를 실행하려고 해서 문제가 생기는 경우를 레이스 컨디션이라고 한다.

상호 배제를 위한 동기화가 레이스 컨디션이 일어나지 않도록 하는 동기화인 것이다.
운영체제는 상호 배제를 위한 동기화를 위해서 상호배제, 진행, 유한 대기 이 3가지의 원칙을 지켜야 한다.

상호배제는 한 프로세스가 임계 구역에 들어왔다면 다른 프로세스는 들어올 수 없는 것이다.
진행은 임계 구역에 어떠한 프로세스도 들어가 있지 않다면 임계 구역에 들어가고자 하는 프로세스는 들어갈 수 있어야 한다.
유한 대기는 한 프로세스가 임계 구역에 들어가고자 한다면 언젠가는 임계 구역에들어가야 한다. 즉, 무한 대기를 해서는 안 된다.

동기화 기법

동기화를 위한 도구는 3가지가 있는데, 뮤텍스 락, 세마포, 모니터이다.

뮤텍스 락

뮤텍스 락은 공유 자원에 동시에 접근하지 않도록 만드는 도구이다.
즉, 상호 배제를 위한 동기화 도구이다.

임계 구역에 진입한 프로세스가 뮤텍스 락을 이용해서 자물쇠를 걸어 주어 임계 구역에 있음을 알리고 다른 프로세스는 기다리거나 잠겨 있지 않으면 임계 구역에 들어갈 수 있다.

뮤텍스 락은 전역 변수 하나와 두 개의 함수로 이루어져 있다.
전역 변수 lock자물쇠 역할을,
acquire 함수임계 구역을 잠그는 역할을,
release 함수임계구역의 잠금을 해제하는 역할을 한다.

acquire 함수는 프로세스가 임계 구역에 들어가기 전에 실행하는 함수이다.
자물쇠 역할을 하는 lock 변수가 true 즉, 잠겨 있다면 lock이 false가 될 때까지 반복적으로 확인을 한다.
만약 임계 구역이 열려 있다면 프로세스가 접근하고 lock 변수를 잠그는 역할을 한다.

release 함수는 임계 구역에서의 작업이 끝나고 실행이 되는 함수이다.
잠긴 임계 구역을 열어주는 역할을 한다.

acquire() // 임계 구역 들어가기 전
작업
release() // 작업이 끝난 후

만약,임계 구역이 잠겨 있다면 프로세스는 계속해서 임계 구역이 잠겨 있는지 반복하며 확인을 하면서 대기를 하는데 이를 바쁜 대기라고 한다.

세마포

세마포는 공유 자원이 여러개 일 때 사용 가능한 동기화 도구이다.

세마포도 1개의 전역 변수, 두 개의 함수로 이루어져 있다.
전역 변수 S는 임계 구역에 진입할 수 있는 프로세스의 수를 의미하고
wait 함수는 임계 구역에 들어가도 좋을 지, 기다려야 할 지 알려주는 함수이고
signal 함수는 임계 구역 앞에서 기다리는 프로세스에게 가도 좋다고 알려주는 함수이다.

세마포도 마찬가지로 시작 전에 wait(), 끝나고 signal()를 실행 한다.

wait() // 임계 구역 들어가기 전
작업
signal() // 작업이 끝난 후

wait()를 살펴 보면

wait () {
	while (S <= 0)
    ;
    S--

}

만일 임계 구역에서 쓸 수 있는 자원의 수 S가 0개라면
사용할 수 있는 자원이 생길 때까지 확인하고
S가 1개 이상이면 S의 수를 감소 시킨다.

signal()를 살펴보면

signal () {
	S++
}

임게 구역에서 작업을 마친 뒤 S++를 통해서 갯수를 올려준다.

사용할 수 있는 공유 자원이 없다면 프로세스는 무작정 무한히 반복하면서 S의 갯수를 확인한다.
이를 바쁜 대기라고 하는데 이렇게 되면 CPU는 바쁜 대기를 하는 시간에 더 생산적인 일을 할 수 있기 때문에 바쁜 대기는 CPU주기를 낭비한다.

그래서 사용할 수 있는 자원이 없는 경우
해당 프로세스를 대가 상태로 만들고 그 프로세의 PCB를 세마포를 위한 대기 큐에 넣는다.
그리고 사용할 수 있는 자원이 나타나면 signal함수가 프로세스를 대기큐에서 제거하고 프로세스 상태를 준비 상태로 변경하고 준비 큐로 옮긴다.

모니터

모니터는 공유 자원과 공유 자원에 접근하기 위한 인터페이스를 묶어서 관리한다.
이 때, 인터페이스는 통로를 의미한다.
프로세스는 반드시 이 인터페이스, 통로를 통해서만 공유 자원에 접근을 할 수 있다.

모니터는 공유 자원을 다루는 인터페이스에 접근하기 위한 큐를 만들고 모니터 안에는 항상 하나의 프로세스만 들어오도록 관리한다.

profile
개발 공부 하기 위해 만든 블로그

0개의 댓글