[yummyHitOS] 15 day (2017.07.30)

9 분 소요

아닛... 야미님 1주일을 넘게 글을 안쓰시다니여? 너무 해이해지신거 아닌가여! 반성하도록 하세여!



글을 시작하기 전에 안물안궁한 1주일 근황을 알려드리고싶어요! 제주도에 간 당일 휴대폰을 바닷물에 첨벙.. 빠뜨려버려쓰.. 그래서 제주도에서 다시 서울로 올라오는 4일동안 휴대폰 없이 ㅜㅠㅜㅠㅜ 와이파이 되는 곳에서만 맥뿍으로 카톡했어요 ㅜㅠㅜ

물논 지금은 짱짱한 휴대폰을 쓰고있지여!!

제주도에서 심심할 때마다 저의 이쁘장한 YummyHitOS의 코드를 중간 중간 고쳐가며 놀았는데, 제주도를 다녀온 후 개발의 욕구가 활활 타올라서.. 열씸히 OS개발을 하느라 포스팅을 늦ㅊ.. 제가 잘못했숨다 ㅜㅠ 어떠케 여러분보다 개발을 좋아할 쑤가 있나여! 반성할게여!

(여담인데 싱기방기한게 어느 챕터에서 오류나서 어찌어찌 굴러가듯 안굴러가듯 대~충 해놓고 다음 챕터를 나가면 갑자기 잘된다능!! 그 이유를 아직 살펴보지못해서 전부 책에 적어두고 깃헙에두 커밋해놨으니 나즁에 그 버전 가져와서 또 디버깅해야겠어여!! 눈누난나~~ 기쁘당~~ 아~~~ 기쁜데 하기실탕~~)



자! 그럼 이제 오늘의 챕터는 어디인가영!

오오오 태스크.. 멀티태스킹!! 어릴 적 어른들이 ㅇㅇ야~ 하고 불렀을 때 부르는 소리 못들으면 '요녀석 멀티가 안되네~' 하던 그 멀티태스킹!!(누가 멀티가 안된다고 하시는지 모르겠지만.. 헿헤 집중잘하네~ 하시겠져 원래는?!) 전 산만해서 멀티쟁이여써여 ㅎㅎㅎ헿헤헿 스타에서도 멀티 열씸히 한답니당~


Task

태스크(Task, 작업)란 프로세스(Process)와 쓰레드(Thread)의 형제랄까요? 커널에서는 모든 작업을 태스크 단위로 실행하는데, 프로세스와 쓰레드가 실행되어 질 때 태스크가 작동하는 것이거든요! 실제로 프로세스를 생성하든, 쓰레드를 생성하든 결국 태스크가 생성되어 지는 거라구요~!


음.. 아직 와닿지 않지여? 그럼 프로세스와 쓰레드는 뭐 어떻길래 태스크란 녀석을 개념적으로 나누는 것이더냣!!!

여러분 윈도우 쓰시다보면 프로그램 강제 종료 할 때 작업관리자 들어가셔서 막 프로세스 종료하시구 그러시져?! 그리구 우리의 컴공과라면 쓰레드라는 말 넘나 많이 들으셨을거예여! 야미는 첫 개발했던 것이 쓰레드를 이용하는 것이었어서... 이론 1도 모르는 채 개발부터 했다능...


Process

프로세스(Process)란 컴퓨터에서 실행되고 있는 프로그램을 일컬어요. 프로세스와 프로그램이 같다는게 아니라 프로세스와 실행 중인 프로그램이 같다는 것이지여! 프로그램은 일반적으로 우리가 실행하는 실행할 수 있는 실행코드이고, 프로세스는 프로그램이 실행 되면서 부터 메모리에 상주하여 실행되는 것을 의미해요.


오홍 그러면 실행시키지 않은 프로그램이나 메모리상에 없는 프로그램은 프로세스가 아니겠군여!! 메모리상에 없을 수 있는 프로그램도 있긴 한가여? 헿헤헿 메모리에서 돌아가고 있는 실행코드를 프로세스라고 한다는 것은 이제 아쥬 자아아알 알게써여!


Thread

쓰레드(Thread)란 프로세스 내에서 실행되는 흐름의 단위예요. 프로세스는 직접 메모리와 매칭되어 메모리를 차지하고 있지만, 쓰레드는 프로세스 내에서 실행되기 때문에 메모리를 공유하여 사용하지요! 쓰레드를 이용한 개발을 해보신 분이라면 임계영역(리눅스에서는 Mutex, 윈도우에서는 Critical Section)을 Lock / Unlock하여 Deadlock이 걸리지 않도록 코드를 구현해 보셨으리라 생각해여! 저도 처음 C언어를 접했을 때 그랬거든여! 하.. 또 이 얘기를 말하자면.. 구현해보신 쓰레드는 보통 사용자 영역 쓰레드였을거예요. 우리는 곧 커널 영역 쓰레드를 다룰 테니 넘나 설레고 흥분되어도 조금 침착하고 우선 멀티태스킹부터 구현해보아여!!


