프로세스의 생성 과정에 대해 좀 더 파고들어볼 것이고 추가로 코드 실습을 하여 멀티프로세싱 프로그램을 만들어 보겠다.
프로세스의 생성이 무엇인지, 프로세스의 상태가 어떤식으로 관리되는지에 대해 이미 이전 글에서 작성한 바가 있다.
이번에는 프로세스의 생성 과정과 세부 개념을 다시 한 번 더 정리해보는 시간을 갖고
코드 실습을 통해 프로세스가 여러개가 돌아가는 모습을 직접 확인해보겠다.
프로그램을 실행하게 되면 운영체제는 해당 프로그램에 코드 영역과 데이터 영역을 메인 메모리에 올리고
빈 스택과 빈 힙을 만들어 공간을 확보한다. 이는 시스템에게 상당한 부담을 주는 일이다.
스택과 힙이 어떻게 만들어 지냐?
운영체제가 제공하는 핵심 기능인 하나인 메모리 관리 작업을 통해 만들어진다.

프로그램을 실행했다고 해보자
프로그램은 프로세스가 된다. 이것은 프로세스가 생성되었다 라고 볼 수 있다.
그러면 이제 운영체제는 프로세스를 관리하기 위하여 '컨트롤 블록'을 만들어서 프로세스에 상태에
프로세스 아이디, 레지스터 정보 등을 초기화 한다. 이렇게 해서 프로세스가 생성이 되었는데,
사실 이러한 작업 프로세스가 하나도 없다가 새롭게 생성되어지는 과정은 컴퓨터에 전원이 들어가고
컴퓨터가 부팅되어서 운영체제가 시작되고 나서 첫 번째 프로세스가 생성될 때 딱 1번만 수행되는 작업이다.
사실 이 여러개의 프로세스 이 이후부터 만들어진 모든 프로세스는 새롭게 생성되질 않는다.
최초에 하나를 제외한 나머지 프로세스는 모두 이 최초의 프로세스를 복사해서 사용하는 방식으로 만들어지게 된다.
이 때 이 첫 번째 프로세스를 가르켜 부모 프로세스라고 표현하고 이를 복사해서 만들어진
새로운 프로세스는 자식 프로세스라고 표현한다.
부모프로세스를 복사해여 실행하는 함수를 fork()라 한다.
새로운 프로세스를 생성하지 않고 복사하는 이유는 새로 생성하는 것보다 복사가 훨씬 빠르기 때문이다.
* 시스템에 과부하를 방지하기 위한 방법

