[SW_Jungle] 프로세스 동기화 & 상호배제

Jin Lee·2021년 12월 30일
0

PintOS

목록 보기
2/16
post-thumbnail

다중 프로그랭 시스템이란 여러개의 프로세스들이 존재 가능하고 프로세스들은 서로 독립적으로 동작한다. 이 작업은 동시에 이루어 질 수 있는데 이때 공유자원 또는 데이터가 있으면 문제 발생이 가능하다.

동기화

  • 프로세스들이 서로 동작을 맞추는것
  • 프로세스들이 서로 정보를 공유하는 것

비동기적 : 프로세스들이 서로에 대해 모름
병행적 : 여러개의 프로세스들이 동시에 시스템에 존재

병행 수행중인 비동기적(서로에 대해 모르는) 프로세스들이 공유자원에 동시 접근 할 때 문제가 발생할 수 있음

Terminologies

  • 공유데이터 : 여러 프로세스들이 공유하는 데이터
  • 임계영역 : 공유 데이터를 접근하는 코드 영역
  • 상호배제 : 둘 이상의 프로세스가 동시에 임계 영역에 진입하는 것을 막는것

기계어 명령의 특성 : 한 기계어 명령의 실행 도중에 인터럽트를 받지 않음

race condition : 실행 순서에 따라 결과가 달라 질 수 있는 경우
primitives : 어떤 목적을 이루기 위한 기본 연산

Mutual Exclusion Methods

  • mutual exclusion primitives
    • enterCS() : critical section 진입 전 검사, 다른 프로세스가 critical section 안에 있는지 검사
    • exitCS() : critical section 을 벗어날 때의 후처리 과정으로, critical section을 벗어남을 시스템에 알림
  • requirement for ME primitives
    • progress(진행) : cs 안에 있는 프로세스 외에는, 다른 프로세스가 cs에 진입하는것을 방해하면 안됨
    • bounded waiting(한정 대기) : 프로세스의 cs 진입은 유한시간 내 허용 되어야 함
    • mutual exclusion(상호배제) : critical section(cs) 에 프로세스가 있으면, 다른 프로세스의 진입을 금지

Mutual Exclusion solutions

  • SW solution
    • Dijkstra's algorithm
    • Dekker's algorithm
  • HW solution
    • TestAndSet(TAS) instruction : test와 set을 한번에 수행하는 기계어, 기계어이므로 실행중 interrupt를 받지 않아 preemption 되지 않음
  • OS supported SW solution
    • Spinlock : 초기화, P(), V() 연산으로만 접근 가능 해당연산들은 atomic 한 연산임을 OS가 보장해준다. 따라서 전체가 한 instruction cycle에 수행 됨 하지만 멀티 프로세서에서만 사용 가능한 단점이 있다. busy waiting 문제 여전히 있음
    • Semaphore : busy waiting 문제 해결, 임의의 S 변수 하나에 ready queue 하나가 할당 됨, wake-up 순서가 비 결정적이라는 단점이 있음(starvation problem)
    • Eventcount/sequencer : 은행의 번호표와 비슷한 개념, semaphore 보다 더 low-level control 가능
  • Language-Level solution
    • Monitor : 사용이 쉽고, deadlock 등 에러 발생 가능성이 낮으나, 지원하는 언어에서만 사용가능하고, 컴파일러가 OS를 이해하고 있어야한다.

Race Condition

두 개이상의 스레드가 하나의 자원을 놓고 서로 사용하려고 경쟁하는 상황, 스레드의 실행 순서를 잘 조절해주지 않았을 때 나오는 비정상적인 상태 항상 발생하는 것이 아니라 특정한 순서대로 실행되었을때 발생하며 디버깅 할 때 발견하기 어렵고 프로세스에 원하는 결과가 발생하는것을 보장할 수 없어서 주의해야 한다.

Race Condition 예방하기

semaphore : 공유된 자원의 데이터를 여러 프로세스가 접근하는 것을 막는 방법중 하나로 운영체제의 리소스를 경쟁적으로 사용하는 다중 프로세스에서 행동을 조정하거나 동기화 시키는 기술이다. 다시 말해서 하나의 스레드만 들어가게 할 수도 있고 여러 개의 스레드가 들어가게 할 수 있다. 이것이 뮤텍스와의 차이이다.

mutex : 공유된 자원의 데이터를 여러 스레드가 접근하는 것을 막는 방법이다. 즉, Critical Section(각 프로세스에서 공유 데이터를 엑세스하는 프로그램 코드 부분)을 가진 쓰레드들의 Running time이 서로 겹치지 않게 각각 단독으로 실행되게 하는 기술이다. 다중 프로세스들이 공유 리소스에 대한 접근을 조율하기 위해 locking과 unloking을 사용하는데, 다시 말해서 상호배제를 함으로써 두 쓰레드가 동시에 사용할 수 없다는 뜻이다.

semaphore

  • binary semaphore : s가 0과 1 두 종류의 값만 갖는 경우, 상호배제나 프로세스 동기화 목적으로 사용
  • counting semaphore : s가 0이상의 정수값을 가질 수 있는 경우, producer-cunsumer 문제 등을 해결하기 위해 사용

semaphore를 접근하는 연산자

  • 초기화 연산 : S 변수에 초기값을 부여하는 연산, S 는 물건 수로 생각할 수 있음
  • P() 연산 : S를 1 감소
  • V() 연산 : S를 1 증가

semaphore로 해결 가능한 동기화 문제들

  • 상호배제 문제
  • 프로세스 동기화 문제
  • 생산자-소비자 문제
  • reader-writer 문제
  • dining philosopher problem

ref)
1. https://www.youtube.com/watch?v=wdaf2gy83uU&list=PLBrGAFAIyf5rby7QylRc6JxU5lzQ9c4tN&index=12
2. https://www.youtube.com/watch?v=lY43KR3IItw&list=PLBrGAFAIyf5rby7QylRc6JxU5lzQ9c4tN&index=13
3. http://blog.skby.net/%EC%84%B8%EB%A7%88%ED%8F%AC%EC%96%B4-semaphore/

profile
깃허브 : https://github.com/jinlee9270

0개의 댓글