[sw정글 8주차] OS프로젝트에서는 무얼 하게 되는걸까? (코드없이 이해하는 pintos 프로젝트1 )

Date:     Updated:

카테고리:

태그:

🚀OS

OS주차가 시작되었다. 0~7주동안 배웠던 내용의 소주제는 ‘정글탐험 준비’였다.

jungle-OS

그렇다. 이제서야 정글탐험을 시작한 것이다. 여태까지는 그저 탐험준비였다. OS가 무엇이길래 질문을 할 수 있는 TA들과, KAIST교수님들의 강의와 그리고 체력이 부족할 수 있으니 운동을 해두어라 등의 주의를 주는지 기대가 되었다. ‘힘들어 봤자 얼마나 힘들겠어?’라는 마음으로 OS를 시작하였다.

🚀OS, 그 시작

다음은 과제 겸 OS를 공부하며 만들었던 계획표이다. 이번주에는 프로세스, 세마포어 등 쓰레드에 관한 전반적인 개념을 잡는 시간이기도 하였지만, git과 GDB를 조금 더 활용도있게 써볼 수 있는 시간이였다. 다음은 1주일간 {성배, 수연}과 함께 공부했던 내용과 그 계획표이다.

WIL <= 이번주에 배운 내용들 및 작업내역

OS의 엄청난 과제에 밀려, 추가적인 공부나 개발 과정을 상세히 기록할 수 없었다. 그럼에도 불구하고, 과제를 하면서 제대로 알게된 개념에 대해 설명해보고자 한다.

🚽세마포어와 화장실 비유

처음에는 세마포어에 대한 개념이 잘 와닿지 않았다. ‘sunny.txt’ 라는 파일이 있을 때, 사람들이 동시에 글을 적고자 하면어떻게 될까? 내가 작업중이던 파일을 누가 닫으려고 하면 어떻게 될까?

image

다른사람은 작업을 수행할 수 없다고 뜬다. ‘처음에는 내가 작업중인데 내가 왜 내껄 닫으려고 해????’ 라고 생각했다. 작업을 수행하려는 객체는 ‘나’ 뿐만이 아닌, ‘내가 사용하는 프로그램들’일수도 있는 것이다. A라는 프로그램도 ‘sunny.txt’ 가 필요할 수도 있고, B라는 프로그램도’sunny.txt’가 필요할 수도 있는 것이다. 어떻게 사이좋게 쓸 수 있을까에 대한 고민이 세마포어인 것이다. 이에 대해 적절한 비유로써 성훈이형이 화장실에 대한 비유를 알려주었다. 해당 비유에 대해 알아보며 이 비유를 atomic 개념까지 확장시켜 나가도록 하겠다.

🚽화장실 비유

image

A, B, C는 1칸밖에 없는 화장실을 기다리고 있다. 사이좋게 쓰려면 어떻게 해야할까? 컴퓨터의 자원을 어떻게 쓰느냐에 대한 비유로써 자주 사용되는 비유라고 한다. 다음은 컴퓨터 자원할당에 대한 주 고민거리들과 그 해결책들이다.

1칸밖에 없는데 2명이서 동시에 쓸수 있을까 => 그럴 순 없다.

1칸밖에 없는 화장실을 어떻게 나누어 쓸까? => 한명씩, 한명씩 차례로 쓰면 된다.

A, B, C 모두 똥을 너무 오래 싸면 어떻게 해야할까? => 한명씩 조금씩 싸고 나온다. 계속 반복한다.

A가 똥을 싸는데 B가 문을 열어버리면 어떻게 할까? => 문이 열리지 않도록 화장실에 ‘사용중’ 표시를 해준다.

A가 볼일을 보는동안 B,C는 무얼하며 기다려야 할까? => 잠을 자고있으면 된다

B,C가 잠을 너무 깊게자서 화장실이 비어있는데도 안쓰면 어떻게 할까? => A가 볼일을 보고 나와서 B, C를 깨워주면 된다.

화장실이 두칸이라면 어떻게 할까? => A, B가 각각 쓰고, 먼저 볼일을 본사람이 C를 깨워준다.