우리가 응용 프로그램을 만들 때 운영프로그램이 운영체제가 제공하는 핵심 기능을 사용하고자 할 때
시스템 콜 = 시스템 호출이라는 인터페이스를 사용한다라고 한 적이 있는데
fork()도 시스템 함수이고 이 fork() 를 통해 시스템을 복사하는게 안전한 방법이다.
사용자가 직접 커널에 접근하는건 위험하다라고 앞 글에서 작성했는데,
자식 프로세서는 부모 프로세서의 모든 내용을 복사하기 때문에 코드 영역과 데이터 영역, '프로세스 컨트롤 블록' 에 모든 내용을
일단 그대로 복사하게 된다. 물론 시스템 함수를 이용해 복사한 것이기 때문에 프로세스 아이디나 메모리 주소 등은 다르게
할당이 된다.
이렇게 fork()를 통해 만들어진 자식 프로세스는 exec() 시스템 함수를 이용해 코드 영역과 데이터 영역을 원하는 내역으로
덮어쓰는 작업을 또 해줘야 한다. 그렇다면 부모프로세스와 같았던 내용들이 달라져서 이제 프로세스끼리는 같은 일을 하지 않고
새롭게 생성된 목적에 맞는 일을 독립적으로 수행할 수 있게 된다.
부모가 자식 프로세스를 실행하면 프로세스 계층구도를 이루는 가정은 fork()와 exec()의 반복이다. 라고 할 수 있다.
이전 글에서도 비슷한 내용을 확인할 수 있다.
https://jennifer-development-blog.tistory.com/18
(2)프로세스 상태
프로세스 관리가 어떤식으로 이루어지는지 알아보자. 프로세스는 CPU 사용한다. 그런데 우리가 컴퓨터를 켜놓고 작업할 때 프로그램을 언제나 단 하나만 실행시켜두지 않는다. 일반적으로 우리
jennifer-development-blog.tistory.com
----------------------
시스템 함수
* fork() : 부모 프로세스를 복사해여 실행하는 함수 / 부모 프로세스에서 호출되어 자식 프로세스를 생성
부모 프로세스와 자식 프로세스는 프로그램 코드와 메모리 공간을 공유하지만, 각각은 다른 프로세스로 실행됩니다.
* exec() : 함수는 기존의 프로세스 이미지를 새로운 프로세스 이미지로 교체합니다.
exec() 함수가 성공적으로 실행되면 이전의 프로세스 이미지 및 프로그램 상태는 손실되며, 새로운 프로그램이 실행됩니다.
exec() 함수가 실패하면 현재 프로세스는 이전 상태를 유지하고 에러 코드를 반환합니다.
일반적으로 fork()와 exec() 함수는 함께 사용되어 부모 프로세스에서 자식 프로세스를 생성한 후, 자식 프로세스에서 새로운 프로그램을 실행하는 데 사용됩니다. 이를 통해 여러 프로세스 간의 협력적인 작업이 가능해지며, 다양한 프로그램 및 작업을 효율적으로 관리할 수 있습니다.
* 프로세스 컨트롤 블록(Process Control Block, PCB) : 운영 체제가 각 프로세스를 관리하는 데 사용하는 중요한 데이터 구조입니다. PCB는 각 프로세스에 대한 정보를 유지하고, 프로세스 간의 전환 및 스케줄링에 사용됩니다. 이것은 현재 실행 중인 프로세스의 상태를 추적하고 프로세스가 다시 실행되었을 때 이전 상태를 복원하는 데 사용됩니다.
>> PCB에 대한 더 자세한 내용은 위의 링크에서 확인할 수 있다.
--------------------------
* 빈 스택(Stack)과 빈 힙(Heap)은 프로그램 실행 중에 발생할 수 있는 두 가지 상황을 나타냅니다.
* 빈 스택(Empty Stack):
스택은 일반적으로 함수 호출 및 지역 변수 저장에 사용됩니다.
프로그램이 실행되면 스택은 초기화되며, 아무런 함수 호출이 없거나 함수 호출 후에 모든 지역 변수가 해제되면 스택은 비어있는 상태가 됩니다. 즉, 빈 스택이란 현재 실행 중인 함수 호출이 없고, 스택에 저장된 데이터가 없는 상태를 의미합니다.
이러한 상황은 프로그램이 시작되거나, 모든 함수 호출이 완료되어 프로그램이 종료되는 시점 등에서 발생할 수 있습니다.
* 빈 힙(Empty Heap):
힙은 동적 메모리 할당을 위해 사용됩니다.
동적으로 할당된 메모리는 프로그램이 실행 중에 힙에 할당되고 해제됩니다.
빈 힙이란 프로그램이 동적 메모리를 할당하지 않거나, 이미 할당된 메모리가 모두 해제되어 힙에 할당된 메모리가 없는 상태를 의미합니다.
이러한 상황은 프로그램이 실행 중에 메모리 할당이 필요하지 않거나, 모든 동적 할당이 해제된 후에 발생할 수 있습니다.
따라서 빈 스택과 빈 힙은 프로그램 실행 중 발생할 수 있는 상태 중 일시적인 상황을 나타내며, 프로그램의 상태 및 동작에 따라 발생할 수 있습니다.
https://jennifer-development-blog.tistory.com/22
프로세스 생성(실습)
jennifer-development-blog.tistory.com
'프로그램_기본이론' 카테고리의 다른 글
| 프로세스 생성(실습)(2) (0) | 2024.04.08 |
|---|---|
| 프로세스 생성(실습) (0) | 2024.04.05 |
| 프로세스_컨텍스트 스위칭 (1) | 2024.04.05 |
| 프로세스 상태(실습) (0) | 2024.04.05 |
| 프로세스 상태 (0) | 2024.04.05 |