[운영체제]Sync vs Async

yellong·2020년 6월 8일
0

Tech-Interview

목록 보기
8/14

동기와 비동기란?

  • 비유를 들어 설명하자면, 해야할 task가 빨래, 설거지, 청소가 있다고 하자.
  • 동기적으로 처리하는 것은 빨래를 끝낸 후 설거지를, 설저기즐 끝낸 후 청소를 하는 것을 의미한다. - 비동기적으로 처리하는 것은 빨래는 빨래 대행 업체에, 설거지는 설거지 대행 업체에, 청소는 청소 대행 업체에 맡겨 놓고, 각자 처리가 완료되면 연락을 주는 것이다. 이 때, 백그라운드 스레드에서 task를 처리하는 것을 비동기라고 한다.
  • 동기 프로그래밍은 메소드를 실행시킴과 동시에 반환 값이 기대되는 경우이다. 이는 메소드가 실행되었을 때, 값이 반환되기 전까지는 blocking 되어있다는 것이다.
  • 비동기 프로그래밍은 동기 프로그래밍과 달리 메소드를 실행시키면, 해당 task를 이벤트 큐에 넣거나 백그라운드 스레드에게 위임하고, 바로 다음 코드를 실행하기 때문에, blocking 되어 있지 않다.

임계 영역(Critical Section)

  • 공유하는 자원을 접근하도록 하는 코드 부분을 임계 영역이라고 한다.
  • 멀티 스레딩에서 설명한 것과 같이, 이 영역에 동시에 접근하게 될 경우 문제가 생긴다.

임계 영역 문제 해결을 위한 기본 조건

  • Mutual Exclusion(상호 배제)
    • P1이 Critical Section에서 실행 중이라면, 다른 Process들은 Critical Section에서 실행될 수 없다.
  • Progress(진행)
    • Critical Section에 진행중인 별도의 프로세스가 없고, 현재 별도의 동작이 없는 Process들만 Critical Section 진입 후보로 선정될 수 있다.
  • Bounded Waitiong(한정된 대기)
    • Critical Section에 진입 신청 후 받아들여지기 전까지, 다른 Process들이 Critical Section에 진입하는 횟수는 제한적이다.

임계 영역 해결책

Lock

  • 하드웨어 기반 해결책입니다.
  • 임계 영역을 Lock으로 보호하는 것입니다.(CPU, 하드웨어 수준에서 Lock을 겁니다.)
    • Lock을 획득한 프로세스만 임계 영역으로 진입 허용이 됩니다.
    • 잠겨 있지 않다면, Lock을 잠그고 임계 영역에 진입하게 됩니다.
  • Critical Section에 진입하는 프로세스는 Lock을 획득하며, Critical Section을 빠져나올 때 Unlock함으로써, 동시 접근을 막는 것입니다.
  • 이는 다중처리기 환경에서는 시간적인 효율성 측면에서 적용할 수 없습니다.

Semaphore

  • 이는 SW상에서 Critical Section 문제를 해결하기 위한 도구입니다.
  • 프로세스의 동기화 기법으로 공유된 자원의 여러 프로세스가 동시에 접근하는 것을 막는 것입니다.
  • Counting Semaphore
    • 현재 공유 자원에 접근할 수 있는 스레드 또는 프로세스의 수를 나타내는 값을 두어 상호 배제를 달성하는 기법입니다.
    • 자원을 사용하면 세마포어가 감소하고, 방출하면 세마포어의 개수가 늘어납니다.
    • 세마포어의 변수만큼의 프로세스 또는 스레드가 접근할 수 있습니다.
    • 현재 수행중인 프로세스가 아닌 다른 프로세스가 세마포어를 해제할 수 있습니다.
    • 일반적으로 비교적 긴 시간을 확보하는 리소스에 대해 이용합니다.
  • Binary Semaphore
    • 0과 1의 값을 가지는 플래그를 사용합니다.
    • MUTEX라고도 불리며, Mutual Exclusion의 줄인말입니다.
    • 다중 프로세스들 사이에서의 Critical Section 문제를 해결하기 위해 사용합니다.
    • 오직 1개의 프로세스 또는 스레드만이 접근할 수 있습니다.
    • 락을 획득한 프로세스만이 그 락을 해제할 수 있습니다.

Mutex

  • 앞서 말한 Binary Semaphore과 유사하다.

Busy Waiting

  • lock의 해제를 기다리는 동안 빈 반복문을 계속 진행하므로써, CPU에서 Context Switching이 계속 발생하게 됩니다. 프로세스가 Lock을 기다리는 동안 계속 순환(Spin)이 실행됩니다.
  • 짧은 Lock을 기다리는 경우, Context Switching 비용을 절약할 수 있으나, 일반적으로는 CPU를 점유한 상태로 기다리므로 자원이 낭비되게 됩니다.
  • 이를 Busy Waiting이라 부릅니다.
  • 일반적으로는 Semaphore에서 임계 영역에 진입을 시도했으나, 실패한 프로세스에 대해서는 Block을 시킨 뒤, Critical Section에 자리가 나면 다시 깨우는 방식을 사용합니다.
  • 이 경우 Busy Waiting으로 인한 시간 낭비 문제가 해결됩니다.

Deadlock(교착상태)

  • Semaphore가 Ready Queue를 가지고 있고, 둘 이상의 프로세스가 Critical Section 진입을 무한정 기다리고 있으며, Critical Section에 있는 프로세스는 진입 대기 중인 프로세스가 실행 되어야만 빠져나올 수 있는 상황을 지칭합니다.

모니터

  • 고급 언어의 설계 구조물로서, 개발자의 코드를 상호 배제하게끔 만든 추상회된 데이터 형태이다.
  • 공유자원에 접근하기 위한 키 획득과 자원 사용 후 해제를 모두 처리한다.
  • 참고로 세마포어는 직접 키 해제와 공유자원 접근 처리가 필요하다.

https://github.com/JaeYeopHan/Interview_Question_for_Beginner/tree/master/OS#%EB%8F%99%EA%B8%B0%EC%99%80-%EB%B9%84%EB%8F%99%EA%B8%B0%EC%9D%98-%EC%B0%A8%EC%9D%B4

0개의 댓글