A가 볼일을 보고있는데, B가 너무 급하다고 하면 어떻게 할까? => A가 싸던 똥을 끊고 잠시 B에게 양보하면 된다.

A가 볼일을 보고있는데, B가 너무 급하다고 한다. 하지만 A도 끊을 수 없는 상황이다. => A가 똥을 끊을 수 없는 상황에는 양보를 해주지 않는다.

A가 볼일을 보고있는데, B가 너무 급하다고해서 A도중에 끊고 잠시 양보를 해주었다. B가 급한일을 처리하고 나왔다. A가 들어가려는데 C가 그사이에 자기도 급하다고 들어가려고 한다. A는 계속 새치기 당한다 => A도 급한사람으로 만들어준다.

A가 볼일을 보고있는데, B가 너무 급하다고 해서 A는 화가난 상태로 양보를 해줬다. B가 볼일을 봤지만 휴지가 없다. 어떻게 해야할까? => 화가나서 휴지를 들고나간 A가 볼일을 마저 보고 휴지도 다쓰고나면 B가 다시 들어가서 닦는다.

눈치챘을지 모르겠지만, 화장실은 CPU이고 A,B,C는 컴퓨터가 해야할 일들이다. 컴퓨터는 어떤 작업이 더 급한지에 따라서, 어떤 작업을 필요로 하는지에 따라 순서대로 자원을 사용할 수 있게 해준다. 유튜브 재생이 더 중요한지, 웹툰이 더 중요한지, 카톡이 더 중요한지 순서에 따라 일을 처리해준다. 우리가 pintos에서 만들어야 할 것이 바로 이것이다.

일의 중요도에 따라 적절한 순서대로 CPU를 사용할 수 있게 해주는 것이다.

이처럼 모두가 만족할만한 화장실 사용 규칙을 만드는게 굼주의 OS과제 내용이였다.

🚨pintos <프로젝트1>

1쓰레드 1코어, atomoic, 어…? 멀티쓰레드가 아니면 자원분배를 못하지 않나? => context switching

이번주 과제는 1쓰레드 1코어 기준의 작업이다. 우리가 마우스를 움직이는동안에 유튜브는 멈추고, 키보드를 한번 누를 때 마다 게임은 잠시 끊어진다. 이처럼 가장 멍청한 형태의 컴퓨터, 즉, 한순간에 한가지 일만 할 수 있는 가장 단순한 컴퓨터에서 프로세스를 어떤 순서대로 사용할 수 있도록 해줄지에 대한 이야기였다.

😴1번과제: busywaiting vs sleep

다시 화장실 비유로 돌아오도록 하겠다. 주어진 pintos과제의 초기상태는 busywaiting 방식이다. A가 똥을 싸고 있으면 B, C가 계속 빨리 나오라고 문을 두드리는 형태인 것이다. 당연히 A는 똥에 집중을 할 수 없는 것이다. 그래서 우리는 sleep방식으로 바꾸어 주어야 한다. A가 똥을 싸는 동안에는 B,C가 계속 잠을 자고 있는 상태로 만들어 주는 것이다. 당연히 B, C가 잠을 자고있으므로, A는 할일을 마친 뒤 B, C를 깨워주어야 한다. A는 똥에 온전히 집중을 할 수 있지만 이와같은 방식이 항상 좋은것은 아니다. B,C를 잠들게 하고 깨우는 비용이 클때는 이와같은 방식이 좋지 않다. 너무 자주사용되므로 재웠다 깨우는 비용이 큰 경우에는 busywaiting방식으로, A가 볼일을 마치자마자 B가 잽싸게 사용될수 있게 하는 방식이 훨씬 더 이득이다. 굳이 어렵게 설명을 하면, ‘B작업의 오버헤드 코스트가 높은 경우 busywaiting방식으로 구현되는것이 더 이득이다’ 라고 말할수 있다. 아무튼, 대기방식을 busywaiting방식에서 sleep 방식으로 구현을 하는게 과제의 1차 목표이다.

