[yummyHitOS] 21 day (2017.08.06)

6 분 소요

안녕하세요 여러분!! 야미가!! 드디어 와써여!! ㅜㅜㅠㅜ 나닛 2달이나 지났네여!?

먼저 사죄의 글을... 변명과 핑계로 가득한 말씀을 드리자면...



10월 23일부로 입사를 하여 회사 업무에 얼른 적응하고자 아무것도 신경쓰지 않고 먼저 회사일에만 전념했어요!!!

그런데 병행하던 웹개발을 그만 둘 처지가 아니어서 웹개발도 같이하고... 그러다보니 제 시간이 없더라구여!! 그래서 결국 글을 포기하고있었지요!!

이제 회사업무도 적응했겠다..(고작 한 달 만에!? 야미님 너무 자부심이 큰데여? 큰코다치셨으면 좋겠네여 뿌엥) 명함도 나왔겠다... 흫흐흫흐흫ㅎ 직장인이라니 아직도 실감이 나지 않네영!!


이 마음같아선 회사 코드도 오픈소스로 숑숑 올리고 싶은 마음이 굴뚝같지만, 개인이 아닌 단체라는 회사의 코드를 제가 맘대로 그럴 슈는 없지여!! 돈벌어야져!! 이 코드가 다 돈인데!!

대신 포스팅을 쉬던 그간 익힌 코딩을 나중에 알려드리져!! 리눅스와 유닉스, C언어와 Shell Script에 대한 것이랍니당~!! 막 흥분되고 그러시지 않나여? 하앍 리눅스 유닉스 C언어 Shell 스크립트 이거 단어만 들어도 전 막 흥분되는걸여... 그래서 외톨인가봄..흑


이렇게 말씀드려도 화가 가라앉지 않으시다구여? 흑흑 제가 어떻게 해드려야 그 동안 포스팅 못한 벌을 받을 수 있을까여?! 달게 받을게여ㅜㅠ

원래 이번에 실행화면 출력하기로 했었는데... 문제가 생겨써여!!!


당연히 제가 이 전에 한 챕터를 나갈 때마다 저장했을 꼼꼼이가 아니란건 다들 아시져!? 헤헤ㅔㅎ 그래서 전 항상 이 전 깃헙 소스코드를 다시 가져와서 컴파일하고, 그 출력을 여러분께 보여드리고 그랬는데...

제 소스코드는 리눅스용이라는 것을 여러분은 아실거예여!! 매번 리눅스로 오시라고 찬양글을 했던 것 같으니까여!! 꺄룰~


그런데 리눅스는 64비트 환경에서 진행하기에 상관이 없는데... 윈도우는 어떻게 고쳐야 했는지 기억이 가물가물해서여 ㅜㅠ 내일 출근해야하니 시간도 없고...

그렇다고 이미 하기로 시작한 포스팅을 그만 둘 수 없어서!!! 이렇게 다음 챕터를 나가게 되었쓰ㅃ니다~!! 빠라람~~(사실 저거 오타가 아니라 연출이예여 기분 상승을 위한 연출!!)


Dynamic Memory

이번 챕터에서는 동적메모리를 사용한대여!! 여러분 동적메모리 많이 들어보시지 않으셨나여!? alloc, malloc, calloc, realloc은 C, C++ 전용 동적메모리 할당, new 는 객체지향의 동적메모리 할당..!!



이건 Java의 객체 저장 방법이예요! 이렇게 모델링이 된다고 하네요!! 보시면 아시다시피 String[] args 라는 String 배열 변수인 args를 선언하는데 args는 스택에 쌓이고, 힙 클래스를 참조하는 것 같이 보이지 않나여!?

Employee라는 클래스(혹은 구조체일 수도 있겠지여!?)에 name, ssn, emailAddress, yearOfBirth 라는 객체(혹은 멤버)가 있는데 그것을 사용하는 방법이 화살표로 쭈욱쭉쭉 되어있네여!!

물론 Java에는 구조체가 없어 클래스의 생성자를 통해 사용되어지지만, 제가 C언어와 비슷하게 생각하시라고 말씀드린거예여!! 헿헤헤 별로 비슷하지 않다구여? 넵... 전 그냥 조용히 C언어나 할게요T^ T


