Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

하루에 하나씩

[06] 동기화 본문

컴퓨터 구조

[06] 동기화

BGK97 2024. 4. 17. 17:48

동기화

  • 협력하여 실행되는 프로세스들은 실행 순서 및 자원의 일관성을 보장해야함
  • 동기화 필요

동기화의 의미

  • 프로세스는 동시다발적으로 실행되며 서로 데이터를 주고받으면서 협력하여 실행
  • 사전적인 의미
    • 정보 통신 분야에서 동기화란, 작업들 사이의 수행 시기를 맞추는 것
  • 프로세스 동기화
    • 프로세스들 사이의 수행시기를 맞추는 것
    • 다음의 두 종류가 있음
      • 실행 순서 제어 : 프로세스를 올바른 순서대로 실행하기
      • 상호 배제 : 동시에 접근해서는 안되는 자원에 하나의 프로세스만 접근하게 하기
    • 프로세스 뿐 아니라 스레드도 동기화 대상
      • 실행의 흐름을 갖는 모든 것이 동기화 대상임
  • 실행 순서 제어를 위한 동기화
    • 예를 들어, Writer 프로세스와 Reader 프로세스가 있다고 하면, Reader 프로세스는 Writer 프로세스가 끝나야만 실행이 가능
    • 이를 올바르게 제어하기위해 동기화가 필요
  • 상호 배제를 위한 동기화
    • 상호 배제란, 공유가 불가능한 자원의 동시사용을 피하기 위해 사용하는 알고리즘
    • 예시로, 계좌에 돈을 넣는 기능이 있음
    • 어느 한 기능이 끝났을 때, 저장을 한 상태로 다음 프로세스로 넘어가야 함

생산자와 소비자 문제

  • 생산자와 소비자 문제란, 생산(+)과 소비(-)가 동기화가 제대로 되지 않았을 때, 초기의 값이 기대한 대로 나타나지 않는 문제
  • 이때 생산자와 소비자는 동시에 실행되는 스레드가 될 수도 있음
  • 동기화가 필요한 이유
    • 각 작업이 끝나기도 전에 총합을 수정해서 엉뚱한 결과가 발생

공유 자원과 임계 구역

  • 공유 자원
    • 전역 변수, 파일, 입출력 장치 보조기억장치 등 동시에 실행될 수 있는 자원
  • 임계 구역
    • 동시에 실행하면 문제가 발생하는 자원에 접근하는 코드 영역

  • 임계 구역의 경우, 두 개 이상의 프로세스가 동시에 실행되면 안되는 영역이나 잘못된 실행으로 인하여 프로세스가 동시 다발적으로 임계 구역의 코드를 실행하여 문제가 발생하는 경우가 있음
  • 이를 레이스 컨디션이라고 함
    • 발생 시, 데이터의 일관성이 무너짐

운영 체제의 임계 구역 문제를 해결하는 세가지 원칙

  • 상호 배제
    • 한 프로세스가 임계구역에 진입한 경우, 다른 프로세스는 임계구역에 못 들어옴
  • 진행
    • 임계 구역에 어떤 프로세스도 진입하지 않았다면, 어느 프로세스라도 임계 구역에 진입하고자 하면 임계구역에 들어갈 수 있음
  • 유한 대기
    • 프로세스가 임계 구역에 진입하고 싶다면 프로세스는 언젠간 임계 구역에 들어올 수 있어야 함

동기화 기법

뮤텍스 락

  • 옷가게에서 탈의실을 이용하는 것과 비슷
  • 이 때 손님이 프로세스, 탈의실은 임계 구역
  • 자물쇠가 걸려있으면 손님은 탈의실에 못들어감!
  • 이때 뮤텍스 락(Mutex lock)은, 임계구역과 프로세스 사이에서 동시 접근을 막는 역할을 함
  • 뮤텍스 락은 단순한 형태로 하나의 전역 변수와 두 개의 함수로 구현 가능
    • 자물쇠 역할 : 프로세스들이 공유하는 전역 변수 lock
    • 임계 구역을 잠그는 역할 : acquire 함수
    • 임계 구역 잠금을 해제하는 역할 : release 함수
  • acquire 함수
    • 프로세스가 임계구역에 진입하기 전에 호출
    • 임계 구역이 잠겨있으면, 지속적으로 확인하여 만약 열려있다면 잠그는 함수
  • release 함수
    • 임계구역의 작업이 끝나고 호출하는 함수
    • 현재 잠긴 임계 구역을 열어주는 역할
acquire(){
	while (lock == true) //임계 구역이 잠겨있다면
    	;  //반복 확인
    lock = true; //임계가 열려있으면 잠금
}