이러한 쓰레드와 프로세스의 단위가 태스크라는 것 같네여!? 그런데 또 어디서는 프로세스와 태스크가 거의 같다고 해여! 사람들의 말이 전부 다르니 무엇을 믿어야 할 지 잘 모르겠다면!! 컴알못 야미가 정확한 정의를 내려보도록 해보겠습니다!(컴알못이 무슨 정의를 내리겠어여.. 하늘에서 정의가 빗발친다!!)




사실 야미는 옵치를 몇 판 안해본 옵알못... 이정도면 취미도 없고 아는것도 없고 거의 무지의 극치네여 ㅜㅠㅜ 하지만 빠워긍정킹이져!! 핳하핳하하핳!!


프로세스는 실행 중인 프로그램을 의미하는데, 이것은 실행코드와 전역 데이터 그리고 지역 데이터 및 그 외 실행에 필요한 데이터들이 메인 메모리 내 각 영역에 저장된 상태를 의미해요. 즉 실행 중인 프로그램의 모든 데이터가 메인 메모리에 위치하고 있고, 그것을 프로세스라고 부르는 거죠! 이 대단한 프로세스는 태스크를 단위로 사용되어지구요!


그렇다면 태스크는 프로세스의 단위이니, 프로세스 1개에 태스크가 여러 개가 될 수 있을까요? 네!!! 가능하답니다!!! 태스크는 스케줄링 기법을 이용하여 짧은 시간동안 여러 일을 처리하여 동시에 여러 작업을 하는 것 처럼 만드는 멀티태스킹(Multi Tasking, 오늘 첫 주제였지만 제법 늦은 시간에 등장하신 그 분..)을 이용하는 것이지요!! 크~ 멀티는 참 좋은 것 같아요. 멀티를 해야 미네랄도 많이 캐구 가스도 많이 캐구 땅도 넓어지구 즉 프로세스 안에서 태스크가 작동하는 것 같은 느낌이지 않나여?!

하지만 멀티프로세싱(Multi Processing)이라는 용어도 있어요. 이것은 프로세서(CPU 혹은 마이크로프로세서) 여러 개가 병렬작업하는 것을 일컬으니, 멀티태스킹은 소프트웨어적 기능이고 멀티프로세싱은 하드웨어적 기능이라고 생각하는게 더 빠르게 와닿는 것 같아요!


그리고 쓰레드는 프로세스 내의 메모리 영역을 공유하여 실행되는 흐름의 단위라고 했으니... 이제 조금씩 감이 잡히시나여?

벤다이어그램을 머릿속으로 그려보세요!


Process > Task && Process > Thread


넹.. 아무래도 태스크와 쓰레드는 프로세스라는 공통점이 있을 뿐, 서로의 공통점은 없는 것 같아요.



요런 느낌일까요..? 이렇게 태스크와 프로세스와 쓰레드를 정의해본 결과, 우리는 멀티태스킹을 알고 싶었을 뿐인데 이름은 다르고 뜻이 비슷한 것들을 알아보게 되었다고 합니다~!! 죄송해여.. 정신없는 야미라서..

자! 그럼 이제 멀티태스킹을 한 번 알아보러 가여! 태스크를 이해하셨다면 멀티태스킹은 딱 느낌 아실 것 같아요.


Multi Tasking

멀티태스킹(Multi Tasking)이란 여러 태스크가 CPU같은 공용 자원을 나누어 사용하는 것을 의미하며, 실제로는 한 개의 CPU는 한 개의 태스크만 수행할 수 있기 때문에 이것을 스케줄링 기법으로 병렬 처리하여 여러 개의 태스크를 동시다발적으로 처리하는 것처럼 해주는 작업이예요! 인터넷도 하면서~ 노래도 틀어놓고~ 카톡도 하고~ 막 이것 저것 할 수 있는 이유이죠!


이 때 새로운 용어가 튀어나와요. 여러 개의 태스크를 동시다발적으로 처리하는 것처럼 해주는 작업은 바로 문맥교환(Context Switch)이라는 용어로 줄여 말할 수 있는데, 그렇다면 문맥은 뭐고 문맥교환은 무엇일까요?!



