CS Chapter_8 - 프로세스 구조

장선웅·2022년 8월 13일
0

프로세스 메모리 영역

Text

  • 프로그램 코드와 상수가 정의되어있고, 읽기만 가능한 메모리 영역. 데이터를 저장하려고하면 분할 충돌을 일으켜 프로세스가 중지된다.

Data

  • 전역 변수(global variable)와 정적 변수(static variable)가 저장되어 있는 영역.

Heap

  • 프로그래머의 필요에 따라 동적 메모리 호출에 의해 할당되는 메모리 영역. C언어를 예시로 들면 malloc() 이나 calloc()함수에 의해 생성된 변수들이 이곳에 저장.

Stack

  • 함수 인자 값, 함수 내의 지역 변수, 함수의 반환 주소 등이 저장되는 영역. 함수 호출의 전반적인 처리와 리턴값을 가짐. 상위 메모리 주소에서 하위 메모리 주소로 데이터가 저장.

Text, Data는 프로그램의 코드나 전역 변수의 실행 전에 이미 크기가 정해져 있다. 따라서 컴파일 시에 위치와 크기가 결졍되는 정적 할당영역이다. 반면, 힙이나 스택은 프로그램이 실행되는 동안 크기가 결정되는 동적 할당 영역이다. 입력 값에 의한 함수의 호출 횟수나 동적으로 생성되는 변수들의 크기는 런타임 시에 결졍되기 때문이다.


프로세스의 생성과 복사 (feat.fork(), exec() 시스템 호출)

프로세스는 fork 또는 spawn과 같은 시스템 호출을 통해 다른 프로세스를 생성할 수 있다.
각 프로세스에는 프로세스 식별자 또는 PID라고 하는 정수 식별자가 있다. 부모의 PID (PPID)도 각 프로세스에 저장된다.
유닉스 시스템에서 시스템을 init 하면서 시작되는데, 이때 모든 시스템 데몬과 사용자 로그인이 시작된다.
프로세스 스케줄러는 PID 0으로 지정되며, init 프로세스가 PID 1이다.

  1. 프로세스 생성 (분기라고도 함)
  • 자식은 메모리에서 동일한 프로그램 및 데이터 세그먼트를 공유하는 부모의 복제본이다. 자식 프로세스는 프로그램 카운터, PID, 레지스터 를 포함한 자체 PCB를 갖는다. 유닉스 시스템에서는 fork 시스템 호출을 사용.
  1. 프로세스 실행
  • 자식프로세스는 코드역역, 데이터 영역과 함께 새 프로그램을 갖는다. 유닉스 시스템에서는 exec 시스템 호출을 사용.
  1. 프로세스 대기
  • 부모프로세스는 자식 프로세스를 만든 후, 자식프로세스가 종료될 때까지 기다린다. wait 시스템 호출을 사용.
    병렬처리 작업을 하게 되면 부모 프로세스는 이때 기다리는 동안 다른 자식 프로세스들을 분기시킬 수 있다.
  1. 프로세스 종료
  • 프로세스는 int를 반환하는 exit() 시스템 호출을 통해 종료를 요청할 수 있다. 반환되는 int 값은 부모 프로세스로 전달되며 부모는 대기상태에서 해제된다. 자식 프로세스가 성공적으로 종료되면 부모프로세스에세 int값 0을 전달하고, 만약 오류가 발생하면 그외 값 전달한다.

+ 프로세스 종료시 발생할 수 있는 오류

  1. 시스템이 해당 프로세스에게 할당해줄 자원이 부족한 경우
  2. kill 명령 또는 인터럽트에 대한 응답이 발생한 경우
  3. 부모프로세스가 자식 프로세스를 죽이는 경우
  4. 부모프로세스가 없는 고아 프로세스가 된 경우
profile
개발을 꿈꾸는 초짜

0개의 댓글