[Pintos] Project 1 정리 -1-

da__ell·2022년 12월 12일
0

Pintos-Kaist

목록 보기
5/9
post-thumbnail

PintOS

Brand new pintos for Operating Systems and Lab (CS330), KAIST, by Youngjin Kwon.

The manual is available at https://casys-kaist.github.io/pintos-kaist/.

Thanks to https://bo5mi.tistory.com/

(2022.11.10 ~ 11.16)

PROJECT 1: THREADS

PintOS에서 thread와 process의 관계

실제 OS(Operating System)에서는 하나의 process 안에 여러 개의 thread가 존재할 수 있다. 여러 개의 thread들은 같은 virtual address space를 공유한다. PintOS에서는 구현을 단순화하기 위해서 하나의 process에 하나의 thread만 있도록 구성되어 있다.

WIL (Weekly I Learned)

11.10 목

  • 작업환경 세팅 (EC2, Ubuntu18.04) + repo 생성
  • PintOS project Git Book 읽기

11.11 금

  • KAIST 권영진 교수님 OS 첫 번째 강의

  • 공부로 도망치지 마세요. from 코치님

11.12 토

PintOS 전반적인 코드 파악

  • /threads/init.c
  • /threads/thread.c
  • /lib/kernel/list.c & /include/lib/kernel/list.h
  • /tests/threads/tests.c
  • /threads/synch.c

11.13 일

Alarm clock 구현

  • Alarm Clock이란?
    • 호출한 프로세스를 정해진 시간 후에 다시 시작하는 커널 내부 함수
    • PintOS에서는 thread가 CPU를 사용할 시간(할당시간)은 4 tick(40ms)으로 한정되어 있음
    • 4 tick이 지나면 thread는 ready_list의 맨 뒤에 추가됨
  • 문제점: Pintos의 Alarm clock은 loop 기반의 Busy waiting 방식
    • Busy waiting 방식: time_interrupt가 일어날 때마다 ready_list를 순회하며 thread들이 사용해야할 타이밍인지를 체크함
    • 즉, 자고 있는 thread들 중에 아직 일어날 시간이 아닌 thread들도 running에 상태에 넣어 CPU를 쓰면서 대기하고 있는 상태
  • 목표: 프로세스를 재울 때 시스템 자원 낭비를 최소화하는 것
  • 문제 해결: sleep/wake up으로 문제점 개선
    • sleep_list를 하나 만들어서 thread들을 blocked된 상태(잠자는 상태)로 넣어줌
    • time_interrupt가 일어날 때마다 sleep_list에 존재하는 thread들 중 깨워야할 tick이 된 thread를 ready_list에 넣고 상태를 ready로 바꿔줌
    • 아직 깨어날 시간(tick)이 되지 않은 thread들은 CPU를 사용하지 않고 대기할 수 있기에 문제 해결

11.14 월

Priority Scheduling (1) Priority Scheduling 구현

  • Scheduling란?

    • 여러 프로세스가 번갈아가며 사용하는 자원을 어떤 시점에 어떤 프로세스에게 자원을 할당할 지 결정하는 것
  • 문제점: thread들 간의 우선순위 없이 ready_list에 들어온 순서대로 실행됨(Round-Robin 방식)

    • Pintos는 Round-Robin 방식 채택, 할당된 시간 4 tick이 지나면 running thread는 다른 thread에게 선점당함
    • Pintos는 새로운 thread를 ready_list에 넣을 때 항상 맨 뒤에 넣고, ready_list에서 다음 CPU에 할당할 thread를 찾을 때는 앞에서 꺼냄
  • 목표: thread의 우선순위대로 scheduling 하는 것

  • 문제 해결: 우선순위를 비교하여 우선순위가 가장 높은 thread를 ready_list의 맨 앞에 위치시킴

    • thread를 ready_list에 우선순위대로 정렬되도록 삽입

    • ready_list에서 thread를 뺄 때 앞에서부터 빼기 때문

    • 문제 해결에서의 문제: running thread가 가장 높은 priority를 가지는 것을 보장하지 못 함 1. 새로운 thread의 priority가 현재 running하고 있는 thread보다 우선순위가 높아질 때 2. thread의 priority가 변경될 때
      => ready_list에서 우선순위가 가장 높은 thread와 running thread를 비교하여 우선순위가 더 높은 thread가 선점할 수 있게 해줌

11.15 화

Priority Scheduling (2) Semaphore, Lock, Condition Variable 구현

  • Semaphore, Lock, Condition Variable을 사용하여 Priority Scheduling 개선
    • PintOS는 여러 thread들이 Semaphore, Lock, Condition Variable를 얻기 위해 기다릴 경우 먼저 온 thread가 먼저 사용하는 FIFO 방식을 사용
    • Sychronization 도구들을 기다릴 때, 우선순위가 가장 높은 thread가 CPU를 점유하도록 구현

11.16 수

Priority Scheduling (3) Priority donation(Prority inversion problem) 구현

  • 문제점: 여러 thread가 lock을 요청하고 점유하는 과정에서 Priority Inversion 발생
    • priority가 높은 thread가 priority가 낮은 thread를 기다리는 현상
  • 문제 해결: Priority donation
    • Multiple donation
      • thread가 두 개 이상의 lock 보유 시 각 lock을 획득하고자 하는 thread들에게 donation 발생가능
      • 예시) thread L이 lock A와 lock B를 점유하고 있을 때 thread M이 lock A를 요청, thread H가 lock B를 요청하는 상황
    • Nested donation
      • 여러 번의 단계적 donation이 일어나는 상황

11.17 목

Project 1 결과

  • 10:00 ~ 11:00 발표 진행

profile
daelkdev@gmail.com

0개의 댓글