즉, 동적메모리란 실행 시간동안만 할당되어질 메모리를 의미하는데, 사용이 끝나면 운영체제에 반납하고 재실행이 필요할 때 다시 할당받을 수 있는 메모리예요. 사용이 끝나는 기준은 프로그램 실행이 끝날 때이거나, 우리가 임의로 free(), delete[]와 같이 메모리 할당을 해.제! 시키면 되는거지요!


조금 더 편하게 설명해드리자면, 정적메모리는 int a[100] = {0,}; 와 같이 4bytes 크기를 갖는 100개의 a 배열을 선언한 것이예요. 그러면 스택 메모리에 400bytes만큼의 메모리 공간을 차지하겠죠!? 그런데 우리가 사실 쓰는 배열이 30개밖에 없다면 나머지 70개는 너무 메모리 소비가 크지 않나여!? 그렇다고 우리가 30개만 쓸지 안쓸지는 처음부터 알 수 없다면여!!! 빼액!!!!


example

흥분해서 죄송해여... 이러한 정적메모리는 다음과 같은 선언이 불가해여.

int size = 0;
printf("How much memory do you want to use(with Byte)?\n");
scanf("%d", &size);
size = size / 4;
int array[size] = {0,};


이렇게 하면 빼애액~ This is not available declaration!! WTF!!! 라고 나오진 않겠지만 이런식으로 나와요!

배열의 크기는 상수값을 받거든요!! 그렇기 때문에 우리가 원하든, 원치않든, 자릿수를 정해주지 않는 한 입력받을 수가 없어여 T^ T 입력받은만큼만 입력하고싶단 말이예여...


이럴 때 나온 친구가 동적메모리 빠밤! 등장!

int size = 0;
printf("How much memory do you wnat to use(with Byte)?\n");
scanf("%d", &size);
int *array_ptr = (int*)malloc(size);


과연 이친구는 에러가 안날까여!? 안나니깐 이렇게 막 멋진친구인듯 소개시켜드렸겠져!?

우리가 원하는만큼 할당이 가능하며, 쓰지 않으면 free(array_ptr); 을 통해서 해제를 시켜줄 수 있어요!! 재할당도 언제든지 환영화닝이구여!!(Huānyíng!!) 포인터를 쓰신다면 언제든 동적메모리를 찾아주세여!! 참고로 알고리즘 잘 생각하셔야... 메모리 꼬이면 머찐 Corruption이 쾅쾅 나타나서 우리를 피곤하게 할테니까여.. :<



꿀렁꿀렁~ 전 몸이 뻣뻣해서 춤 완전 못추는데.. 여러분은 춤 잘추시나여? 왜 또 삼천포로 빠지냐구여? 2개월이 지나도록 야미는 뭐 변한게 하나도 없냐구여? 죄송함댜... 반성하겠슘다...ㅜㅜ

나중에 웹개발도 포스팅을 초큼 할게여!! 참!! 야미위키.... 이거 너무 창피하지만 야미위키를 쓸 날이 올 것 같아여... 나무위키와 제타위키같은 위키여!! 전 조금 다르게 지금 포스팅 형식처럼 위키를 써드릴게여!! 그럼 강심장만 볼 수 있겠져?! 오글거리는 야미의 포스팅형식 위키라닠ㅋㅋㅋㅋ어후 제가봐도 싫네여 이거...꺄룰~


마지막으로 동적메모리를 위키백갓이 설명해주는 아리따운 그림과 함께 (꼭 끝낼 것 같은 멘트이지만 이제 동적메모리 단어 1개 설명 끝나써여!!) 다음으로 넘어가볼게여!!


memory diagram


위 사진 보시면 조금더 잘 이해되시나여? 어떤 데이터와 어떤 선언이 어떤 메모리에 쌓이는지여!! 역씨 우린 OS를 만들며 어쎔블리어를 하고있으니 이런 메모리구조쯤 이미 뇌의 한 부분에 메모리 장착한 듯이 자리잡고 있지여!?


