211027, C언어 입문 day 12-1
뭐 뭋친 공부만 하면 잠이오냐. 인간의 본능인갑다. 책 피면 잠온다. 어쩔수 없다..
그래도, 공부를 해야 도태되지 않으니까. 어떻게든 꾸역 꾸역 공부했다. 솔직히 이런게 있구나~ 정도로 알기만 했지 익숙해지려면 오늘 공부한 부분도 좀 써먹어야 알듯. 솔찍히 fopen 이런 입출력 라이브러리 무시기도 왜 쓰는건지 완전히 이해 못했다. ㅋㅋ;
일단, 오늘 복습할 파트나 슥 살펴보자.
16장, 메모리할당
16.1
내가 지금 공부하는 이 코딩. 쎄빠지게 하고있는 소스파일 작성. 다 무엇을 위해 하는가? 바로 "프로그래밍". 프로그램을 만들기 위해서다.
근데 만들어진 실행 파일인 .exe 속의 명령들은 CPU가 직접 실행할 수는 없다. 운영체제가 명령들을 읽고 ~ 그걸 메모리에 재구성 해서 ~ CPU가 실행시킨다. 이 "운영체제가 명령을 읽고 메모리에 재구성하는 과정"을 Process라고 한다.
근데 또 이 Process가 단순하게 이뤄져있냐? 아니다. 더럽게 복잡하다. 여러 메모리 공간인 Segment 세개를 포함하고 있다.
Code segment , Data segment, Stack segment. 이렇게 세개.
요렇게 구성하고 있다.
기계어 명령들은 '코드 세그먼트'에.
프로그램에 사용되는 이런 저런 데이터들은 '데이터 세그먼트'.
지역변수같은 임시 데이터들은 오늘의 주인공이 될 '스택 세그먼트'에 저장된다.
오늘은 "메모리 할당"이란 것을 복습할 것이다.
만약 나한테 20만원이 있다. 그러면 이걸 무지성으로 쓰냐?
나 "gom1nh", 무지성으로 돈을 쓰는것은 나 자신에게 용납할 수 없다.
뭐 10만원은 식비, 8만원은 쇼핑, 2만원은 비상금. 이런 식으로 미리 용도를 나눠놓는다.
메모리 할당이 이런거다.
운영체제가 20만원어치 있으면, 각 메모리 공간을 식비 / 쇼핑 / 비상금으로 용도를 나눈다. 이런 넉김으로 데이터를 저장할 메모리 공간을 적절히 나누는 작업을 "메모리 할당" 이라고 한다.
근데 이건 컴퓨터가 알아서 해주는게 아니다. Programmer가 알아서 해줘야 하는 과정임.
그 방법 두개중 하나. "정적 메모리 할당".
Static Memory Allocation 이라고 한다. 좀 있어보인다.
어 근데 static? 어디서 본 친구 아닌가?
static을 붙임으로서 그 함수에서는 전역변수처럼 역할을 할 수 있다. 지역변수의 포지션을 가지면서 기능은 전역변수를 가진다는거지. 그래서 Test를 호출 할 때마다 그냥 그딴거 상관없다는 마인드셋으로 자신이 가지고 있는 값을 유지하게 된다. (210906, 7일차 복습 내용 참고)
그렇다. 이런 역할을 해주는 친구였따. 이게 뭔 상관이냐고? 그냥 그렇다고. 복습해둬라고.
여튼, 프로그램이 실행될 때 메모리크기가 이미 결정되어있고, 실행 중간에 크기를 변경할 수 읎는 메모리를 "정적으로 할당된 메모리"라고 한다.
그리고 컴파일러가 코드를 기계어로 번역하는 시점에, 변수를 저장할 메모리 위치를 배정하는 것을 "정적 메모리 할당"이라고 하고.
좀 두서가 없는데, 알아서 보자
이렇게 할당 받은 메모리도 지역변수인가. 전역변수인가에 따라 유지되는 시간이 다른데. 이건 내가 아는대로 알면 된다.
전역변수는 프로그램이 끝날 때 까지 지 공간이 따로 있지만, 지역변수는 함수 호출 / 종료가 반복될 때 마다 매번 다른 메모리 공간에 할당이 된다.
16.2
자 stack 나오셨다. 필자가 재학중인 모 대학에서 악명 높은 과목인 "자료구조"의 한 분야인 stack 형님.
우선 Stack 이란?
"두 개의 포인터로 많은 양의 데이터를 효과적으로 관리하는 이론"
맨 밑에 깔려 있는 Base Pointer (BP) 를 기준으로, 데이터가 추가될 때마다 순서대로 쌓아 올리는 구조다. 새 데이터가 추가 될 위치는 Stac k Pointer (SP) 가 가리키고. 앞서 언급한 정의를 보면 "두 개의 포인터"가 BP, SP인 셈이다.
그림으로 대충 설명을 해주면.
이런 식으로, 맨 밑에 BP가 깔려있고, 가장 최근 데이터인 3에 SP가 가있는데, 여기에 4를 추가 (추가하는 과정을 Push라고 함)하면 SP가 4로 따라간다. 만약 4를 제거 (Pop) 하면 SP가 다시 3으로 가겠지.
이 Stack이라는 구조는 지역 변수를 관리할 때 쓰인다.
그리고 주의해야 할 과정이 "데이터를 추가 했으니까, SP에 저장 된 주소 (SP가 가리키는 주소라고 생각하자) 가 증가하겠찌??" 라고 당연하게 생각하면 경기도 오산시다. 실제 컴퓨터 시스템에서 PUSH 명령은 스택 포인터에 저장된 주소가 감소하도록 만들어져 있다. 이거 헷갈릴 수도 있다니. 조심하자.
.. 만약 POP을 하면? 저장된 주소가 증가하겠지. 이렇게 알아둬라!!
그러면 이제 컴파일러가 지역 변수를 저장할 메모리 공간을 확보하는 방법도 알아보자.
만약 내가
void Test() {
int a, b, c;
}
이렇게 코드를 짰다고 치면, 세 개의 지역 변수를 사용한다는 것을 알 수 있다. a, b, c. 이렇게 세개.
그러면 int 형 변수 세개니까 12 Byte 다.
여기서 SP 를 12만큼 줄이면? int형 변수 세개를 저장할 공간이 남게 된다. 그럼 여기에 a, b, c를 넣는거지. push 세번 한거나 똑같다. 그러다가 Test 함수가 끝나면 다시 SP를 12만큼 늘려서 공간을 제거하고.
..그렇다.
만약 함수가 있는 c언어의 소스코드를 돌리면, main 함수를 돌리면서 다른 함수에 접근 할 때 마다 스택의 변화가 생긴다 (398p 참고). 이런 스택의 변화를 Stack Frame 이라고 하는데, 이도 정적 메모리 할당에 속한다. 그래서 만약 내가 지역 변수를 추가하거나 배열의 크기를 변경하려고 하면 코드를 아예 다시 컴파일해야한다.
아 머리아파. 오늘은 일단
여기까지
하겠다. 백준이나 풀러가자. 총총..
Author And Source
이 문제에 관하여(211027, C언어 입문 day 12-1), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@gom1nh/211027-C언어-입문-day-12-1저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)