[yummyHitOS] 17 day (2017.08.01)

5 분 소요

아닛... 개발을 진행했던 8월 1일에 대해서도, 글을 쓰고있는 8월 31일에 대해서도 하고싶은 이야기가있어여!!

먼저 글을 쓰고있는 오늘!! 17.08.31 티스토리가 개편되었네여!? 사실 저도 잠정적 폐쇄를 두려워하고있었지만... 오오오 개편과 함께 아주아주아주 불편해졌어여... 고작 한달 반 포스팅한 것 뿐인데 이렇게 불편하게 느껴지다니ㅜㅠㅜ 역씨 사람은 적응의 동물이라구.. 곧 적응되겠죠?!



꼭 야미같이 생긴녀석이네여.. 해맑 :D

그리고 8월 1일에 대해서는, 대대적인 코드 수정을 진행한 날이예요! 바로 명칭 수정과(평소에 제가 개발할 때 쓰는 용어로 변수명 전면 수정한 것!) 최대한 코드 라인 수 줄이는 작업과(저는 라인 많은 게 불편하더라구여 ㅜㅠ 최대한 중괄호를 안쓰려는 편이예요.) 주석부분 수정들!!

오늘은 티스토리도 개편하구 저의 개발일지도 수정되어진 변화의 날인가봐여!! 그럼 이 변화와 함께 우리의 코드도 변화시키고 우선순위 변화도 시켜보아여!!


16일차 포스팅에서 알게된 "멀티레벨 큐 스케줄링(Multi-Level Queue Scheduling)" 알고리즘 기억나시나영?! 자료구조에서 선입선출(FIFO 혹은 LILO) 방식인 Queue를 여러 단계로 나눠 각 큐마다 스케줄링 기법을 고정시키는 방법이었지여!! 그리고 각 큐마다 우선순위가 부여되는 녀석이었어요!!

이 스케줄러에는 두 가지 스케줄링 정책이 필요하다고 해요. 왜냐구여?! 책에서 그렇다고... 큐가 여러 개이니까요! 라운드 로빈 스케줄러는 태스크가 대기하는 공간이 하나 뿐이었으니, 이것이 여러 개가 되며 정책이 생기기 마련이지요!


먼저, 멀티레벨 피드백 큐 스케줄링(Multi-Level Feedback Queue Scheduling) 기법과 다르게 멀티레벨 큐 스케줄러는 각 큐마다 스케줄링 알고리즘이 고정되어있고, 태스크가 자신과 적합한 알고리즘을 찾아가지 못하기 때문에, 태스크와 성질이 비슷한 큐에 배치해주는 정책이 필요해요!


그리고 두 번째로 태스크가 자신과 적합한 큐에 배치되었을 때, 이제 큐에서 태스크를 어떻게 수행할 지를 결정하는 정책이 필요하구요! 태스크마다 우선순위가 다르다거나, 배치된 큐의 내부 알고리즘이 어떤 방식으로 이루어 지는가에 따라 수행 방법이 달라지기 때문에 이를 어떻게 수행할 지 정해야해요!

하. 지. 만!! 멀티레벨 큐 스케줄러에서는 같은 큐 내의 태스크들에게 같은 우선순위가 부여되기 때문에 이 때 가장 좋은 스케줄링 알고리즘은 바로 저번 시간에 적용한 "라운드 로빈(Round Robin) 스케줄링" 알고리즘이예요!


이렇게 두 정책을 적용하면 이번 챕터는 끝~~! 빨래 끝~~!



일 리가 없죠?! 이런 야미식의 재미없고 지루한 개그는 익숙해지시지 않으셨나여?!? 항상 짜증나고 보기싫으시다구여? ㅜㅠㅜ죄송해여... 두뇌가 여기까지인가봐여... 아메바같네영... 괜찮아여!! 누군가 웃어주길 바라면서 그냥 이대로 해야져 뭐!! 헿헤헤헤헤


사실 이 후로 책을 열씸히 읽어보시면, 갓승훈 선생님께서 너무 잘 설명해주셔서 제가 더 이상 설명해 드릴 것이 없어여... 다음 챕터로 넘어가는게 나을까 싶었지만 최대한 새로운 용어를 설명하고 넘어가고 싶은 욕구가 흘러넘쳐서!! 우선순위와 유휴태스크를 설명토록 하겠씁니다!!