release() {
	lock = false; //임계 작업 끝나면 잠금해제
}
  • 이렇게 구현하면 하나의 프로세스만 임계구역에 진입 가능
  • 생산자 소비자 문제도 해결!
  • 이 때 while문에서, 지속적으로 반복하여 확인하는 것을 '바쁜 대기' 라고 함

세마포

  • 뮤텍스 락과 비슷하나 조금 더 일반화된 방식의 동기화 도구
  • 뮤텍스 락의 경우, 임계 구역이 하나일 때의 방식
  • 여러개 있다면, 각 임계 구역에는 하나만 들어갈지라도 들어간 여러개의 프로세스는 각각 공유자원에 접근이 되어야 함
  • 이진 세마포와 카운팅 세마포가 있으나 여기서는 카운팅 세마포를 지칭함
  • 뮤텍스락과 비슷하게 하나의 변수와 두 개의 함수로 구현 가능
    • 임계 구역에 진입 가능한 프로세스의 개수(사용 가능 공유 자원 수) S
    • 임계 구역에 가도 되는지, 아닌지 알려주는 함수 wait
    • 이제 가도 된다 라는 Go 신호를 보내주는 signal 함수
  • 임계구역에 진입 전후로, wait과 signal 함수를 호출
wait(){
	while(S <= 0) //임계구역에 진입가능한 프로세스가 0이하면
    ;	//사용할수 있는 자원이 있는지 반복 확인
    S--; //임계 구역에 진입 가능한 프로세스 개수가 하나 이상이면, 진입
}

signal(){
	S++; //임계구역 작업을 마친 뒤 S를 1 증가
}
  • 이 때, 사용가능한 자원이 없는 경우, wait에서 무한정 반복하여 끝낼 때 까지 기다려야 함
  • CPU 주기를 낭비하게 됨
  • 이런 이유로 뮤텍스 락과 다르게 세마포는 좋은 방법을 사용하는데
    • wait함수에서 사용할 자원이 없는 경우 해당 프로세스를 대기 상태로 만들어 PCB를 세마포를 위한 대기 큐에 집어 넣음
    • 이후 작업이 끝나면 큐에서 빼내 signal 함수로 준비중인 상태로 옮겨줌
wait(){
	S--;
    if(S < 0){
    	add this process to Queue;
        sleep();
    }
}

signal(){
	S++;
    if(S <= 0){
    	remove a process p from Queue;
        wakeup(p);
    }
}
  • 두 언어 모두 많은 프로그래밍 언어에서 제공...

모니터

  • 세마포에서 wait이나 signal 위치를 헷갈린 경우, 누락시키는 경우 문제가 생길 수 있음
  • 또한, 일일이 wait signal을 작성해야 하기 때문에 불편함
  • 이러한 불편함을 개선하기 위해 모니터라는 동기화 도구가 등장
  • 모니터를 통해 공유 자원에 접근하려는 프로세스를 큐에 삽입하고 큐에 삽입된 순서대로 하나씩 공유 자원 이용
  • 모니터 안에는 항상 프로세스 하나만 들어갈 수 있음(상호 배제)
  • 이외에도 실행 순서제어를 위한 동기화도 제공
    • 조건 변수를 사용하여 프로세스를 일시 중단하고 다른 프로세스를 불러들임
    • 조건 변수란, 실행 순서 제어를 위해 사용하는 특별한 변수
      • 모니터와 조건변수는 별개의 개념임 혼동 XXXX
  • 조건 변수로는 wait과 signal 연산을 수행 가능
    • 다른점으로, 상호 배제를 위한 큐와 조건 변수에 대한 프로세스를 저장하는 큐는 다름
      • 상호 배제를 위한 큐는 한번에 하나의 프로세스만 진입 가능하도록 하는 큐
      • 조건변수 관련 큐는 이미 진입한 프로세스의 실행 조건이 만족될 때 까지 중단된 프로세스를 저장하는 큐

방식은 다음과 같음

  1. 특정 프로세스가 아직 실행될 조건이 되지 않았을 경우 wait을 통해 실행을 중단
  2. 특정 프로세스가 실행될 조건이 충족되었을 시 signal을 통해 실행 재개

'컴퓨터 구조' 카테고리의 다른 글

[08]가상 메모리  (0) 2024.05.08
[07] 교착 상태 - Dead Lock  (0) 2024.04.30
[05] CPU 스케줄링  (1) 2024.04.17
[04] 운영체제 - 프로세스와 스레드  (0) 2024.03.27
[03] 운영 체제  (0) 2024.03.27