CS/운영체제

[운영체제] 8. 프로세스의 구조

개발자딥게 2022. 8. 13. 11:28
반응형

프로세스의 메모리 영역

 

프로세스 메모리는 4개의 섹션으로 나뉜다.

 

1. text 영역

프로그램이 시작될 때, 비휘발성 저장소(ROM)에서 읽어온 컴파일 된 프로그램 코드로 구성되어 있다.

 

2. data 영역

main 코드를 실행하기 전, 할당되거나 초기화된 전역변수, 정적변수를 저장하는 공간이다.

 

3. heap 영역

동적메모리 할당에 사용되며, 자바나 파이썬에서 new, delete 또는 C계열 언어에서 malloc, free 등 호출로 관리된다.

 

4. stack 영역

지역변수가 선언될 때, 지역변수를 위해 예약되고 변수가 범위를 벗어나면 공간이 해제된다. 예를 들면 메서드 내에서만 쓰이는 변수 등

 

* 여기서 스택과 힙은 메모리의 반대편 끝에서 시작하며, 서로의 방향으로 메모리가 할당된다. 만약 중간에서 만나게 되면 스택쪽에는 스택오버플로우 오류가 발생하거나, 힙쪽에서는 메모리 부족으로 new 또는 malloc 호출에 실패한다.

 

 

 


프로세스의 생성, 복사 - fork()와 exec() 시스템 호출

 

부모 프로세스와 자식프로세스

프로세스는 fork 또는 spawn과 같은 시스템 호출을 통해 다른 프로세스를 생성할 수 있다.

각 프로세스에는 프로세스 식별자 또는 PID라고 하는 정수 식별자가 있다. 부모의 PID (PPID)도 각 프로세스에 저장된다.

 

유닉스 시스템에서 시스템을 init 하면서 시작되는데, 이때 모든 시스템 데몬과 사용자 로그인이 시작된다.

프로세스 스케줄러는 PID 0으로 지정되고, init 프로세스가 PID 1이다.

 

 

 

1.프로세스 생성 (분기라고도 함)

자식은 메모리에서 동일한 프로그램 및 데이터 세그먼트를 공유하는 부모의 복제본이다. 자식 프로세스는 프로그램 카운터, PID, 레지스터 를 포함한 자체 PCB를 갖는다. 유닉스 시스템에서는 fork 시스템 호출을 사용.

 

2.프로세스 실행

자식프로세스는 코드역역, 데이터 영역과 함께 새 프로그램을 갖는다. 유닉스 시스템에서는  exec 시스템 호출을 사용.

 

3.프로세스 대기

부모프로세스는 자식 프로세스를 만든 후, 자식프로세스가 종료될 때까지 기다린다. wait 시스템 호출을 사용.

병렬처리 작업을 하게 되면 부모 프로세스는 이때 기다리는 동안 다른 자식 프로세스들을 분기시킬 수 있다.

 

4.프로세스 종료

프로세스는 int를 반환하는 exit() 시스템 호출을 통해 종료를 요청할 수 있다. 반환되는 int 값은 부모 프로세스로 전달되며 부모는 대기상태에서 해제된다. 자식 프로세스가 성공적으로 종료되면 부모프로세스에세 int값 0을 전달하고, 만약 오류가 발생하면 그외 값 전달한다. 

 

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

- 시스템이 해당 프로세스에게 할당해줄 자원이 부족한 경우

- kill 명령 또는 인터럽트에 대한 응답이 발생한 경우

- 부모프로세스가 자식 프로세스를 죽이는 경우

-부모프로세스가 없는 고아 프로세스가 된 경우

 

 

참고 링크) https://www.cs.uic.edu/~jbell/CourseNotes/OperatingSystems/3_Processes.html

참고 도서) 공룡책 8판 ch3

반응형