이번주차부터는 본격적으로 pintOS 프로젝트에 돌입한다
9,10,11주차는 팀이 바뀌지 않고 쭉 가는데, 이번엔 좋은 자리에 걸렸다 ㅎ
1주차에 구현해야 하는건 Alarm Clock, 우선순위 스케줄링, 고급 스케줄러 총 3개이다
먼저 과제 설명서를 보자. GPT에게 번역을 맡겼다.
https://verdant-bathtub-bae.notion.site/1-1ed7bb7778c980e8b6bef0b619ddfff6?pvs=4
1주차 과제 설명 | Notion
소개
verdant-bathtub-bae.notion.site
나는 wsl로 pintOS를 사용하기로 했다. 과제 설명에서는 ubuntu 18.04를 사용하라고 되어있지만, 18.04에서 vscode를 사용하려면 다운그레이드도 필요하고, 복잡한 과정이 많아서 그냥 쓰던 22.04를 쓰기로 했다. 이렇게 써도 큰 문제는 없었다. 만약 후기수가 이 글을 본다면 굳이 우분투 18.04 이미지를 찾아서 도커에서 돌릴 필요 없이 윈도우라면 wsl에서 우분투 22.04를 써라 !!
테스트도 도커에 비해 훨씬 빠르고 편하다
본격적으로 pintOS를 내려받고 코드를 뜯어보니 이게 처음엔 당췌 무슨 코드이고 어디를 고쳐야하는지 잘 모르겠더라...
나중에 안 사실이지만, 어느 파일의 어느 함수를 고치고 어떻게 로직을 작성해야 하는지 다 나와있는 강의가 있다
https://www.youtube.com/watch?v=myO2bs5LMak&list=PLmQBKYly8OsWiRYGn1wvjwAdbuNWOBJNf&index=4
정 감을 못 잡겠으면, 이 영상 한번 보고 오자
나는 그냥 함수 하나하나 살펴보면서 주석을 달아서 어디에 쓰이는 함수인지 파악하고 시작을 했다. 하지만 과제에서 어느 함수를 고쳐야 하는지는 알 수가 없어서 GPT에게 물어보고 시작을 했다.
구현을 시작하기 전에 먼저 list.h와 list.c를 파악하자 !! 이중 연결리스트를 구현해둔 파일인데, 굉장히 많이 쓰인다. 각 함수가 어떻게 쓰이는지 정도는 알고 시작해야한다.
Alarm Clock
쓰레드에게 일정 tick만큼 sleep 하도록 하는 timer_sleep 함수를 고쳐야 한다. 현재는 쓰레드가 해당 tick이 지날 때까지 busy waiting으로 다음 쓰레드에게 양보 (thread_yield)를 하는 중인데, 이는 CPU를 지속적으로 사용하는 좋지 않은 코드이다. timer_sleep에 들어간 쓰레드들을 특정 리스트에 등록해두고, 인자로 받은 tick이 지났을 때 해당 쓰레드를 깨워주는 로직이 필요하다.
https://verdant-bathtub-bae.notion.site/Alarm-Clock-1ee7bb7778c9806f85f8d74bc8f22f19?pvs=4
Alarm Clock | Notion
사용해야하는 함수들
verdant-bathtub-bae.notion.site
우선순위 스케줄링 / 동기화
현재 pintOS는 일정 틱마다 작업할 쓰레드를 교체하는 round-robin 스케줄링을 사용 중이다. 이를 각 쓰레드마다 우선순위를 매겨 그 순서대로 스케줄링해주도록 바꿔주어야 한다.
또한, 락, 세마포어, 조건 변수의 대기 리스트 내 쓰레드들 간의 순서도 우선순위에 따라 정렬되도록 해주어야 한다.
https://verdant-bathtub-bae.notion.site/1ee7bb7778c9806bbd08d63b3b2288e9?pvs=4
우선순위 스케줄링 / 동기화 | Notion
쓸만한 함수들
verdant-bathtub-bae.notion.site
이 과제에서는 각 테스트 케이스를 실행하는 코드들을 뜯어보는게 도움이 되었다.
각 테스트 케이스들은

