거북이와 개구리의 끄적끄적

7일차_C언어(프로세스와 메모리 모델, 메모리 할당, 다차원 포인터) 본문

공부/팁스

7일차_C언어(프로세스와 메모리 모델, 메모리 할당, 다차원 포인터)

거북이가개굴개굴 2018. 7. 24. 14:54

7일차_C언어

이 글은 Tips 7일차 강의를 듣고 정리한 내용입니다.

잘못된 내용, 보충할 내용, 궁금한 내용 있으시다면 댓글 달아주시면 감사하겠습니다.


오늘의 목차는 아래와 같습니다.

-프로세스와 메모리 모델

-메모리 할당(정적할당과 동적할당)

-다차원 포인터



1.프로세스와 메모리 모델

<프로세스>

우리가 소스파일을 짜고 빌드해서 만들어진 프로그램은 디스크에 저장되어있음.

이 프로그램을 실행시키면 메모리로 load되고, CPU가 사용가능함. 이런 상태를 프로세스라고 부름.


프로세스는 2종류가 있음.

1.heavy-weight-process

우리가 흔히 말하는 process임.

2.light-weight-process

윈도우즈에서는 thread라고 부름.


이런 프로세스들은 세그먼트라고 불리는것들의 집합체.

C언어로 만들어진 프로그램은 어떤 형태로 디스크에 저장되어 있을까?

또 이 프로그램이 메모리로 load될 때 어떤 구조를 형성할까?

<메모리 모델>

사진1. 메모리모델
위의 사진은 C언어로 만들어진 프로세스의 메모리 모델이다.
C언어로 짜여진 프로그램은 디스크에 기계어 명령문과 문자열 상수목록으로 이루어져 있다.
기계어와 문자열 상수 목록이 메모리에 load되면서 나머지 영역을 만들게 된다.
영역별 설명 쭈르륵

<스택>

스택을 2가지 관점에서 설명할 수 있다.


1.자료구조
 push a 의 그림 -> push 설명
 pop의 그림 -> pop 설명
 push a; push b; pop 의 그림 -> LIFO 설명

 BP의 데이터를 핸들링 하기 위해서는 전부 POP하고 나머지는 다시 push
 속도면에서 효율적인 구조 아님.
 그런데 왜 쓸까? 단 2개의 포인터(BP,SP)로 무한대의 메모리 관리 가능.
 push하면 SP의 메모리 증가, pop하면 SP의 메모리 감소.

2.컴퓨터의 메모리 관리 메카니즘
 컴퓨터는 스택이라는 자료구조를 이용해서 메모리를 관리
 기계어에 PUSH, POP이라는 명령어가 존재.
 PUSH하면 SP의 메모리 감소, POP하면 SP의 메모리 증가.

<스택 프레임>

언어별로 다름

스택을 이용한 C언어의 기술

컴파일시 결정되어 고정적이므로 BP를 기준으로 포인터 연산이 가능.


2.메모리 할당

<정적 할당>

사진. 변수선언 코드 및 메모리
컴파일시 함수별 변수들을 보고 컴파일러가 스택영역에 스택프레임을 만드는 것.
즉, 스택영역은 컴파일러가 관리하며 컴파일시 스택프레임의 구조가 결정 됨.
개발자 입장에서 편리하지만 컴파일시 구조가 결정되므로 융통성이 없고 컴파일러에 의존적.
*스택영역을 많이쓰게되면?
프로그램의 구조를 변경하려면 재컴파일이 필수
재컴파일은 재배포를 의미하고 재배포에는 비용이 들어가므로 좋지 않다.

<동적 할당>

정적할당이 컴파일러에 의해 관리된다면 동적할당은 내가 직접 관리하는것.

malloc(memory allocation)이란 함수와 free함수를 이용하여 관리.

malloc을 이용하여 힙 영역에 메모리를 할당하고 free함수를 이용하여 할당된 메모리를 해제한다.

예시코드 및 메모리


동적할당을 사용할때 2가지 문제점이 발생할 수 있다.

1.속도 저하

  힙을 사용하면 OS의 관리를 받음

  OS의 관리를 받는다는건 절차가 복잡합

  절차가 복잡하면 시간이 오래걸림

  해결방법은? 할당할 때 한번에 크게 할당하고, 내가 직접 관리하면 됨.

2.단편화

  동적할당 되는 메모리의 크기가 다르면 발생

  사진. 단편화 설명(malloc(4),free,malloc(8))

  해결방법은? 자료구조의 크기를 통합하면 됨

<정적 할당 vs 동적 할당>

크기, 관리자, 장점, 단점


3.다차원 포인터

<등장 배경>

malloc의 한계점 : 자료형에 관여가 불가능하다. 즉, 정수크기의 메모리만 할당.
그렇다면 포인터를 동적할당할 방법은 없을까? -> 다차원 포인터의 등장.

<다차원 포인터 & 동적 할당>

아래 코드 예제코드로 넣을것
int* ip = (int*)malloc(4*sizeof(int)); // int형 데이터 4개 할당.
int** idp = (int**)malloc(4*sizeof(int*)); // int*형 데이터 4개 할당.
메모리도

<동적 할당을 이용한 3차원 배열 만들기>

예제코드
및 메모리
배열 표기법과 혼용법. 3차니까 8가지 나오겠죠


읽어주셔서 감사하고 강의정리가 너무 늦어져서 죄송합니다.