이 그림이 가장 이해하기 쉬운 것 같아요! 위 그림은 Mode Switch와 Context Switch의 차이점을 아주 쉽게 그림으로 그린 것인데, Mode Switch는 32비트 보호모드로 전환할 때 보셨죠!?


Context

문맥(Context)이란 태스크에 사용되는 최소한의 데이터 집합으로, 진행중이던 작업을 잠시 멈추어 그 상태까지 저장해두고, 나중에 다시 복원했을 때 진행하던 상황부터 이어서 작업하는 것을 해주어야 하는 까칠한 녀석이예요.


나닛.. 그렇다면 저장해주고 복원해주는 그 작업이 바로 스위칭이 아닐까여?! 정답입니다!! 박수쨕쨕~~


문맥교환(Context Switch)이란 컨텍스트를 저장하고 복원하는 작업으로, 멀티태스킹이나 인터럽트 핸들러에 사용되어진다고 해요.


그럼 이제 이번 챕터에서 나올 것 같은 용어는 다 정리한 기분이예여!!

아직도 프로세스와 쓰레드, 문맥교환이 더 알고싶다!! 잘 모르긋다!! 하시는 분들을 위해 도움이 될 사이트를 던져드릴게여! 폭탄받아랏!!



오버워치에서 정크렛이라는 챔피언의 궁극기의 현실판.gif... 웃어야할지 걱정해야할지 잘 모르겠네여ㅜㅠ


Process / Process Scheduling / Inter-communication에 관한 URL : http://www.cs.odu.edu/~cs471w/spring10/lectures/Processes.htm

Context Switch 에 관한 URL: https://www.ibm.com/support/knowledgecenter/en/SSGU8G_11.70.0/com.ibm.admin.doc/ids_admin_0273.htm


이제 책을 보니... 아직 한 페이지밖에 안나갔네여? 뭐 15일차쯤 되니 야미는 매번 이런 식이라 익숙하시져? 헤헿... 오늘도 역씨 갓승훈님의 책에 설명과 그림이 자세히 나와있어서 제가 더 설명 드릴 것이 없네여ㅜㅠ

다음 페이지로 넘어가니 선점 방식과 비선점 방식이 나오는데 이거 운영체제 이론에서 다루는 것.. 그 때 공부좀 할 걸 그랬나여..


Scheduling

선점(Preemptive)방식은 우선순위가 더 높거나 중요한 프로세스가 실행되었을 때 이미 수행 중인 작업을 강제로 중지시키고 먼저 자리를 차지하는 방식이예요. 선점하다! 선빵때린다! 내가 먼저 차지한다는 느낌이죠! 우선순위를 잘 할당해주는 시스템이라면 이 방식이 더 안정적일테죠. 그래서 현대의 OS는 선점방식을 이용한답니다!


비선점(Nonpreemptive)방식은 우선순위나 중요한 프로세스와 관계없이 시스템이 수행 중인 프로세스를 건드리지 않고, 수행 중인 프로세스가 스스로 CPU를 반납하도록 하는 방식이예요. 시스템적으로 오류가 발생하여 인터럽트 처리를 해야할 때, 이미 수행 중인 프로세스가 있으면 인터럽트 처리를 하지 못하게 되어 시스템이 고장나기 때문에, 위험성이 따르므로 사용자 영역 쓰레드에서만 사용되는 기법이지요.


운영체제 이론에서 보통 스케줄링과 함께 나오는 두 가지 기법을 살펴보았어요! 아까부터 스케줄링 스케줄링 이야기하는 야미인데, 정작 스케줄링을 설명드리지 않았네여!!!


스케줄링(Scheduling)이란 쓰레드, 프로세스, 데이터 흐름에 대해 시스템 자원을 사용할 수 있게 해주는 방식을 말하는데, 제가 미리 설명하지 않은 이유가 있어요. 왜냐하면!! 스케줄링 하나로만 포스팅 2개는 거뜬할 양이거든여!! 엄두 나지 않을 만두 하지 않나요!?ㅜㅠㅜ 그래서 최대한 양이 적은데 속은 알찬 자료를 첨부해드릴게여!!


Section05-Scheduling.pdf


이런거 막 올리면 안되는건가여!? 저 분이 누구신지도 잘 모르지만!! 너무Vㅔ리 설명을 잘해놓은 pdf라서 저도 모르게 그만...