😴sleep list

똥칸을 기다리는 B,C는 어디서 잠을 자면 될까? 이를 위해 sleep_list를 만들어 주어야 한다. 아무래도 따로 마련된 공간에서 자는것이 좋을 것이다. 이를 위해 sleep_list를 제공해야한다. 그렇다면 이제 막 똥을 싸고 나온 A는 B,C를 깨우기 위해 sleep_list로 뛰어가야할까? 이것은 꽤나 비효율적이다. A가 나올때, B가 바로 사용될 수 있도록 해주는것이 중요하다. 따라서 sleep_list에서 다음에 사용할 친구를 미리 알고있는것이 중요하다. 이정보를 가지고 있는 변수가 바로 next_thread_to_run 이다.

🚨2번과제: Priority Scheduling

똥칸을 기다리는 A가 있다. 너무 너무 급한 B가 찾아온다. 어떻게 대처해야할까? B에게 요령껏 양보하면 된다. 이 ‘양보(yield)’를 요령껏 하는 방법에 대해 공부하고, 구현하는 시간을 가지게 된다.

A가 B에게 양보를 해주었는데, C도 급하다고 하고… D도 급하다고 하고… E도 급하다고 한다… 이에대해서 어떻게 조치를 취해줄 수 있을까? A가 B에게 양보를 한 순간 A는 B만큼 급한사람 취급을 해주면 되는 것이다. A도 급한사람이 될 수 있도록 prioirity를 올려주는 부분이 Donate에 관한 이야기인 것이다. B의 priority를 A에게 Donate해주면 어떤일이 발생할까? C와 D가 B만큼 급하지 않다면, A가 먼저 볼일을 볼 수 있을 것이다.

(A가 B에게 양보해주고, donate를 받은 상황에서)만약 B보다 급한 C가 들어오게 된다면 어떻게 될까? C에게도 양보를 해주고 C에게 한번 더 donate를 받으면 되는 것이다.

donate

💰Donate(with lock)

A가 B에게만 양보해준 상황이다. 하지만 A가 닦으려는 순간 B에게 양보를 해주면 어떻게 될까? B는 일단 똥을 싼다. 그리고 휴지가 없음을 깨닫고, (닦지않고)잠을 자러간다. 그리고 (B에게 donate를 받아 priority가 B와 동일해진)A가 다시 들어와서 마저 닦고, B가 잠에서 일어나서 B도 닦는다.

image

‘휴지’ 라는 자원을 사용할 때, 이처럼 lock을 걸 수 있는 것이다. 어떤 특정 자원을 사용할 때 방해받기를 원치 않는다면 이처럼 특정 자원에 대해 lock을 걸 수 있는 것이다. 이처럼 방해받기를 원치 않는 자원에 대해 lock을 거는 행위가 semaphore의 핵심 개념인 것이다. 휴지가 될수도 있고, 물내리는 손잡이가 될수도 있다. 똥을 쌀때도 끊을수가 없다.

다음과 같은 상황이 있다. A가 atomic한 똥을 싸는 와중 B가 들어오게 된다. B도 ‘똥’작업을 원하지만, 이내 A가 ‘똥’ 작업중임을 알게된다. 똥을 끊지 못하고 잠시 나왔던 A는 다시 들어가서 마저 atomic한 똥을 싸던곳부터 이어서 수행하게 된다. 그리고 나서 B가 다시 작업을 수행하게 되는 것이다.

💰Donate(nested)

A는 atomic한 ‘휴지’작업중이다. B는 한편 atomic한 대변을 보는 와중, A에게 ‘휴지’작업을 요청한다. 가장 priority가 높은 C가 B에게 대변 작업을 요청한다면 어떻게 될까? 아래 그림은 다음과같은 상황을 표현한 표이다.

donate-nested

이처럼 꼬리에 꼬리를 무는 요청이 있을경우, 꼬리에 꼬리를 물고 donate를 해준다. 따라서 priority가 가장 낮은 A도 일시적으로 C만큼 높은 priority를 가질 수 있게 되는 것이다. 높은 우선순위를 가지게된 A가 일을 빨리 끝마치면, B도 일을 마무리 할 수 있게된다. 그렇게 되면, 가장 급했던 C도 드디어 작업을 시작할 수 있게 되는 것이다.