여기에 있으니까 다들 한번 씹고 뜯고 맛보도록 하자
그리고 조건 변수가 굉장히 헷갈리는 개념이었는데.. 솔직히 아직도 왜 조견 변수 내에서 세마포어를 통해 쓰레드를 래핑해서 리스트에 넣어줘야 하는지는 아직 잘 모르겠다.
우선순위 기부 / 중첩 기부
락 때문에 높은 우선순위를 가지고 있는 쓰레드가 CPU를 점유하지 못하는 우선순위 역전이 발생할 수 있다.
이를 방지하기 위해 해당 락을 가지고 있는 쓰레드에게 자신의 우선순위를 기부하여 먼저 실행이 되도록 해주고, 락을 건네받고 자신이 실행되도록 해주는 것이 우선순위 기부이다
중첩 기부는 쓰레드가 여러 락을 들고 있을 때 발생할 수 있는데, 들고 있는 락들이 필요한 다른 쓰레드들이 자신의 우선순위를 기부해주는 것이다. 그럼 기부받은 우선순위가 여러개인데, 이를 리스트로 따로 관리해 줄 필요가 있다.
예를 들어 기존 우선순위가 30이고 기부받은 우선순위가 33, 32, 31 일 때, 33을 반납한 경우 다음으로 사용할 우선순위가 무엇인지 알아야 하기 때문이다.
https://verdant-bathtub-bae.notion.site/1f17bb7778c98038930cd0104e63dc54?pvs=4
우선순위 기부 / 중첩 기부 | Notion
우선순위 역전이 무엇인가?
verdant-bathtub-bae.notion.site
MLFQS
Multi-Level Feedback Queue Scehduler
우선순위 스케줄링에서는 우선순위가 낮은 쓰레드가 계속해서 양보만 하게 되어 작업을 하지 못하는 기아 상태가 발생할 수 있다. 이를 막기 위해 CPU 점유율, 대기 시간 등을 측정하여 우선순위를 변동시켜 최대한 공정하게 CPU를 점유하도록 해 주는 스케줄링 방식이다.
https://verdant-bathtub-bae.notion.site/1f17bb7778c980889846fed44eead921?pvs=4
고급 스케줄러 | Notion
고급 스케줄러 테스트를 시작할 땐 -o mlfqs 가 설정되므로 thread.h에 설정된 전역변수 thread_mlfqs가 true로 설정됨
verdant-bathtub-bae.notion.site
말만 들어보면 꽤 복잡할 것 같지만 사실 관련 수식이 전부 주어져 있어서 쉽게쉽게 구현한 것 같다
후기
조금 헷갈리는 개념들이 있었지만 그래도 구현이 어려운 편은 아니었다. 개인적으로는 과제 설명이 굉장히 불친절한 것 같았다. 처음 구현에 들어갈 때는 대체 어떤 함수가 어떻게 수정되어야 하는지 알 수가 없어서 굉장히 막막했었다. GPT 선생님의 도움으로 갈피를 잡기는 했지만.. 그래도 구글링을 해보면 과제를 진행한 사람들이 어디부터 어떻게 시작했는지 친절하게 알려주니까 겁먹지 말자!! 아 물론 이전 주차에서 개념을 열심히 공부하지 못했다면 그것부터 먼저 공부하자. 개념이 잡히지 않으면 구현은 손도 댈 수가 없을듯 하다

물론 테스트는 All passed !!
'크래프톤 정글' 카테고리의 다른 글
| [pintOS] 버그/에러 모음 (0) | 2025.05.17 |
|---|---|
| [pintOS] 시스템 콜 과정 (0) | 2025.05.15 |
| 8주차 개발일지 (1) | 2025.05.07 |
| 7주차 개발일지 (0) | 2025.04.30 |
| 6주차 개발일지 (0) | 2025.04.23 |