책을 살펴보면 메모리 관리(Memory Management)와 함께 Paging 기법과 Segmentation이 나오네여!! 반갑지 않으신가여!? 페이징 기법은 우리 7일차에서 한 번 다뤘었어여!! 7일차 를 참고해보세여 헿헤

세그먼테이션은 그냥 뭐.. C언어로 포인터만 살짝 건드렸다하면 나오는 오류잖아여 ㅜ ㅠ Segmentation Fault라고.... 도대체 내가 뭘 잘못 건드렸다고 오류나는지 모르는...


둘 다 기억이 안나신다고 하신다면 !!! 제가 아주 짜~ㄹ막하게 설명드리고 넘어갈게여!! 시간이 늦어버려서 출근하기 위해 잠을 자야해여!! 요새 몸이 안좋아져서 별명이 픽쓰가 될 것 같거든여!! 픽쓰는 창피하니 비밀...헿


Segmentation 기법은 메모리를 서로 크기가 다른 논리 단위인 Segment로 분할하고, 이 분할한 Segment에 메모리를 할당하는 기법이예요. 세그먼트라는 단어 거의 매 포스팅마다 들으셨져!? 테이블에서 base와 limit으로 크기 조절하는 것도 보시구여!! 이제 기억 나시나여!?


Paging 기법은 세그먼트와 다르게 고정된 하나의 블록인 Page를 이용하여 메모리를 관리하는 기법이예요. 불연속적인 메모리를 연속적인 고정된 크기로 관리하면 조금 더 효율적일테니 말이예요!


위 Segment와 Page는 가상메모리의 논리 블록이예요. Page같은 경우 물리 메모리와 서로 상응해야하는데, 이 때 물리 메모리에도 Page와 같이 고정된 크기로 메모리를 분할한 Frame이라는 녀석이 있어요! Page를 통해 Frame의 번호를 알아내고, Offset만큼 더하여 물리메모리에 상응하는 그런 구조이죠!!


Fragmentation

오랜만에 메모리를 마구마구 파헤치니 이 늦은 새벽에도 기부니가 좋네여!! 이제 다음으로 넘어가면 메모리 단편화(Memory Fragmentation)와 외부 단편화(External Fragmentation)가 나오네여! 단편화란 도대체 무엇일까여!?


"단편화(Fragmentation)는 기억 장치의 빈 공간 또는 자료가 여러 개의 조각으로 나뉘는 현상을 말한다. 이 현상은 기억장치의 사용 가능한 공간을 줄이거나, 읽기와 쓰기의 수행속도를 늦추는 문제점을 야기한다." 라고 위키백갓이 설명해주는데, 저는 글보다 그림이 머릿속에 쏘옥쏙쏙! 들어오기에 그림으로 알려드릴게여!



벌써 감을 잡으신 분은 저와 1:1 오프라인 수업좀... 시켜주세여 제가 배울게여 사랑합니다 ㅜㅠㅜ

현재 test라는 디렉터리 안에 test라는 파일이 있는데, 이 파일은 제가 적은 대로 "hello!\nyummy!\n" 만큼의 총 14Bytes 를 갖고 있기에 단편화가 적용되지 않은 예지만... 디렉터리를 한 번 보시겠어요!? hello 라는 디렉터리에는 현재 아~무런 파일도 없는데 4096 Bytes(4KB)의 크기를 갖고 있어요!! 왜죠!? 왜 이렇게 용량을 혼자 쳐묵쳐묵 하는건가욧!!


이게 바로 페이징 기법의 단점이예요. 페이징 기법이 고.정.된 블록크기라고 했잖아요?! 4KB만큼의 크기를 기본으로 먹는다는 이야기이죠! 이게 윈도우로 넘어가면 어떻게되는지 볼까요!?



분명 이 png 파일의 크기는 6,174 Bytes인데 왜 디스크 할당 크기는 8,192 Bytes나 먹는 겁니까!! 왜여!! 내 용량을 너님 맘대로 막 먹지 마시라구여!!