👾번외1

multi

만약 화장실칸이 4개라면 어떻게 되는것일까? 현대의 컴퓨터들은 기본 4코어 이상이다. 따라서 우리가 컴퓨터에서 해야할 수많은 작업들이 있으며, 이를 우선순위에 따라서 적절하게 배치하는 작업이 컴퓨터의 성능과도 직결되는 것이다.

이처럼 CPU에 작업들을 scheduling을 효과적으로 하기위한 알고리즘이 다양하게 연구되고 있다.

이전게시글에서 설명했듯, 어떻게 N개의 코어에 작업을 분배할지에 대한 이야기는 중요한 내용이다. A는 똥을 오래쌀수도 있고, B는 짧게쌀수도 있다. C는 똥을 하루종일 싸야할 수도 있으며, D는 똥을 못참는 친구일수도 있다. 컴퓨터게임과 같은 복잡한 환경에서는 이와같은 프로그래밍이 더더욱 복잡하기에, 4개의 화장실도 중요하지만 1개의 좋은화장실이 더 우수한 성능을 보여주는 것이다. 그래픽처리처, 머신러닝 학습처럼 비교적 단순한 작업은 단순 반복적으로 스케쥴링이 되기 때문에 기존과는 다른 특별한 프로세스(GPU)가 더욱 적합하기도 한 것이다.

👾번외2

우선순위가 낮은 친구는 어떻게 될까? 계속 들어오는 친구들에게 밀려, 평생 똥을 싸지 못하고 죽을수도 있을 것이다. 모두가 공평하게 화장실을 10초씩만 이용하면 그런 불쌍한 친구들은 없을 것이다. 하지만 급하고, 오래싸야하는 친구들은 불편함을 느낄수도 있을 것이다. 따라서 우선순위에 따라서 화장실 사용시간에 weight를 주는 방식도 있는 것이다.

평생 스케줄링 되지 않는 작업은 없으며, 급한 친구들은 빠르게 빠르게 처리가 되어야 하며, 자주 싸는 친구들은 굳이 잠을 재우지 않는것이 좋다. 이처럼, 사용자가 느끼기에 최적의 컴퓨터 사용환경을 만드는것이 좋은 스케줄링이자 좋은 OS프로그램일 것이다. 이는 프로그래밍에서 어려운 영역중 하나이지만, 우리는 컴퓨터의 기본 동작원리를 이해하기 위해 이처럼 가장 간단한 형태에서의 스케줄링을 구현해본 것이다.

🤔마치며

코드없이 세마의 사용법과 큰 그림을 이해하면, 같은과정의 후배들에게 적절한 도움이 이루어지지 않을까 라는 마음으로 적어보았다. 하지만 막상 작성하고 나니, 깊이감있는 정보전달이 이루어진 것 같지는 않다. 그럼에도 불구하고, Project1에서 어떤 내용을 공부하게 될 것이며, 결국 어떤 작업들을 해나갈 것인지에 대해 큰 그림을 설명하고자 노력하였고, 세마에 대한 직관적 이해 혹은 이번 과제에 대한 적절한 힌트로써 작용하길 바란다.

🚀금주 WIL 발표 영상

🚀금주 우리팀 TIL & WIL 정리 링크

크게 얻은게 없다고 생각될 때, 본인의 행적들을 뒤돌아보면, 꽤나 열심히 살았으며 본인의 인생에 조금 더 떳떳함을 가지게 될 수 있는 것 같다.

WIL <= 이번주에 배운 내용들 및 작업내역



😵배우면서 깨달은 내용을 정리해 보았습니다. 틀린 것 같은 개념을 아래 댓글에 달아주시면 감사합니다😵

🌜 Thank you for reading it. Please leave your comments below😄

맨 위로 이동하기

swjungle survive 카테고리 내 다른 글 보러가기

댓글 남기기