Python/수업

프로세스와 스레드

끈끈 2023. 4. 16. 20:00

 

프로세스

실행 중인 프로그램. 실행을 위해 CPU가 필요함

  • 포그라운드 프로세스(foreground process) : 사용자가 볼 수 있는 공간에서 실행되는 프로세스
  • 백그라운드 프로세스(background process) : 사용자가 볼 수 없는 공간에서 실행되는 프로세스

 

프로세스 제어 블록 : PCB(process control block)

프로세스 관련 정보를 저장하는 자료 구조

  • 프로세스 ID (PID) : 특정 프로세스를 식별하기 위해 부여하는 고유한 번호
  • 레지스터 값 : 프로그램 카운터 값 포함
  • 프로세스 상태
  • CPU 스케줄링 정보
  • 메모리 정보
  • 사용한 파일과 입출력장치 정보 : 사용한 입출력장치의 정보

 

프로세스 확인하는 방법 :

윈도우 [작업 관리자] - [서비스] - [PID]

 

프로세스의 메모리

  • 커널 영역
  • 사용자 영역 :
  • 스택 영역 : 데이터가 일시적으로 저장되는 공간(매개변수, 지역변수). 가변적
  • 힙 영역 : 프로그램을 만드는 사용자
  • 데이터 영역 : 프로그램이 실행되는 동안 유지할 데이터(전역변수가 저장될 공간)
  • 코드 영역(텍스트 영역) : CPU가 실행할 명령어

 


 

 

멀티 프로세스

독립적. PID값이 모두 다름

프로세스 간 자원을 주고받을 수 있다 : 프로세스 간 통신(IPC)

process.py:

더보기
from multiprocessing import Process
import os


def foo():
    print('child process', os.getpid())  # PID값
    print('my parent is', os.getppid())  # 부모프로세스의 PID값


# 자식프로세스는 얼마든지 생성 가능
if __name__ == '__main__':  # 여기서부터 실행해
    print('parent process', os.getpid())  # parent process 35976
    child1 = Process(target=foo).start()  # foo라는 프로세스를 만들어서 실행해
    # child process 43276 / my parent is 35976
    child2 = Process(target=foo).start()
    # child process 40584 / my parent is 35976
    child3 = Process(target=foo).start()
    # child process 43352 / my parent is 35976


def foo():
    print('This is foo', os.getpid())


def bar():
    print('This is bar', os.getpid())


def baz():
    print('This is baz', os.getpid())


# 각기 다른 작업의 자식프로세스
if __name__ == '__main__':  # 여기서부터 실행하라
    print('parent process', os.getpid())  # parent process 43932
    child1 = Process(target=foo).start()  # This is foo 42304
    child2 = Process(target=bar).start()  # This is bar 43796
    child3 = Process(target=baz).start()  # This is baz 43152

 

멀티 스레드

프로세스의 구성하는 실행 흐름의 단위.

한 프로세스의 구성 요소로 자원을 공유. 같은 PID값

thread.py:

더보기
import threading
import os


def foo():
    print('process id', os.getpid())
    print('thread id', threading.get_native_id())


# 같은 작업을 하는 스레드 생성
if __name__ == '__main__':
    print('process id', os.getpid())  # process id 42088
    thread1 = threading.Thread(target=foo).start()  # 스레드를 만드는 함수
    # process id 42088 / thread id 40008
    thread2 = threading.Thread(target=foo).start()
    # process id 42088 / thread id 33148
    thread3 = threading.Thread(target=foo).start()
    # process id 42088 / thread id 44052


def foo():
    print('This is foo', os.getpid())


def bar():
    print('This is bar', os.getpid())


def baz():
    print('This is baz', os.getpid())


# 다른 작업을 하는 스레드 생성 (PID값은 같음)
if __name__ == '__main__':
    print('process id', os.getpid())  # process id 19020
    thread1 = threading.Thread(target=foo).start()  # This is foo 19020
    thread2 = threading.Thread(target=bar).start()  # This is bar 19020
    thread3 = threading.Thread(target=baz).start()  # This is baz 19020