이런 경우 많이 보셨나여!? 왜이렇게 디스크가 용량을 많이 차지하는가.. 보시면 이놈의 디스크 할당 크기로 인해 디스크 용량을 무지막지하게 먹어요 ㅜㅠ 15년식 삼성 노트북이 SSD 128GB짜리 세일했을 때 이로 인한 피해자들이 속출했었죠.. 저희학교도 마찬가지로 핳핳핳하하핳ㅎ 전 그당시 12년식 삼성 노트북을 사용했구여!! 서로 힘들어했다능...


여러분 저런 단편화 문제가 페이징 기법때문이라고 말씀 드렸잖아여? 그럼 아래와 같은 화면 아주 익숙하실거예여!!



리눅스 설치하거나 외장하드 포맷할 때 자주 보시지 않으셨나여?! 윈도우에서 포맷할 때 나온느 이 정겨운 창!!

저기 파일시스템과 할당 단위 크기가 보이시져!? 이 때부터 우리는 디스크에게 용량을 바쳐온 것이었습니다 ㅜㅠㅜ 1byte만 쓰여진 텍스트 문서도 4KB를 할당시켜버렸으니... 얼마나 낭비가 심해여 ㅜㅠ

여기까지가 외부 단편화가 아닌 일반 내부 단편화 이야기랍니다!! 아직 외부 단편화는 시작도 안해써여!! 꺄핳하하하핳 오랜만에 불태워보자구여!!


external

외부 단편화(External Fragmentation)를 말로 설명 드리자면, | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 이라는 10개의 공간이 있는데(이거 그림 꼭 mariaDB, mysql 같지 않나여? 쓸모없는소리 죄송함댜... 요즘은 쓸모없는것도 쓸모있게 알아두라는 알쓸신잡.. 넵... 죄송함다.. 쭈굴 ㅜㅠㅜ), 변수 a는 1,2를 사용중이고 변수 b가 3,4,5를 사용중이예요. 그리고 변수 c가 6,7,8을 사용중일 때, 변수 b가 반환되고 변수 d가 4개 만큼의 공간을 필요로 한다고 가정해보세요.

| ① | ② | 3 | 4 | 5 | ⑥ | ⑦ | ⑧ | 9 | 10 | 에서 4 만큼의 공간은 존재하지 않으니 할당될 수 없겠죠!? 그렇게 되면 3,4,5 저 3만큼의 크기는 더 이상 쓰기 어렵다는 이야기가 되어버려요! 이게 바로 외부 단편화의 단점이랍니다!


이제 말이 아닌 그림을 보여드려야 인지상정이겠져? 헿헤헿 로켓딴!!



이제 어떤 의미인지 감이 딱! 오시나여!? 오늘 배운게 여기 다들어있네여!!


우리는 버디 블록 알고리즘을 통해 동적 메모리 할당을 해준다고 하네요. 꼭 알고리즘에서 Divide & Conquer 알고리즘을 반 자른 것 같기도... 그렇지 않나여!? 이름만 다를 뿐 뭔가 Divide 의 모습도 있고 Conquer 모습도 있고 ㅜㅠ 이름 참 복잡하게 많네여!!


이제 구현만 책을 따라 하시면 이번 챕터도 무난~히 끝~ 나야하는데~ 저는 왜~ 마지막 명령어 중 testranalloc 커맨드가 또 13번 에러(General Protection Fault)가.. 저를 항상 괴롭히는 것은 벡터의 13번 에러네여 ㅜㅠ 저 13이라는 숫자와 뭔ㄱ ㅏ있나바여... 13일의 금요일.. 전기톱 살인사건..!? 에이 아니겠져 헿헤헤


여러분 다시 한 번 이제서야 돌아와서 죄송하며... 앞으로 짬짬이 시간 내서 열심히 포스팅 하도록 할게여!! 그리고 조만간 현재 저의 고민에 결과가 좋은 쪽으로 난다면 그 고민도 들려 드릴게여!!


이번 포스팅에서는 시간에 쫓기고 내용에 쫓겨 짤이 별루 없었네여 ㅜㅠ 막짤은 저의 외로움을 대변해주는 귀염둥이 원숭이와 함께 인사를 드릴게여!! 다들 담에 뵈어요!!



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

카테고리:

업데이트:

댓글남기기