[운영체제] Day2 프로세스

빵코·2024년 4월 4일

📌 프로세스

  • 프로세스란 '실행 중인 프로그램'을 뜻함, 프로세스는 메인메모리, 운영체제의 CPU 스케줄링, 키보드나 마우스 같은 입출력장치등 컴퓨터의 리소스를 사용하는 활동적인 존재로 잠만자고 있는 프로그램이랑 다르다.

📌 프로세스 구조

프로세스는 운영체제가 관리하는 하나의 객체라고 할 수 있고 구조를 가지고 있다.

  • 명령어가 담긴 코드영역
    프로세스가 실행하는 코드, 즉 명령어 집합이 저장되어 있는 영역

  • 전역변수 등이 담긴 데이터 영역
    코드에서 여러 변수들을 호출해서 사용하는데 이 중 전역변수나 static변수 등이 저장되 있는 영역

  • 지역변수 등이 담긴 스택 영역
    지역변수나 함수의 매개변수 같은 휘발성 변수가 저장되어 있는 영역

  • 동적 메모리 할당을 위한 힙 영역
    프로세스가 동적으로 메모리를 할당하는 경우에 사용하는 영역

    📌 레지스터


    <출처:유노코딩>

    프로세스의 구성요소는 아니지만 프로세스 관리 시 무척 중요한 역할을 하는 레지스터
    프로그램의 실행을 위해서는 절대적으로 레지스터가 필요하다

    CPU가 명령을 실행 할 때마다 사용해야 할 다양한 유형의 데이터들이 레지스터에 임시적으로 저 장되는 과정을 반복해야하고,
    CPU를 구성하는 레지스터들은 현재 실행중인 프로세스들을 위한 데이터들로 채워지게 된다.
    따라서 레지스터의 상태들도 프로세스의 일부로 포함시켜 말할 수 있다.

    📌 VSC 실습 예제 코드

    <예제 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 받을 수 있음

    <실행결과>

📌 프로세스 상태

프로세스는 어떻게 관리되는가

Process Control Block

컴퓨터에서는 여러개의 프로그램을 실행시켜두는 경우가 많다. 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이 본체인 것.

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

0개의 댓글