여러분은 컴퓨터 공부를 할 때 우선순위라는 말을 처음 들어본 파트가 어디였나여? 저는 대학 입학할 때 배운 C언어의 연산자 우선순위였어요!

다들 C언어 입문 때 들어보시지 않으셨을까.. 생각하지만.. 요즘 어린 학생들도 개발을 하고 해킹을 하는 시대라 ㅜㅠ 다를 것 같다고 생각이 드네요. 나도 몇 년만 일찍 시작했으면... Back to the Future!!


Order of operations

연산자 우선순위란, 수학적으로 덧셈, 뺄셈, 곱셈, 나눗셈, 소괄호, 중괄호, 대괄호 및 각 연산자에 대해 순서가 있는 것을 의미해요. 간혹 페이스북에서 퀴즈형태로 나오던데, 한 번 보실래여?!



페이스북 외국 페이지에서 계산기도 틀리는 문제라고 잠깐 핫했는데... 제가 보기에만 핫하고 여러분은 모르는 문제일 쑤도 있겠져..? 이렇게 전 페북쟁이가 되고... 이런 퀴즈의 댓글 보시면 외국인들 사이에서 왈가왈부가 많더라구여. 가끔 당연하다 싶은 문제조차도 막 답이 다르길래 아.. 우리나라가 수학 강국이라기 보다는 그냥 세뇌강국..?! 외국인들이 문제 푸는 방식이 되게 창의적이거든요. 우리나라에도 창의성 도입이 너무나도 시급합니다!!


연산자 우선순위가 중요한 이유는 수학에서 뿐 아니라 우리에게도 코딩할 때 각 연산에 따른 우선순위가 부여되어 있기 때문이예요!

끽해봐야 연산자가 뭐가 있겠냐구여? 과연 몇 개나 있는지 살펴볼까요!?



어멋.... 생각보다 적지 않네여!? 좌측은 위키백갓에서 나온 것인데, 뭔가 설명이 부족한 것 같아서 우측의 이미지까지 함께 드릴게여!! 한국어로 설명되어있으니 넘나 좋지 않나여? 역시 세종대왕님은 대왕이아니라 신...(언제는 영어가 좋다하고 언제는 한국어가 좋다하고 참 변덕야미네여)


이렇게 다양한 연산자들이 있어요!! 소괄호를 통한 결합이 가장 높고, 배열 혹은 리스트를 위한 대괄호가 두 번째, 멤버를 가리키기 위한 포인터 지시자인 화살표, 그리고 멤버 참조 지시자 쩜(dot)이 가장 높은 우선순위를 가지고 있네여!

다른 연산자 설명은 따로 안드리도록 할게요! 그렇게 되면 이제 C언어 기초부터 시작해서... 배열이 무엇인가... 시프트는 왜 쓰는가... 대입과 Equal의 차이와... 넵 너무나도 방대하고 깊은 우리의 IT이기 때문에 어차피 커널 프로그래밍 하다보면 C언어 사용하니까 C언어 공부하세여!! 두 번 하세여!! 재밌단 말이예여 빼액!!!


Privilege

우리의 OS개발에 있어서 우선순위도 이와 비슷하게, 커널영역의 태스크에 우선순위를 부여해 중요한 태스크를 먼저 수행할 수 있도록 해주는 스케줄링을 하는 것이예요. 윈도우를 사용하다보면 가끔 인터넷이나 게임, 오피스 작업 등에서 '응답 없음'으로 인해 작업관리자에서 프로세스 종료를 해보신 적이 있지 않으신가여? 거기서도 프로세스에 대한 우선순위를 볼 수 있답니다!



짜란!! 이렇게 세부 정보 탭으로 들어가시면 우선 순위를 정할 수가 있어요. 이번 챕터 19에서 이러한 우선순위 설정을 진행하게 되는 것이죠!

