본문 바로가기

CS

[CS] 프로세스

프로세스: "실행중인 프로그램"

윈도우의 경우 작업 관리자를 통해서 확인할 수 있습니다.

 

프로세스 종류

  • 포그라운드 프로세스(foreground process)
    • 사용자가 볼 수 있는 공간에서 실행되는 프로세스
  • 백그라운드 프로세스(background process)
    • 사용자가 볼 수 없는 공간에서 실행되는 프로세스
    • 사용자와 상호작용하지 않고 그저 정해진 일만 수행하는 프로세스(데몬, 서비스)

(데몬, 서비스)

 

 

프로세스 제어 블록

  • 모든 프로세스는 실행을 위해 CPU가 필요하다
  • 하지만 CPU 자원은 한정되어 있다.
  • 프로세스들은 돌아가며 한정된 시간 만큼만 CPU를 이용
    • 자신의 차례에 정해진 시간만큼 CPU 이용
    • 타이머 인터럽트가 발생하면 차례 양보

 

  • 이렇게 빠르게 번걸아 수행되는 프로세스들을 관리해야 한다.
  • 이를 위해 사용하는 자료구조가 프로세스 제어 블록(PCB)
    • 프로세스 관련 정보를 저장하는 자료 구조
    • 마치 상품에 달린 태그처럼 달려있는 정보
    • 프로세스 생성 시 커널 영역에 생성, 종료 시 폐기

 

PCB에 저장되는 정보

  • 프로세스 ID (=PID) 
    • 특정 프로세스를 식별하기 위해 부여하는 고유한 번호(학번, 사번)
  • 레지스터 값
    • 프로세스는 자신의 실행 차례가 오면 이전까지 사용한 레지스터 중간 값을 모두 복원 => 실행 재개
    • 프로그램 카운터, 스택 포인터 ...
  • 프로세스 상태
    • 입출력 장치를 사용하기 위해 기다리는 상태
    • CPU를 사용하기 위해 기다리는 상태
    • CPU 이용 중인 상태
  • CPU 스케줄링 정보
    • 프로세스가 언제, 어떤 순서로 CPU를 할당받을지에 대한 정보
  • 메모리 정보
    • 프로세스가 어느 주소에 저장되어 있는지에 대한 정보
    • 페이지 테이블 정보
  • 사용한 파일과 입출력장치 정보
    • 할당된 입출력장치, 사용 중인(열린) 파일 정보

 

 

문맥 교환(cotext switch)

 

  • 한 프로세스에서 다른 프로세스로 실행순서가 넘어가면 컴퓨터 내부에서는 어떤 과정이 일어날까?
  • 기존에 실행되던 프로세스 A는 지금까지의 중간 정보를 백업
    • 프로그램 카운터 등 각종 레지스터 값, 메모리 정보, 열었던 파일, 사용한 입출력장치 등
    • 이러한 중간 정보 == 문맥(context)
    • 다음 차례가 왔을 때 실행을 재개하기 위한 정보
    • "실행 문맥을 백업해두면 언제든 해당 프로세스의 실행을 재개할 수 있다!"
  • 뒤이어 실행할 프로세스 B의 문맥을 복구
    • 자연스럽게 실행 중인 프로세스가 바뀜

 

이처럼 기존의 실행 중인 프로세스 문맥을 백업하고 

새로운 프로세스 실행을 위해 문맥을 복구하는 과정을

문맥 교환(context switching)이라 한다.

  • 여러 프로세스가 끊임없이 빠르게 번갈아 가며 실행되는 원리

 

 

프로세스의 메모리 영역

그렇다면 사용자 영역에는?

 

크게 코드 영역(= 텍스트 영역), 데이터 영역, 영역, 스택 영역

코드 영역(= 텍스트 영역)

  • 실행할 수 있는 코드, 기계어로 이루어진 명령어 저장
  • 데이터가 아닌 CPU가 실행할 명령어가 담기기에 쓰기가 금지된 영역(read-only)
  • 정적 할당 영역 (크기가 고정되어 있음)

데이터 영역

  • 잠깐 썼다가 없앨 데이터가 아닌 프로그램이 실행되는 동안 유지할 데이터 저장
  • 전역 변수
  • 정적 할당 영역

힙 영역

  • 프로그램을 만드는 사용자, 즉 프로그래머가 직접 할당할 수 있는 저장공간
  • 할당했다면 언젠가는 메모리 공간을 반환을 해야한다. (가비지 컬렉션)
  • 반환하지 않는다면 계속 메모리 공간을 차지하면서 메모리를 차지한다(메모리 누수)
  • 동적 할당 영역

