프로그램이 실행되는 동안을 프로세스라고 한다. 작업 관리자 창을 켰을 때 나오는 것들이 프로세스이다. 프로세스들은 메모리의 영역을 할당받아 실행된다.
프로세스는 4개의 세그먼트로 구성된다. 세그먼트는 부분, 조각이라는 뜻이다, 한글로는 4부분으로 나뉜다는 뜻이다.
강의 자료를 인용했다.
코드 세그먼트에는 우리가 적은 코드가 들어있다. 메모리의 코드 세그먼트에 적혀있는 코드들이 하나하나 CPU에 들어가 처리된다. 함수의 호출같은 것들이 이곳에 속한다.
데이터 세그먼트에는 정적변수(static) 과 전역변수(global)의 내용이 들어간다.
스택 영역은 함수의 호출과 관련이 있다. 함수가 호출될 때 그 안의 지역변수와 매개변수도 함께 저장되며 for 문이나 while문은 함수 호출을 하는 것이 아니기에 스택영역을 사용하지 않지만 재귀함수같은 경우 매번 함수를 호출하므로 스택 영역을 사용한다. 잘못짜거나 너무 많이 반복하는 재귀함수는 계속 스택이 쌓이다가 너무 많이 쌓여 범위를 벗어나 segfault 오류가 뜨게 된다.
자료구조에서 스택은 LIFO (Last-in First-Out) 후입선출 방식으로 작동한다. 가장 최근에 저장된 데이터부터 빠져나간다. 재귀함수의 구조를 생각해보면 된다. 재귀가 탈출조건을 만족하게 되면 가장 마지막에 호출된 함수가 가장 빠르게 끝나고 재귀를 맨 처음 시작한 함수가 마지막에 빠져나가게 된다.
이 메모리 영역도 마찬가지이다. 가장 처음의 함수가 먼저 들어가고 마지막에 끝나는 방식으로, 그리고 메모리 주소도 낮은 곳부터 높은 곳으로 차례대로 할당받는다. 이것은 &을 통해서 확인해볼 수 있다.
힙 영역은 사용자가 직접 관리하는 영역이다. 보통 malloc이란 함수를 쓸때, 동적할당에 대해서 배울때 쓰게 될 영역이다. 스택 영역과는 반대로 메모리 주소를 높은 곳부터 낮은 곳으로 차례대로 할당받는다.
스택과 힙 영역은 메모리의 위에서 아래, 아래에서 위 이렇게 서로를 향한채 계속 할당받다보면 서로의 영역을 침범할 수 있다. 이때 발생하는 에러가 바로 스택 오버플로우와 힙 오버플로우이다.
전역변수는 데이터 영역에, 지역변수는 스택 영역에 저장되기 때문에 서로 이름이 같아도 어디에서 출력되느냐에 따라 결과가 달라질 수 있다.
static 수정자
static 수정자는 정적 변수를 데이터 세그먼트에 저장할때 사용한다.
extern 수정자