리눅스를 사용하신 분이라면 nice, renice라는 명령어를 통해 우선순위를 설정하는 것을 아실거라고 생각해요. top 명령을 통해 작업관리자와 같이 현재 실행중인 프로세스, 잠들어 있는 프로세스에 대한 메모리 사용량 / CPU 사용량 및 우선순위를 볼 수 있답니다!

또한 리눅스에서 sched.h 라는 헤더파일을 통해 스케줄링 시스템을 호출하여 코드 구현을 하실 수도 있어요! 리눅스에서 설명서인 man 명령을 통해 sched 라이브러리 사용법을 보실 수 있는데, 궁금하시다면 따로 첨부해드릴게요!!

sched library man page : http://man7.org/linux/man-pages/man7/sched.7.html


그렇다면 다음으로 유휴 태스크란 무엇인지 알아볼까요?!


Idle Task

유휴 태스크(Idle Task)란 실행 가능한 태스크가 CPU에 스케줄 되어있지 않았을 때 실행되는 일종의 프로세스예요. 만약 여러분이 멜론 플레이어를 통해 음악을 듣다가, 일시정지로 해두고 게임을 하신다면 멜론 플레이어는 정해진 시간동안 음악 재생이 없기 때문에 유휴상태에 빠지게 되며, 다시 여러분이 멜론 플레이어에 관심이 가서 재생을 눌렀을 때 유휴 태스크는 멜론 플레이어를 깨워 준비리스트에 넣도록 하고, 다시 다른 유휴상태의 태스크가 발생하지 않는지 기다리게 되지요.


그렇다면 우리가 컴퓨터에서 인터넷만 사용한다고 가정했을 때, 유휴 태스크는 필요가 없는데 굳이 유휴상태의 태스크가 발생할 때까지 기다릴 필요가 있을까? 싶지 않으신가여?


유휴 태스크는 사용되지 않을 때 실행되지 않아서 CPU 자원을 소모하지 않는답니다! 그렇기 때문에 낭비가 없지요!(물론 이것도 구현이 잘 되어야 해요. 혹시라도 사용되지 않을 때에도 대기하도록 한다면 나중에 오버헤드를 초래할 수 있으니 주의하세요!!)

Idle Task 출처 : https://en.wikipedia.org/wiki/Idle_(CPU)



오랜만에 여담이지만, 저는 맥뿍에서 JetDrive를 통해 잘 쓰지 않는 가상머신과 음악을 외장하드에 관리하고 있는데, 컴퓨터가 유휴상태에 돌입해 잠자기 모드가 실행되면 연결되어있는 외장하드가 분리되더라구요.. 음악을 틀어놓으면 음악은 계속 재생하려는 욕구가 강해 외장하드를 계속 사용하기 때문에 분리되지 않는데, 음악을 틀어놓지 않고 가상머신만 켜놓았을경우 가상머신도 사용되지 않아 같이 유휴상태에 빠져 맥뿍 재시동이나 JetDrive를 재인식 시켜야 하는 경우가 발생해여ㅜㅠ 유휴 태스크가 항상 좋은 것 같지만은 않네영.. 불편한녀석!!


이번 챕터에서도 씬나게 바람개비인지 풍차인지를 빙글빙글 돌리는 실행 화면이 나오네여!!

다음 챕터를 진행하려고 봤더니 동기화 과정이 뙇!! 동기화를 설명하는 것은 오래 걸리지 않지만, 제가 여러번 말씀 드렸듯이 저는 컴퓨터에 첫 입문을 쓰레드와 했기 때문에 동기화를 좀 더 자세히 살펴보고 갈 생각이예요! 예제를 많이 드리도록 할게여 ㅎㅎㅎ(사실상 이번 챕터와 다음 챕터의 이론 부분 페이지 수가 굉장히 적다는 것...)


이번 챕터가 너무 짧게 느껴지긴 하지만, 가끔은 이렇게 쉬엄쉬엄 넘어갈 때도 이ㅆ..넵 열씸히 하겠습니당... 자 그럼 우리는 다음 챕터의 동기화를 끝장 내보기 위해 만반의 준비를 해보며.. 끝장나는 유병재님의 짤을 보고 넘어가보도록 해여!!




Check out the yummyhit’s website for more info on who am i. If you have questions, you can ask them on E-mail.

카테고리:

업데이트:

댓글남기기