[OS] 프로세스 (1)

EMMA·2022년 5월 9일
0
post-thumbnail

프로세스(process)란?

하나의 프로그램이 메모리에 올라온 상태를 말한다.
(폰노이만 구조에서, 어떤 프로그램이 '실행'된다는 것은 메모리 위에 올라온 상태를 말한다)


프로세스의 상태

프로세스는 크게 4가지 status로 나뉘며, 이 모든 status는 CPU 스케줄러가 관리한다.

  • create status, 생성 상태
    • 프로그램이 메모리에 올라와 실행 준비를 마친 상태(프로세스가 준비된 상태)
    • 프로세스 제어 블록이 생김
  • ready status, 준비 상태
    • CPU를 할당받기 전까지 기다리는 상태
  • running status, 실행 상태
    • CPU를 할당 받아 작업을 수행하는 상태
    • 할당 받은 시간(time slice) 동안 작업이 끝나지 않으면, 다시 ready status > running status 과정을 거침
  • terminate status, 완료 상태
    • 주어진 시간 동안 작업을 마치고 제어 블록이 사라진 상태

이미지 출처: https://www.guru99.com/process-management-pcb.html

프로세스 제어 블록

모든 프로세스는 고유한 제어 블록(PCB, Process Control Block)을 가진다.
프로세스 제어블록에는 여러 가지 중요한 정보가 있는데, 대표적으로 아래와 같다.

  • 포인터
  • 프로그램 카운터
  • 프로세스 상태
  • 프로세스 우선순위
  • 각종 레지스터/메모리 관리 정보
  • 부모 프로세스 구분자/자식 프로세스 구분자
  • CPU 스케줄링 정보 등

특히 포인터는, 같은 입출력을 기다리는 프로세스끼리 모이게 해주는 역할을 한다. 모든 대기 프로세스가 한 곳에 모여 있다면 비효율적이므로, 포인터는 대기 큐/준비 큐 등으로 나눠서 프로세스가 진행될 수 있도록 돕는다.

PCB는 문맥 교환(context swtiching)이 일어날 때 같이 리셋된다.
CPU를 차지하던 기존의 프로세스에서 새로운 프로세스로 변경될 경우, 기존 프로세스의 작업내용은 저장되고 > 새로운 프로세스의 제어 블록 내용으로 CPU가 리셋되는데, 그래야 다음 작업을 계속 할 수 있기 때문.


부모 프로세스(PPID) 와 자식 프로세스(CPID)
다른 프로세스를 생성하는 프로세스를 부모 프로세스라고 하며,
부모 프로세스에 의해 생성되는 프로세스를 자식 프로세스라고 한다.
파이썬에서는 multiprocessing 모듈을 통해 자식 프로세스를 만들어 일을 위임할 수 있다.

#프로세스 이름 및 PID(운영체제가 부여한 프로세스 넘버) 확인
import multiprocessing as mp 
if __name__ == '__main__':
    proc = mp.current_process()
    print(proc.name)
    print(proc.pid)
>>> MainProcess
>>> 8105 
#자식 프로세스 생성 
import multiprocessing as mp
import time 
def worker():
    proc = mp.current_process()
    print(proc.name)
    print(proc.pid)
    time.sleep(5)
    print('SubProcess End')
if __name__ == '__main__':
    proc = mp.current_process()
    print(proc.name)
    print(proc.pid)
    p = mp.Process(name='SubProcess', target=worker)
    p.start() 
    print('MainProcess End')
>>> MainProcess
>>> 8105
>>> MainProcess End
>>> SubProcess
>>> 8149
>>> SubPRocess End

자료 출처

쉽게 배우는 운영체제, 조성호
https://www.guru99.com/process-management-pcb.html
https://wikidocs.net/85603

profile
예비 개발자의 기술 블로그 | explore, explore and explore

0개의 댓글