참고
프로세스와 스레드
NOTE
프로세스란 컴퓨터에서 실행 중인 프로그램을 의미합니다. 정확히는 프로그램 파일이 OS에 의해 주기억장치에 적재되어 CPU에 의해 실행되는 과정을 프로세스라 합니다. 쓰레드는 프로세스 내에서 실행되는 작업의 단위입니다.
프로세스 ⇒ 프로그램이 돌아가고 있는 상태! (작업중인 프로그램)
모든 프로그램은 운영체제가 실행되기 위해 메모리 공간을 할당해줘야 실행될 수 있습니다.
프로그램을 실행하는 순간, 파일은 컴퓨터 메모리에 올라가고 운영체제로부터 시스템 자원(CPU)을 할당받아 프로그램 코드를 실행시켜 서비스를 사용할 수 있습니다.
•
프로세스는 최소 하나의 스레드를 가지고 있으며, 실제로도 스레드 단위로 스케줄링을 합니다.
•
자바 언어로 비유하면 클래스(프로그램) , 인스턴스(프로세스) 입니다.
프로세스 계층 구조
NOTE
프로세스는 실행 도중 시스템 호출을 통해 다른 프로세스를 생성할 수 있다!
프로세스는 자식 프로세스를 가질 수 있다.
# 프로세스 계층구조 확인
pstree
## 결과
systemd─┬─ModemManager───2*[{ModemManager}]
├─agetty
├─containerd───9*[{containerd}]
├─containerd-shim─┬─mysqld───7*[{mysqld}]
│ └─11*[{containerd-shim}]
├─cron
# ...
Bash
복사
최초의 프로세스 systemd
프로세스 부모-자식 관계
•
부모 프로세스
◦
새로운 프로세스를 생성하는 과정을 말합니다.
◦
일반적으로 부모 프로세스는 실행 중인 상태에서 새로운 작업을 수행하기 위해 자식 프로세스를 생성할 수 있습니다/
•
자식 프로세스
◦
부모 프로세스에 의해 생성된 프로세스를 의미합니다.
◦
부모 프로세스와 별개의 프로세스 이므로 다른 PID를 가집니다.
프로세스 계층 구조의 특징
•
일반적으로 1번째 프로세스 init 또는 systemd가 모든 프로세스의 최상위 부모 루트 역할을 하며, 다른 프로세스는 이 프로세스에서 시작된 계층 구조의 하위에 위치하게 됩니다.
•
자식 프로세스는 부모 프로세스의 환경 변수, 파일 디스크립터, 우선 순위 등을 상속받을 수 있으며 자식 프로세스에서 독립적으로 변경할 수 있습니다.
•
부모-자식 프로세스는 pipe, message, queue 등의 IPC(Inter-Process Communication) 방법을 사용하여 서로 데이터를 주고 받을 수 있습니다.
프로세스 & 스레드 메모리 구성
NOTE
프로그램이 실행되어 프로세스가 만들어지면 4가지의 메모리 영역으로 구성되어 할당받게 됩니다.
프로세스 - 스레드 할당
프로세스는 실행 중인 프로그램의 인스턴스이다. 각 프로세스는 독립적인 메모리 공간을 가지고 있어, 운영체제에서 별도의 작업 단위로 분리되어 관리되며 서로 간섭하지 않습니다.
•
프로세스는 서로의 메모리에 직접 접근할 수 없다. 이렇게 격리되어 관리되기 때문에, 하나의 프로세스가 충돌해도 다른 프로세스에는 영향을 미치지 않습니다.
•
스레드는 동일 프로세스에 있는 다른 스레드와 코드, 데이터, 힙 등의 메모리를 공유할 수 있으며, 각각의 스레드는 독립된 스택 메모리를 가집니다.
프로세스 구조
•
Stack 영역
◦
함수 안에서 선언된 지역 변수, 매개변수, 리턴값이 저장되는 공간입니다.
◦
Stack은 함수의 호출과 함께 생성되며, 호출이 완료되면 소멸합니다.
•
Heap 영역
◦
생성자, 인스턴스와 같이 동적으로 할당되는 데이터를 저장하는 공간입니다.
•
Code 영역
◦
실행할 프로그램의 코드나 명령어들이 기계어 형태로 저장된 영역입니다.
•
Data 영역
◦
코드에서 선언한 전역 변수와 정적 변수가 저장되는 영역입니다.
◦
함수 안에서 선언된 지역변수, 매개변수 ,리턴값이 저장되는 공간입니다.
◦
Stack은 함수의 호출과 함께 호출되며, 호출이 완료되면 소멸합니다.
프로세스 제어 블록(Process Control Block)
NOTE
프로세스 제어 블록(PCB)는 운영체제에서 각 프로세스의 상태와 정보를 관리하기 위해 사용되는 데이터 구조입니다. PCB는 운영체제가 프로세스를 관리하고, 스케줄링하며, 문맥교환을 수행하는데 필요한 정보를 담고 있습니다.
메모리 구조
PCB의 역할은 다음과 같습니다.
1.
PCB는 운영체제가 각 프로세스를 관리하기 위한 핵심 정보를 저장하며, 이를 통해 프로세스 실행, 중지, 종료등의 작업을 수행할 수 있습니다.
2.
PCB는 문맥 교환시 프로세스의 상태를 저장/복원 할 수 있습니다.
3.
운영체제는 PCB의 정보를 기반으로 프로세스를 스케줄링 할 수 있습니다.
PCB는 커널영역에 있으며 꼬리표와 같은 개념입니다.
•
프로세스 ID(PID)
◦
프로세스를 구분하기 위해 주는 고유 번호입니다.
◦
같은 프로그램을 두 번 실행하면 PID가 다른 두 개의 프로세스가 생성됩니다.
•
레지스터 값
◦
실행 순서가 돌아왔을 때 복원할 레지스터 값들을 백업해 둔 것입니다.
•
프로세스 상태
◦
프로세스가 CPU를 사용 중인지, 대기 중인지, 입출력 장치를 사용하려 하는지 등의 정보를 나타냅니다.
•
CPU 스케줄링 정보
◦
프로세스가 언제, 어떤 순서로 CPU를 할당받을지에 대한 정보입니다.
•
메모리 관리 정보
◦
프로세스가 메모리의 어느 주소에 저장되어 있는지에 대한 정보입니다.
•
사용한 파일과 입출력 장치 목록
◦
프로세스가 어떤 입출력 장치를 사용하고 있는지, 어떤 파일을 열었는지 등의 정보입니다.
◦
프로세스를 식별하기 위해 부여하는 고유한 번호
◦
같은 프로그램도 두 번 실행하면 PID가 다른 2개의 프로세스 생성
문맥교환 (Context Switch)
NOTE
문맥 교환은 운영체제가 CPU를 하나의 프로세스에서 다른 프로세스로 전환할 때 발생하는 작업을 말합니다.
A → B → A .. 프로세스가 변해도 중간값들을 백업해서 다시실행할 떄 가져옴!
문맥교환 과정
문맥 교환의 이유
•
시분할 시스템에서는 여러 프로세스가 CPU를 번갈아 사용할 수 있기 위해 필요합니다.
•
입출력(I/O 대기) 상황에서는 입출력을 기다리는 동안 CPU를 다른 프로세스에 할당할 수 있도록 하기 위해 문맥교환이 발생합니다.
•
우선순위 스케줄링을 사용하는 경우에는 우선순위가 높은 프로세스를 실행하기 위해 현재 실행중인 프로세스를 일시 중지하고, 새로운 프로세스로 전환합니다.
문맥 교환 오버헤드
문맥 교환은 시스템의 자원을 소모하는 작업입니다.
문맥을 저장/복원 하는 과정이 많을수록 CPU가 실제로 작업하는 시간이 줄어들며, 문맥 교환이 자주 발생하게되는 경우 오버헤드로 비춰질 수 있습니다.