본문 바로가기

42 Seoul

[메모리 구조] Code, Data, Heap, Stack

42SEOUL에서 과제를 하던 도중 궁금증이 생겨 테스트하고 검색하면서 알게 된 정보를 적어본다.

get_next_line 함수의 경우 우리는 파일 혹은 표준입력을 읽어서 한 줄씩 돌려주어야한다.

이렇게 데이터를 불러오고 쓰는 경우 일종의 임시저장소인 Buffer를 쓰게 되는데 이 Buffer의 사이즈를 정하는 과정에서 궁금증이 생겼다. (buffer 사이즈가 매우 큰 경우 buffer 사이즈가 매우 작은 경우)

Buffer가 매우 큰 경우

버퍼가 매우 큰 경우 우리는 파일 혹은 표준입력으로부터 읽어드리는 행위를 자주 할 필요가 없다. 입력하는 데이터들이 한 번에 buffer에 들어가는 경우가 대다수일 것이고 이를 한 번만 처리해주어 저장한 후 사용하면 된다.

Buffer가 매우 작은 경우

반대로 이런 buffer의 사이즈가 매우 작을 때(ex. 1)는 앞서 처리한 데이터와 계속 합쳐주는 처리를 해주어야한다.

위에 서술한 것만 보면 Buffer의 사이즈가 무조건 크면 좋은 것이라 생각할 수 있겠지만, 프로그래밍을 하는 입장에서는 사용 가능한 리소스도 감안해주어야한다.

여기서 메모리 구조를 알아야할 필요가 있다고 생각해 정리해보겠다.

Memory Structure

먼저 우리가 프로그램을 실행시키면 프로그램이 메모리에 로드되고 운영체제에서 영역별로 메모리를 할당해준다.

Code

우리가 작성한 프로그램의 코드가 저장되게 되고 CPU에서 해당 코드를 읽어처리하게 된다.

Data

프로그램의 전역 변수와 정적 변수가 저장되는 공간

Heap

힙영역은 사용자가 직접 관리를 할 수 있는 영역이며 사용자에 의해 동적으로 할당되고 관리된다.

따라서 이 영역을 효율적으로 관리하는 것이 반드시 필요하다.

Stack

스택영역은 함수의 호출과 관련된 변수가 저장되는 영역이다. 프로그램 상에서 함수가 호출될 때 해당영역에 쌓이게 되고 함수의 처리가 끝나면 pop 동작으로 인출되면서 소멸하게 된다.

그래서 buffer size랑 무슨 상관인데?

메모리와 관련되서 문제가 되는 부분은 buffer size가 매우 클 경우이다.

만약 다수의 프로그램에서 해당 프로그램을 호출하게 된다면? 혹은 buffer를 사용하는 함수를 재귀적으로 호출하였다면? buffer가 차지하는 메모리 공간이 매우 커질 것이고, 이는 운영체제로부터 할당 받은 메모리를 초과하게 될 수도 있다. 이런 경우 다른 프로그램에서 메모리를 사용할 수 없거나 우리가 의도하지 않은 시스템 오류를 만나게 될 가능성이 크다.

반대로 buffer size가 매우 작을 경우 처리를 위한 연산이 매우 많아지므로 처리 속도에 있어 성능의 하락을 불러올 수 있다.

따라서 처리를 간편하게 하기 위해 buffer size를 무작정 크게 만드는 것보다 적절한(?) 크기로 할당해주는 것이 필요하다.

'42 Seoul' 카테고리의 다른 글

[메모리 구조] Code, Data, Heap, Stack  (0) 2022.05.04