[운영체제] Day2 프로세스 생성

빵코·2024년 4월 4일

📌 프로세스 생성

  • 프로그램 실행 시, 운영체제는 코드영역과 데이터영역을 메인메모리에 올리고
    빈 스택과 빈 힙을 만들어 공간을 확보한다. 운영체제의 핵심체제 중 하나인 메모리관리작업을 통 해 이뤄지고 이는 시스템에게는 상당히 부담을 주는 일이다.
  • 프로그램이 실행되면 프로세스가 되었다고 보고 이것을 프로세스가 생성되었다고 한다. 프로세스 가 생성되면 컨트롤블록을 만들어서 프로세스 정보, 아이디 등을 초기화하게 됨.

최초의 프로세스

최초의 프로세스를 제외한 프로세스들은 최초의 프로세스를 복사해서 이뤄진다.
이 첫번째 프로세스가 부모 프로세스, 이를 복사해 만든 프로세스를 자식 프로세스라고 하고
이때 부모프로세스를 복사하는 시스템함수를 fork()라고 함.
새로운 프로세스를 생성하지 않고 기존 프로세스를 복사해서 만드는 것은 시스템의 과부하를
방지 함

exec():코드영역과 데이터영역을 새롭게 덮어 씌어주는 함수
를 이용해 자식프로세스들은 데이터를 변경하여 새롭게 생성된 목적에 맞는 일을 독립적으로
수행한다.

실습 코드

  • 멀티프로세스

<예제 5번>

from multiprocessing import Process 
# multiprocessing : 멀티프로세싱 프로그램을 하고 싶을 때 사용하는 패키지
# Process : 자식 프로세스를 생성할 때 사용하는 객체, 클래스 임.
import os

def func():
    print('안녕,  나는 실험용으로 대충 만들어본 함수야!')
    print('나의 프로세스 아이디:', os.getpid())
    print('나의 부모 프로세스 아이디:', os.getppid())

if __name__ == '__main__' :
    print('05.py 프로세스 아이디 :', os.getpid())
    child = Process(target=func).start()

# 05.py가 부모프로세스가 되고 하위프로세스에게 func한수를 시킬거야

<실행결과>

<예제 6번>

from multiprocessing import Process 
import os
import time


def func():
    print('안녕,  나는 실험용으로 대충 만들어본 함수야!')
    print('나의 프로세스 아이디:', os.getpid())
    print('나의 부모 프로세스 아이디:', os.getppid())

if __name__ == '__main__' :
    print('06.py 프로세스 아이디 :', os.getpid())
    child1 = Process(target=func)
    child1.start()
    time.sleep(0.5)
    child2 = Process(target=func)
    child2.start()
    time.sleep(0.5)
    child3 = Process(target=func)
    child3.start()
    time.sleep(0.5)

<실행결과>

<예제 7번>

from multiprocessing import Process 
import os
import time

def coke():
    print("콜라 프로세스 아이디: ", os.getpid())
    print("부모 프로세스 아이디: ", os.getppid())

def cider():
    print("사이다 프로세스 아이디: ", os.getpid())
    print("부모 프로세스 아이디: ", os.getppid())

def juice():
    print("주스 프로세스 아이디: ", os.getpid())
    print("부모 프로세스 아이디: ", os.getppid())

if __name__ == '__main__' :
    print('07.py 프로세스 아이디 :', os.getpid())
    child1 = Process(target=coke)
    child1.start()
    time.sleep(0.5)
    child2 = Process(target=cider)
    child2.start()
    time.sleep(0.5)
    child3 = Process(target=juice)
    child3.start()
    time.sleep(0.5)

<실행결과>

<과제 실습 코드>

# 내 파이썬 프로그램의 이름을 알아보자.
# psutil로 지금 돌아가고 있는 프로세스를 싹 다 조회한다
# 조회하다가 08.py와 프로세스 아이디가 일치하는 아이디를 발견하면 프로세스 이름을 출력한다.
import psutil 
import os


if __name__ == '__main__' :
    print('08.py 프로세스 아이디 :', os.getpid())

for proc in psutil.process_iter():
    ps_name = proc.name()
    if os.getpid() ==  proc.pid:
        print(f'08.py의 프로세스 이름은: {ps_name}', f'아이디는 : {proc.pid}')

<실행결과>

profile
빵먹으면서 코딩하는 개발자를 꿈꾸는 코린이

0개의 댓글