- 프로세스란 '실행 중인 프로그램'을 뜻함, 프로세스는 메인메모리, 운영체제의 CPU 스케줄링, 키보드나 마우스 같은 입출력장치등 컴퓨터의 리소스를 사용하는 활동적인 존재로 잠만자고 있는 프로그램이랑 다르다.
프로세스는 운영체제가 관리하는 하나의 객체라고 할 수 있고 구조를 가지고 있다.
명령어가 담긴 코드영역
프로세스가 실행하는 코드, 즉 명령어 집합이 저장되어 있는 영역
전역변수 등이 담긴 데이터 영역
코드에서 여러 변수들을 호출해서 사용하는데 이 중 전역변수나 static변수 등이 저장되 있는 영역
지역변수 등이 담긴 스택 영역
지역변수나 함수의 매개변수 같은 휘발성 변수가 저장되어 있는 영역
동적 메모리 할당을 위한 힙 영역
프로세스가 동적으로 메모리를 할당하는 경우에 사용하는 영역

<출처:유노코딩>
프로세스의 구성요소는 아니지만 프로세스 관리 시 무척 중요한 역할을 하는 레지스터
프로그램의 실행을 위해서는 절대적으로 레지스터가 필요하다
CPU가 명령을 실행 할 때마다 사용해야 할 다양한 유형의 데이터들이 레지스터에 임시적으로 저 장되는 과정을 반복해야하고,
CPU를 구성하는 레지스터들은 현재 실행중인 프로세스들을 위한 데이터들로 채워지게 된다.
따라서 레지스터의 상태들도 프로세스의 일부로 포함시켜 말할 수 있다.
<예제 2번>
# 파이썬 프로그램도 프로세스가 된다
import os
print('파이썬 코드 실행 중! 실행 중인 프로세스의 아이디는 :', os.getpid())
# 운엥체제는 프로세스ID를 만들어서 프로세스가 몇번인지 참조해가며 관리함
# getpid: 그것을 확인할 수 있게 해주는 코드
# => 프로세스에는 ID가 할당된다.
<실행 결과>

=> 프로세스에는 ID가 할당된다.
<예제 3번>
# 내 운영체제 안에서 프로세스를 조회할 수 있는 코드
# pip install psutil
# 내 컴퓨터에서 돌아가는 프로세스 조회하기
import psutil
for proc in psutil.process_iter():
ps_name = proc.name()
if "Chrome" in ps_name : # Chrome 이 들어간 프로세스 이름만 나오도록 설정
print(ps_name, proc.pid) # psutil 모듈도 proc.id 받을 수 있음
<실행결과>

프로세스는 어떻게 관리되는가
컴퓨터에서는 여러개의 프로그램을 실행시켜두는 경우가 많다. CPU는 이 작업들을 동시에 하는가?
아니다. CPU는 한 번에 하나의 연산만 수행 할 수 있다. 따라서 CPU는 여러 개의 프로세스를 동 시에 실행하지 않고, 빠르게 번갈아 가며 실행한다.
운영체제는 빠르게 번갈아 실행되는 프로세스의 실행 순서를 관리하고, 프로세스마다 자원을 분배하 고 이에 PCB(Process Control Block)을 이용한다.
PCB, 프로세스 컨트롤 블록은 프로세스와 관련된 정보를 저장하는 자료구조이다. 프로세스 컨트롤 블록에는 프로세스를 식별하기 위해 필요한 정보들이 저장된다.
=> 프로세스 ID, 레지스터 데이터, 스케줄링 정보, 상태 등이 저장된다.
=> PCB는 프로세스가 생성 될 때마다 같이 생성되는 하나의 객체인 것

<출처: 유노코딩>
-- 프로세스의 상태변화를 나타낸 그림
운영체제는 CPU가 여러개의 프로세스를 번갈아 실행할 수 있도록 해야한다. 프로세스들은 상황에 따라 서로다른 상태 정보를 가짐.
생성
보조기억장치에 잠들어 있던 프로그램을 깨워 메인메모리에 올려 실행을 시키면 그때부터 프로세 스가 등장하는 것 이 과정을 생성이라고 함.
준비(ready)
프로세스는 생성과 동시에 ready, 대기 상태가 된다. CPU에 의해 실행되기를 기다리는 상태.
실행(Running)
CPU에 의해 실행되는 상태, 한가지 프로세스만 실행하는 것이 아니라 프로세스의 중요도, 우선 순위에 따라 준비, 실행이 교차로 일어남.
대기(Blocked)
실행과 준비를 교차하는 중 출력관련 작업요청이 들어와서 잠시 작업을 멈추는 상태
=> 준비상태에 있는 프로세스는 언제든 다시 실행 상태로 될 수 있지만 대기상태에 있는 프로세스는 대기상태로 된 이유가 사라져서 다시 준비 상태로 되야 실행될 수 있다.
종료
준비, 실행, 대기를 반복하다가 자기 할일을 마치게 되면 프로세스가 종료되고 프로세스가 사라지게 됨. 프로세스의 소멸. 잠든 프로그램이 되는 것.

<출처:유노코딩>
실행도중 시스템호출을 통해 다른 프로세스를 생성할 수 있음. 프로세스가 프로세스를 낳는 것.
처음 프로세스를 부모프로세스, 거기서 나온 프로세스는 자식프로세스 이고 이는 서로 독립적인 영 역을 가진다.
이 프로세스 족보를 프로세스 계층이라고 표현함.
<실습코드>
import psutil
for proc in psutil.process_iter():
ps_name = proc.name()
if "Chrome" in ps_name :
child = proc.children()
print(ps_name, proc.status(), proc.parent(), child)
if child :
print(f'{ps_name}의 자식 프로세스', child)
<실행결과>

=> 자식 프로세스가 많이 나온 부모 Chrome이 본체인 것.