스택 영역

  • 데이터가 일시적으로 저장되는 공간
  • (데이터 영역에 담기는 값과는 달리) 잠깐 쓰다가 말 값들이 저장되는 공간
  • 매개 변수, 지역 변수
  • 동적 할당 영역

 

  • 힙 영역과 스택 영역의 크기는 가변적
    • 일반적으로 힙 영역은 낮은 주소 => 높은 주소로 할당
    • 일반적으로 스택 영역은 높은 주소 => 낮은 주소로 할당
    • 스택 영역과 힙 영역의 크기는 가변적이다.
    • 따라서 커질 수 있는 공간에 한계가 있기 때문에 메모리 영역이 충돌할 수 있다.
    • 그래서 주소가 겹치지 않게, 할당되는 방향이 반대 방향으로 커진다!

 

 

 

프로세스 상태와 계층 구조

많은 운영체제는 각기 다른 상태동시다발적으로 수행되는 수많은 프로세스들을 계층적으로 관리한다.

 

프로세스 상태 

  • 생성 상태
    • 이제 막 메모리에 적재되어 PCB를 할당 받은 상태
    • 준비가 완료되었다면 준비 상태로
  • 준비 상태
    • 당장이라도 CPU를 할당 받아 실행할 수 있지만
    • 자신의 차례가 아니기에 기다리는 상태
    • 자신의 차례가 된다면 실행 상태로(=디스패치)
  • 실행 상태
    • CPU를 할당 받아 실행 중인 상태
    • 할당된 시간 모두 사용 시(타이머 인터럽트 발생시) 준비 상태로
    • 실행 도중 입출력장치를 사용하면 입출력 작업이 끝날 때까지 대기 상태로
  • 대기 상태
    • 프로세스가 실행 도중 입출력장치를 사용하는 경우
    • 입출력 작업은 CPU에 비해 느리기에 이 경우 대기 상태로 접어듬
    • 입출력 작업이 끝나면 (입출력 완료 인터럽트를 받으면) 준비 상태로
  • 종료 상태
    • 프로세스가 종료된 상태
    • PCB, 프로세스의 메모리 영역 정리

 

프로세스 계층 구조

  • 프로세스 실행 도중(시스템 호출을 통해) 다른 프로세스 생성 가능
  • 새 프로세스를 생성한 프로세스: 부모 프로세스
  • 부모 프로세스에 의해 생성된 프로세스: 자식 프로세스
  • 윈도우는 계층적으로 관리하진 않음

부모 프로세스와 자식 프로세스는 별개의 프로세스이므로 각기 다른 PID값을 가짐

일부 운영체제에서는 자식 프로세스 PCB에 부모 프로세스 PID(PPID)를 명시하기도 한다.

 

  • 자식 프로세스는 또 다른 자식 프로세스를 낳을 수 있고
  • 그 자식 프로세스는 또 다른 자식 프로세스를 낳을 수 있고
  • 그 자식 프로세스는 또 다른 자식 프로세스를 낳을 수 있고
  • 그 .. => 프로세스의 계층적인 구조 형성

예시)

 

 

프로세스 생성 기법

  • 부모 프로세스는 자식 프로세스를 어떻게 만들어 내고,
  • 자식 프로세스는 어떻게 자신만의 코드를 실행할까?
  • 윈도우 운영체제와는 큰 관련이 없음

부모 프로세스의 자식 프로세스 생성 => "복제와 옷 갈아입기"

  • 부모 프로세스는 fork 시스템 호출을 통해 자신의 복사본을 자식 프로세스로 생성
  • 자식 프로세스는 exec 시스템 호출을 통해 자신의 메모리 공간을 다른 프로그램으로 교체

 

fork 시스템 호출

  • 복사본(=자식 프로세스) 생성
  • 부모 프로세스의 자원 상속

exec 시스템 호출

  • 메모리 공간을 새로운 프로그램으로 덮어쓰기
  • 코드/데이터 영역은 실행할 프로그램 내용으로 바뀌고 나머지 영역은 초기화
  • 내가 지금부터 실행할 프로그램으로 바뀜

 

 

 

 

 

해당 포스팅에 나온 글과 이미지들은 강민철 저자님의 혼자 공부하는 컴퓨터 구조 + 운영체제의 책과 강의를 참고하여 만들어졌습니다.

책에서 보다 깊게 나오는 내용이 있으므로 한번 구매하고 보셔도 좋을 것 같습니다.

 

 

'CS' 카테고리의 다른 글

[CS] CPU 스케줄링 알고리즘  (1) 2024.05.25
[CS] 스레드  (0) 2024.05.25
[CS] 운영체제의 핵심 서비스  (0) 2024.05.24
[CS] 운영체제란?  (0) 2024.05.24
[CS] 입출력장치  (0) 2024.05.23