제가 영어로 된 소스와 사이트만 올려드리는 이유는 사실 한글로 번역된 번역본이나 한글 저서를 읽는 것보다 영문이 더 이해하기 쉬운 분야가 저희 IT라능... 한글로 주저리주저리 써도 머리로 이해가 안가는데 영어(참 사실 야미는 아직 토익도 귀찮아서 안보고이써여 ㅎㅎㅎㅎ영존못이예영 ㅜㅠㅜ)를 읽으면 아! 이런건가 보다! 하고 좀 더 빠르게 와닿더라구여! 저만그런가여?! 쭈굴...


이제 갓승훈 선생님이 머리에 쏙!쏙! 박히도록 적어주신 설명으로 충분히 이번 챕터를 마무리 할 쑤가 이써여!!! 한 번더 박수 쨖쨖~~☆


저는 이 챕터에서 코드를 구현하다가... 문득 이런 생각이 들어써여!!

'왜 Context 자료구조의 레지스터 오프셋을 꼭 0부터 순차적으로 시작하는거지!? 레지스터 오프셋은 임의로 넣는 것이 아니라고 알고있었눈데!? 모지! 왜지!'

세그먼트 셀렉터의 순서에 따라 코드 세그먼트인지, 데이터 세그먼트인지를 넣어주기 위해 임의로 정의한 전처리문인 것 같긴 한데, 어떻게 찾아야할지 방법을 모르겠네여 ㅜㅠㅜ 넹? 세그먼트 셀렉터는 순서가 있는거냐구여?

어셈블러에서는 Stack구조를 이용하니 push할 때마다 위에 차례로 쌓여가니까 나중에 pop할 때, 중간에 레지스터를 이용할 때를 위해 순서가 존재하게 되어요! 순서가 꼬이면 값도 꼬일 수 있구요! 베베 꼬이면 스크류바처럼 춤추는건가여!? 너 춤신춤왕이닝!?



이렇게 이번에 우리는 멀티 태스킹에 대해 아주 간~단히 알아보았어요!! 이제 쉬는 날이 많아졌으니 포스팅 열씸히 하도록 해볼게영!! 다음 챕터에서 라운드 로빈 스케줄러... 아... ㅎㅎㅎㅎ스케줄링 포스팅을 한 번 해야될 것 같은 이 불안감 엄습은 무엇이져..ㅠㅜ 다음 포스팅에서는 우리가 사용할 라운드 로빈 스케줄러와 멀티레벨 큐 스케줄러, 그리고 기본적으로 배우는 스케줄러 몇 가지를 간략히 포스팅 하고 다음 챕터를 진행하도록 할게여!!


라고 얘기한지 8시간이 지난 지금까지 양심이 푹푹 찔린 야미는 하루종일 고민해써여.. 뭘 더 설명해야 하는데 어디부터 해야할지..

TSS

그러다 문득!! IDT, IST 디스크립터를 만지작만지작 했을 때 나왔던 TSS 기억하시나여?! 10일차에서 TSS에 대한 개념 설명을 드렸어여! 다시 한 번 살짜쿵 말씀드리자면 TSS란 Task State Segment의 약자이며, 태스크에 대한 정보가 들어있는 자료구조입니다.



이 그림은 처음보시져?! 좀 더 익숙한 그림으로 가져와볼까여? 그켬이겠지만 보시면 아!! 이거!! 이놈!! 이XX!! 하실 그림이 짜잔~하고 준비되어있답니다!



그래요 이거!! GDT할 때 주구장창 DPL과 Base Address 이녀석들!! 먼저 첫 번째 사진으로 설명을 드려볼게여 ㅎㅎ


Previous Task Link : 문맥교환할 때 저장한 값을 나중에 복원하기 위해 사용되는 링크. 링크드리스트(LinkedList)를 생각해보세여! A ← B ← C 순서로 노드가 가리킬 때, B가 사라지면 A ← C 가 되고 다시 A와 C 사이에 D가 들어오면 A ← D ← C 순서가 되기 위해서는 각 노드와 주소값을 가지고 있지 않겠나여!! 그런 친구랍니다!

그 다음으로 나오는 ESP 레지스터와 SS 레지스터는 많이 보시지 않았나여? 왜 뒤에 숫자가 붙어있냐구여!? 크~~ 눈치 좋으시네여 여윾시 IT 계열이라면 이정도 눈치 한 두 개쯤 누구나 갖고있는거 아입니꺼!(사실 그 위를 보면 숫자가 안붙어있는 ESP 레지스터와 SS 레지스터가 나와요 핳하)


