프로세스의 구조

문딤·2022년 8월 12일
0
post-thumbnail

프로세스의 메모리 영역

실행되고 있는 프로그램으로, 프로세스는 각 메모리공간을 시스템으로부터 할당 받는다.

stack 영역

  • 프로그램이 자동으로 사용하는 임시 메모리 영역으로 지역변수, 매개변수, 리턴 값 등이 잠시 사용되었다가 사라지는 데이터를 저장하는 영역이다.
  • 함수 호출 시 생성되고 함수가 끝나면 반환된다.
  • Stack 사이즈는 각 프로세스마다 할당되지만 프로세스가 메모리에 로드될 때 Stack 사이즈가 고정되어 있어 런타임 시 Stack 사이즈를 바꿀 수 없다.

Heap 영역

  • 필요에 의해 메모리를 동적 할당하고자 할 때 사용하는 메모리 영역으로 동적 데이터 영역이라고 부른다.
  • 메모리 주소 값에 의해서만 참조되고 사용하는 영역이다.
  • 이 영역에 데이터를 저장하기 위해 C에서 malloc() 함수를 사용한다.

Data 영역

  • 프로그램이 실행될 때 생성되고 프로그램이 종료되면 시스템에 반환되며 전역변수, 정적변수, 배열, 구조체 등이 저장된다.
  • 이 때 초기화 된 데이터는 Data 영역에 저장되고 초기화되지 않은 데이터는 BSS(Block Stated Symbol) 영역에 저장된다.
  • 함수 내부에 선언된 Static 변수는 프로그램이 실행될 때 공간만 할당되고 그 함수가 실행될 때 초기화된다.

왜 구역을 나눌까❓

초기화된 데이터는 초기값을 저장해야 하니 Data 영역에 저장되어 ROM에 저장된다.
하지만 초기화하지 않은 데이터까지 ROM에 저장한다면 큰 사이즈의 ROM이 필요한데 비용이 많이 들어 RAM에 저장하기 위해 Data 영역과 BSS 영역으로 나눈 것이다.

Code 영역

코드 자체를 구성하는 메모리 영역으로 Hex 파일이나 Bin 파일 메모리이다.
프로그램 명령이 위치하는 곳으로 기계어로 제어되는 메모리 영역이다.

+@
Code, Data, BSS 영역은 컴파일 시 크기가 결정되고 Heap, Stack 영역은 런타임 시 크기가 결정된다.

+@
Stack의 지역변수는 사용하고 소멸하므로 데이터 용량이 불확실하다.
그렇기 때문에 밑에서부터 채워올리고 Heap은 위에서부터 채워나간다.
이렇듯 서로 주소값을 채워나가다가 Heap에서 Stack 방향으로 영역을 침범하는 경우 HEAP overflow라고 하며 반대로 Stack에서 Heap 방향으로 영역을 침범한다면 STACK overflow라고 한다.

프로세스의 생성과 복사

  • 프로세스 생성은 부모 프로세스가 연산을 통해 자식 프로세스를 만들어낸다.
  • 생성된 자식 프로세스 또한 새로운 자식 프로세스를 만들 수 있으며 이를 구별하기 위 해 모든 프로세스는 각자 고유의 PID를 가진다.
  • 이렇게 생성된 프로세스 간의 관계는 하나의 트리구조가 된다.

프로세스를 생성한 후 부모 프로세스는 두가지 행동을 할 수 있다.

  1. 자식 프로세스가 끝날 때까지 기다린다.(-> WAITING QUEUE)
  2. 자식 프로세스와 함께 동작한다.(멀티 프로세싱 환경)

FORK() + EXEC() 시스템 호출

💨FORK()

Linux/UNIX 환경에서 새로운 프로세스를 만드는 시스템 콜 함수이다.

  • 생성된 자식 프로세스는 부모 프로세스의 데이터와 프로그램이 완전 복사가 되어 똑같은 프로그램을 수행하는 프로세스가 됩니다. 이를 통해 부모, 자식 프로세스가 서로 간편하게 의사소통을 할 수 있다.
  • 멀티 프로세싱을 통해 부모, 자식 프로세스는 함께 동작한다.
  • fork() 함수는 부모 프로세스에서 자식의 PID를 반환하고, 자식 프로세스에서는 0을 반환하여 구분할 수 있도록 해준다.

💨EXEC()

Linux/UNIX 환경에서 프로세스를 새로운 프로그램을 실행하는 프로세스로 대체하는 시스템 콜 함수이다.

  • fork()와 다르게 자식 자식 프로세스를 생성하는 것이 아닌 현재 프로세스의 프로그램 코드를 새로운 프로그램 코드로 바꿔줍니다. 이로 인하여 프로그램 코드, 메모리, 파일 등 프로세스 자원이 새로 바뀌게 된다.
  • exec() 함수는 현재 프로세스가 완전히 새로운 프로그램을 실행하는 프로세스로 대체되므로 반환 값이 없다.

💨WAIT()

  • 자식 프로세스가 종료될 때까지 현재 프로세스의 동작을 멈추는 시스템 콜 함수이다.
  • 자식 프로세스가 종료되면 자식 프로세스 종료 시그널(SIGSHLD)이 발생하여
    waiting queue에 있는 부모 프로세스가 ready queue로 넘어가게 되어 다시 실행이 가능해진다.
  • 블럭 모드로 동작하기 대문에 비용이 비싸며 자식 프로세스 관리를 하지 않으면 무한정 대기, 혹은 함수가 OS에 의해 강제 종료당할 수 있다.
  • 종료된 자식 프로세스의 PID를 반환하며 인자로 받은 statloc에 프로세스의 종료 상태를 알 수 있는 번호가 입력된다.

출처

https://recorda.tistory.com/entry/20160503%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B5%AC%EC%A1%B0

profile
풀스택개발자가 될래요

0개의 댓글