Process Synchronization[Opeation System]

SnowCat·2023년 1월 31일
0

CS - Operating System

목록 보기
3/6
post-thumbnail

동기화란?

  • 공동의 목적을 위해 동시에 수행되는 프로세스 사이에 자원의 일관성을 위해 수행 시기를 맞추는 것
  • 구체적으로는 프로세스를 올바른 순서대로 실행하기 위한 실행 순서 제어, 동시에 접근해서는 안되는 자원에 하나의 프로세스만 접근하게 하는 상호 배제 2가지를 의미함
    실행의 문맥을 갖는 모든 대상은 동기화 대상이기에 스레드도 동기화 대상이 됨

실행 순서 제어를 위한 동기화

  • 동일한 텍스트의 값을 읽어오는 Writer, Reader 프로세스가 있다 가정해보자
  • Reader는 텍스트가 존재한다는 조건이 만족되어야만 실행이 가능
  • 이렇게 선행 관계가 존재하는 프로세스간에는 실행 순서의 제어가 필요함

상호 배제 제어를 위한 동기화


  • Bank account problem, 생산자 소비자 문제 -> 프로세스간 동시 실행 결과로 의도하지 않은 자원의 변화 발생 가능
  • 따라서 이런 경우에 한 프로세스가 자원에 접근했다면 다른 프로세스는 대기하고 있어야함

공유 자원과 임계 구역

  • 공유 자원: 전역변수, 파일과 같이 여러 프로세스 혹은 스레드가 공유하는 자원
  • 임계 구역: 동시에 실행하면 문제가 발생하는 자원에 접근하는 코드 영역
  • 임계 구역에 진입하고자 한다면 진입한 프로세스 이외에는 대기해야 함
  • 임계 구역에 동시에 접근하면 자원의 일관성이 깨질 수 있게 되는데 이를 레이스 컨디션(race condition)이라고 함
  • 운영체제는 임계구역 문제를 해결하기 위해 상호 배제, 진행, 유한 대기의 3가지 원칙을 지켜야 함
    상호 배제(mutual exclusion): 한 프로세스가 임계 구역에 진입했다면 다른 프로세스는 들어올 수 없음
    진행(progress): 임계 구역에 어떠한 프로세스도 없으면 진입하고자 하는 프로세스는 들어갈 수 있어야 함
    유한 대기(bounded waiting): 한 프로세스가 임계 구역에 진입하고 싶다는 무한정 대기해서는 안되고 언젠가는 들어올 수 있어야 함

뮤텍스 락

  • 상호 배제를 위한 동기화 도구
  • 대략적으로 아래 코드와 같은 구조를 가짐
// 프로세스가 임계 구역에 진입하기 전에 acquire 함수가 호출
// 임계 구역이 잠겨 있다면 열릴 때 까지 임계구역을 반복적으로 확인
// 임계구역이 열려 있으면 임계 구역을 잠그고 작업을 하게 됨
acquire() {
	while (lock == true)
    ; // lock이 풀릴때까지 무한 반복
    lock = true;
}
/* works */
// 임계 구역에서의 작업이 끝나면 release 함수 호출
// release 함수는 lock을 열어줌
release() {
	lock = false
}
  • 반복적으로 확인하기 때문에 바쁜 대기(busy wating)가 생김 -> CPU cycle 낭비가 생김

세마포어

  • 뮤텍스 락이 하나의 공유자원이 있는 경우를 다루던 것에 비해 세마포어는 공유 자원이 여러개 있는 경우에도 적용 가능함
  • 임계 구역 앞에서 멈추는 신호를 받으면 잠시 기다리게 되고, 진행을 해도 좋다는 신호를 받으면 임계 구역에 진입하게 됨
  • 대략적으로 아래 코드와 같은 구조를 가짐
// wait함수는 임계 구역에 진입해도 좋은지를 알려줌
// 사용가능한 공유 자원의 개수는 S로 표현함
// S의 개수를 지속적으로 확인하다 프로세스를 1개이상 사용 가능하면 S를 1개 감소시키고 임계 구역 진입
wait() {
	while( S<= 0)
    ;
    S--;
}
/* works */
// 임계 구역에서 나올 때 사용가능한 프로세스는 1개 추가
signal() {
	S++
}
  • busy wating 방지를 위해 사용할 수 있는 자원이 없는 경우 프로세스를 대기 상태로 만들고, 자원이 생긴 경우에 대기 큐의 프로세스를 준비 상태로 만드는 방법을 사용함
  • 순서를 동기화 시킬 경우에 먼저 실행할 프로세스 뒤에 signal 함수를 붙이고, 다음에 실행할 프로세스 앞에 wait 함수를 붙이면 됨

모니터

  • 세마포어 사용시 실수를 하게되면 큰 문제가 발생하게 됨 -> 문제를 해결하기 위해 모니터를 사용함
  • 상호 배제를 위한 동기화 도구와 실행 순서 제어를 위한 동기화 도구를 모두 제공함
  • 상호 배제를 위한 동기화 도구로서는 인터페이스를 위한 큐를 제공 -> 공유자원에 접근하고자 하는 프로세스를 큐에 삽입해 공유 자원을 큐에 삽입된 순서되로 이용하게 됨
  • 실행 순서 제어를 위한 동기화로는 조건 변수를 이용해 프로세스나 스레드의 실행 순서를 제어하게 됨
    특정 프로세스가 실행될 조건이 되지 않으면 wait를 통해 실행을 중단하고, 특정 프로세스가 실행될 조건이 충족됬을 때에는 signal을 통해 실행을 재개함

https://www.youtube.com/watch?v=Jjfah3t_xWk&list=PLVsNizTWUw7FCS83JhC1vflK8OcLRG0Hl&index=35
혼자 공부하는 컴퓨터 구조+운영체제, 강민철, 한빛미디어

profile
냐아아아아아아아아앙

0개의 댓글