본문 바로가기
개발공부/SW정글

PINTOS 1주차: priority scheduling

by realbro.noh 2021. 10. 4.

1주일 동안 한 것을 정리하려 한다. 짧은 기간이었지만 꽤 많은 것을 공부했다.

pintos project1은 priority scheduling에 관한 것이었다. 바로 프로젝트를 하기 전에 scheduling에 대한 이해가 필요했다. CSAPP, youtube 강의, 블로그 등을 통해 scheduling에 대해 공부했다. 

cpu는 기본적으로 한가지 프로세스 혹은 스레드에 대한 작업을 하지만 우리는 컴퓨터로 여러 작업을 동시에 할 수 있다. 이는 os가 여러 프로세스를 짧게 나누어 번갈아가면서 실행해 동시에 프로세스들이 실행된다고 느끼게 하는 것이다. 예전에는 한 프로세스가 끝날 때까지 다른 작업을 할 수 없었다고 한다고 들은 것 같다. 이를 '동시성 프로그래밍'이라고 한다.

여기서 문제가 생기는 것이 공유 자원에 대한 처리이다. 프로세스가 전환되는 것을 컨텍스트 스위칭이라 한다. 프로세스 A가 공유자원에 접근하여 갱신하고 저장하기 전에 컨텍스트 스위칭이 일어날 수 있다. 이 때 다른 프로세스 B가 이 공유자원에 접근하면 예전 값을 얻게 되고 이 상태에서 갱신, 저장을 한다. 다시 컨텍스트 스위칭이 일어나 프로세스 A가 작업을 이어가면 공유자원은 B가 갱신하기 전 값으로 다시 회귀하여 저장하게 된다. 즉, 같은 공유 자원에 접근할 때 '읽기 - 갱신 - 저장'은 한번에 한 프로세스만 접근할 수 있게 해야 한다. 이를 크리티컬 섹션이라고 한다. 그리고 이를 보장하는 것을 원자성이라고 한 것 같다.

공유자원 문제를 해결하기 위한 방법으로 3가지가 주어졌다. 이는 세마포어, 락, 모니터이다. 너무 길어질 것 같아 자세한 설명은 생략한다. 구글에 검색하면 이 글에서보다 훨씬 이해하기 쉬울 것이다. 이 중 세마포어를 중점적으로 사용하여 스레드간의 동시성 공유자원 문제를 해결했다.

1) alarm clock

기존 코드는 ready상태의 스레드들을 계속 깨우고 잠재우는 busy-waiting 방식이었다. 이를 개선하는 것이 이 프로젝트의 목표였다. 이를 위해 각 스레드마다 잠들 때 일어나야 할 시간(wakeup_tick)을 저장하고, sleep_list를 통해 잠든 스레드들을 관리했다. 그리고 일어나야 할 시간이 되었을 때 sleep_list에서 해당 스레드를 깨우는 방식으로 구현했다.

2) priority scheduling(1)

기존 코드는 스레드 간의 priority가 없었다. priority란 우선순위로 ready상태의 스레드를 깨울 때 우선순위가 높은 스레드를 먼저 깨우는 것이다. 이를 위해 스레드 풀에 변동이 생길 때(생성, sleep, unblock) 스레드 우선순위를 비교하여 가장 높을 스레드를 올리도록 하였다. ready_list를 정렬하여 맨 앞이 가장 높은 우선순위를 가지도록 했다.

3) priority scheduling(2)

공유자원 관리에 관한 내용이었다. 세마포어, 락, 모니터에 priority를 적용했다.

4) priority schdduling(3)

priority를 적용했을 때 생기는 문제점은 우선순위가 낮은 스레드가 lock을 가지고 있을 때, 우선순위와 다르게 실행 순서가 꼬일 수 있는 점이다. 이를 해결하기 위해 우선순위가 높은 스레드가 lock을 요청하면 낮은 스레드가 priority를 받아 먼저 lock을 풀 수 있도록 했다.  이에 각 스레드마다 원래 priority, 기부받아 조정된 priroty, 기부받은 list(받았을 때), 기다리는 lock 종류(기부 할 때) 항목을 추가했다.

이를 위해 lock_acquire(), lock_release(), donate_priority(), remove_with_lock(), refresh_priority()등의 함수를 수정하거나 새로 추가했다. 

 

느낀점:

핀토스 프로젝트를 제로 베이스부터 1주일 동안 하는 것은 매우 어렵다. 운영체제가 어떻게 동작하는지에 대한 개념을 알고 핀토스에서 어떻게 구현되었는지 중점적으로 확인하는 식으로 공부했다. 코드를 분석하면서 이론에서 배운 개념이 어떻게 적용되었는지 확인했다.

코드 분석하는 실력이 많이 향상될 것 같다.

그리고 운영체제의 개념들이 왜 필요한지 이해하는 계기가 되었다.

2주차부터는 조금 더 체계적으로 해야겠다.

 

 

 

 

 

'개발공부 > SW정글' 카테고리의 다른 글

PINTOS 6주차 file system  (0) 2021.11.02
PINTOS 4-5주차 VM  (1) 2021.10.28
PINTOS 2-3주차: USER PROGRAM  (3) 2021.10.13
정글일기 20210825  (1) 2021.08.25
WEEK01 돌아보는 시간  (4) 2021.08.08