ESP0 ~ ESP2 / SS0 ~ SS2 레지스터의 숫자는 권한 레벨을 뜻해요. 0번은 커널, 3번은 유저 권한인데, 여기는 왜 2번까지밖에 없는걸까요! 바로바로 그 위의 ESP, SS 레지스터가 3번이랍니다~! 프로그램을 디버거로 뜯어보면 ESP와 SS 레지스터가 요래조래 변하는데, 이 때 레지스터가 레벨 3의 권한을 갖고 있는 유저영역의 레지스터라는 뜻이죠!

CR3 레지스터는 메모리 관리를 위한 Page Directory의 물리 주소를 갖고있는 레지스터예요. 물리 주소라니!! 넘나 중요한것!! 빨간펜으로 별표 5개!! 장수돌치ㅁ.. 그래서 이 레지스터를 다른 말로 Page Directory Base Register(PDBR)이라고도 하지요!

이제 그 외 우리에게 익숙한 친구들이 마구 PUSH PUSH BABY~ 하고 있지요?! 열씸히 레지스터들이 PUSH 된 후 LDT Segment Selector라는 녀석이 등장하는군요.. 훗 짜식 긴장해야게꾼... 그런데 익숙해 보이시지 않나여? LDT? GDT? 아!!!

네 그렇슴다!! GDT 디스크립터를 공부할 때 IDT가 아닌 LDT를 공부했었어요! Global과 Local의 차이!!

그 다음으로 있는 I/O Map Base Address는 보기만해도 알 것 같은 입출력 포트의 매핑 테이블 주소를 알려주는 것 같군여!(사실 제 코드를 보시면 전부 저런 식으로 줄여둬서 자주 해석하다보면 뒤에 숨겨진 의미가 보이실거예여.. 이 말인 즉슨 남이 제 코드를 보면 뭔말인지 이해를 못하는 것이 되죠 꺌꺌)


이렇게 TSS 디스크립터를 알아보았지만 그 아래 그림은 아직 접근도 안했다는 사.실☆

솔직히 디스크립터들 다 비슷비슷해여~ IDT나 GDT나 TSS나!!(야미야 이렇게 얼렁뚱땅 넘어갈 생각은 다메다메다메) 그래서 전 차이가 나는 플래그 부분을 설명드릴게요!


AVL(Available) : 시스템 소프트웨어에서 사용되며 OS가 임의로 사용할 수 있는 영역이예요.
B : Busy 플래그를 의미해요.
DPL(Descriptor Privilege Level) : 디스크립터 포스팅 때마다 설명드리는 것 같긴 하지만, 아무리 봐도 친숙하지 않기에... 권한 레벨을 의미해여!
G(Granularity) : 세그먼트의 크기 단위 지정 플래그인데(찾아보니 이것도 설명했었지만..), 0으로 설정하면 가중치 없이, 1로 설정하면 4KB 크기만큼 가중치가 생겨 4GB의 메모리를 쓸 수 있게 해주던 그 플래그!!
P(Present) : 현재 디스크립터가 세그먼트의 메모리상에 존재하는지 여부를 알려주는 플래그예요.


사실 모든 세그먼트 디스크립터는 한정된 플래그 속에서 사용되는 것이 조금씩 다를 뿐이라, 세그먼트 디스크립터 하나만 뙇! 공부하면 되는데 야미는 멍청해서 하나 하나 다 살펴보고 있네여ㅜㅠㅜ 머리가 나쁘면 몸이 고생한다구... 그렇게 해서라도 공부하는게 더 중요하다고 저는 생각함니다!!!


그런데 갑자기 TSS에 대한 상세설명이 왜 튀어나왔냐구여? Task는 태스크 실행하는 부분에 있어서 프로세스와 쓰레드라는 부분과도 연관이 있지만 세그먼트 레지스터에 의해 태스크가 처리될 방향이 정해지기 때문이예여! 왜 아깐 이 생각을 못했을까여! 야미는 역시 야행성이 답인가봐영 ㅎㅎ헿

이러한 TSS 영역은 GDT 디스크립터에서 Base Address와 Segment Limit을 통해 생성시켜준답니다! 정보가 더 필요하신가여?! ㅜㅠ 열씸히 설명해 드렸는데... 출처는 아니지만 여기 설명 괜찮은 것 같으니 한 번 보시면 좋을 것 같아요!

참고 URL : http://wiki.osdev.org/Task_State_Segment


어쩌다보니 또 약간 스크롤 압박이 생겨버렸네여... 열씸히 공부할 쑤 있으니 좋은거죠 뭐!!(짤방과 여담이 반이면서 말은 무슨) 넵 그러면 이제 정말로 다음 챕터로 넘어가보아요!! 뿅!!


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

카테고리:

업데이트:

댓글남기기