Chapter3-5. 동적 할당 영역과 시스템 호출

Posted by yunki kim on February 27, 2023

프로세스의 동적 할당 영역

  프로세스는 다음과 같은 구조를 가진다.

    코드 영역에는 프로그램 본체가 위치한다. 데이터 영역은 프로그램이 사용하려고 정의한 변수와 데이터가 존재한다. 포인터를 제외하면 일반적인 변수는 크기가 결정된다. 따라서 프로세스 실행 직전에 위치와 크기가 결정되기 때문에 정적 할당 영역이라 부른다.

  힙 영역과 스택 영역은 프로세스 실행 중에 크기가 변하므로 동적 할당 영역이라 한다.

스택 영역

  스택 영역은 함수 호출 시 두 가지 작업을 구현하기 위해 사용한다.

  1. 호출한 함수가 종료되면 함수를 호출하기 전 코드로 되돌아오기 위해 되돌아올 메모리 주소를 스택에 저장한다.

  2. 변수 사용 범위에 영향을 미치는 영역(scope) 구현에 사용된다. 지역 변수는 함수가 호출될 때만 사용되다가 종료하면 사용한 공간을 반환해야 한다. 따라서 지역 변수를 스택에 저장한다.

  스택은 프로세스를 작동하기 위해 커널이 유지하는 자료구조다. 스택은 스레드가 작동하는 동안 추가되거나 삭제되는 동적할당 영역이다.

힙 영역

  동적으로 할당되는 변수 영역이다. 프로그램 실행 중 할당되는 데이터가 위치하게 된다.

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
#include <stdlib.h>
 
int main(void) {
    int sarr[50];
    int *darr;
 
    darr = (int*)malloc(sizeof(int* 50);
 
    free(darr);
}
cs

  위 코드에서 sarr과 darr은 크기가 같으므로 겉 보기에는 별 차이가 없어 보인다. 하지만 sarr은 프로세스 종료 전까지 메모리를 차지한다. 반면, darr은 필요할 때 메모리를 할당받고, 필요 없을 때 메모리를 반환한다.

exit()와 wait() 시스템 호출

exit() 시스템 호출

  exit() 함수는 작업의 종료를 알려주는 시스템 호출이다. 모든 프로세스는 부모-자식 관계를 가진다. 유닉스 프로세스가 init 프로세스로 부터 부모-자식 관계를 만드는 이유는 사용하던 자원을 회수하기 위함이다. exit()을 사용하면 부모 프로세스는 자식 프로세스가 사용하던 자원을 빨리 수거할 수 있다. exit() 인자로 0을 넘기면 정상 종료, -1이면 비정상 종료다.

wait() 시스템 호출

  자식 프로세스가 종료되길 기다리지 않고 부모 프로세스가 먼저 종료되었다면 자식 프로세스는 고아 프로세스가 된다. 고아 프로세스는 추후 os가 회수하긴 하지만, 시스템 자원을 낭비한다. wait() 시스템 호출은 고아 프로세스 생성을 막기 위해 사용된다. wait() 시스템 호출은 자식 프로세스가 끝나기를 기다렸다가 자식 프로세스가 종료되면 다음 문장을 실행한다.

 

출처 - 쉽게 배우는 운영체제