week08 WIL

gitddabong·2021년 12월 30일
0

핵심 키워드

이번 주차의 핵심 키워드 : 스레드 스케줄링 방법 고도화 (round robin → 우선순위에 따른 스케줄링)

여러 개의 스레드를 어떻게 동시에 도는 것처럼 보이게 하면서 데이터를 안전하게 보호할 수 있을까? (synchronization)

수단 :

  1. Interrupt Enable / Disable
  2. Semaphore
  3. Lock
  4. Moniter (condition variable)
  1. Interrupt Enable / Disable

마이크로프로세서에서 인터럽트(interrupt)란 마이크로프로세서(CPU)가 프로그램을 실행하고 있을 때, 입출력 하드웨어 등의 장치에 예외상황이 발생하여 처리가 필요할 경우에 마이크로프로세서에게 알려 처리할 수 있도록 하는 것을 말한다. (wikipedia)

많은 종류의 인터럽트가 있지만 project1 에서는 타이머 인터럽트를 하드웨어 인터럽트로 가정해서

스레드 간 CPU의 점유권 이동.

단점 :

다른 보호 장치 없이 인터럽트를 켜고 끄는 것만으로 구현하면

공유 자원에 대한 동시 접근 및 수정에 있어서 문제 발생.

스레드가 작업하는 동안 인터럽트를 차단해서

작업 중인 스레드가 계속해서 CPU를 독점할 수 있도록 만드는 방법.

한계 :

  1. 인터럽트를 Disable하고 그 이후에 Enable하는 걸 깜박했을 경우 response time이 크게 증가
  2. 어느 부분에서 Enable이 되지 않았는 지 찾는 것도 매우 힘듬.

이 Enable과 Disable을 쉽고 안전하게 사용하기 위해 아래 3가지의 Syncronization primitives가 등장.

  1. Semaphore

순차적으로 CPU 점유를 해주기 위한 장치.

0 이상의 정수 값. (pintOS에서는 1까지만 사용)

스크린샷 2021-12-24 오후 11.32.56.png

  1. Semaphore = 0 인 경우

    공유 자원을 사용할 수 있을 때까지 다른 스레드는 대기(waiters 리스트에서 block 상태로 대기)

    자원을 사용할 수 있다는 시그널이 들어오면 진행

  2. Semaphore = 1인 경우

    공유 자원을 사용하기 시작한 현재 스레드가 세마포어를 반납해줄 때까지 CPU 점유

  1. Lock

소유자가 분명한 Semaphore

Semaphore = 1로 초기화, Lock 구조체에서 사용자(holder) 명시

holder 외에는 Lock을 릴리스할 수 없다. (Lock을 소유한 스레드만이 Lock을 릴리스할 수 있다.)

  1. Moniter (condition variable)

Lock에 대한 획득 → 특정 공유 자원에 대한 독점권을 가짐

경우에 따라 condition variable 을 이용해서

특정 조건을 만족할 때까지 독점권을 잠시 포기

회고 :

기본 구현에 필요한 함수들의 코드는 pintOS 안에 들어있어서 안으로 안으로 파고들어가서 볼 수 있어서 좋았으나

운영 체제 개념을 공부하고 난 후에 코드를 보면서 알고 있는 내용과 매칭하는 것에 생각보다 오랜 시간이 걸림.

어디서부터 접근해야할까... 코드를 먼저 볼까, 개념을 먼저 익힐까

각자의 접근 방식으로 공부를 하고 같이 코드를 보며 지식 수준을 맞추는 방식으로 진행.

개념이 어느 정도 매칭이 된 후에는 테스트케이스 하나를 잡고 처음부터 끝까지 함수 안으로 파고들어가서 어떤 동작으로 세마포어가 켜고 꺼지는지 등등을 세세하게 보니까 좀 더 이해하기 쉬워진 것 같다.

profile
성장형 개발자 gitddabong

0개의 댓글