Post

[운영체제] 3장 프로세스와 프로세스 관리

3장 프로세스와 프로세스 관리


3.1 프로세스 개요

1.1 프로그램과 프로세스

프로세스란?

프로그램은 하드 디스크나 USB 등 저장 장치에 저장된 실행 가능한 파일이며, 프로그램이 메모리에 적재되어 실행 중일 때 프로세스라고 부른다.

※ 프로세스 메모리에 적재되어 실행중인 프로그램

3.1.1 프로세스의 특징
  • 메모리에 적재되어 실행중인 프로그램

  • 실행에 필요한 메모리 할당하고 이곳에 코드와 데이터 저장
  • 프로세스간 독립성 유지, 다른 프로세스 영역 접근 불가능
  • 프로세스마다 고유 ID(프로세스 ID) 할당됨
  • 프로세스에 관한 정보는 커널에 의해 관리됨

  • 프로세스는 생명주기를 지닌다 (실행-대기-잠자기 … )
3.1.2 프로세스 관리
  • 프로세스는 운영체제가 응용프로그램의 실행을 위해 생성한 것으로, 운영체제는 프로세스의 생성에서 종료까지 모든 것을 관리한다

  • 프로세스 생성, 실행, 일시 중단 및 재개, 프로세스 상태 관리, 프로세스 사이의 통신, 프로세스 사이의 동기화, 프로세스 종료 등 프로세스의 모든 행동을 처리한다.

3.1.3 프로세스 관리
  • 같은 프로그램을 여러번 실행하면 독립된 메모리 공간에서 실행되는 서로 다른 프로세스가 생성
  • 이를 프로그램의 다중 인스턴스라고 함
3.1.4 프로세스 주소 공간
  • 프로세스의 구성 - 4개의 메모리 영역으로 구성되며
    • Code, Data, Heap, Stack
  • 프로세스 주소 공간 - CPU가 액세스 할 수 있는 전체 크기
    • 사용자 공간 + 커널 공간
    • 가상 주소 공간 - 매핑 테이블을 통해 주소 관리

가상주소공간

3.2 커널의 프로세스 관리

3.2.1 프로세스 테이블과 프로세스 제어 블록
  • 프로세스 테이블 - 모든 프로세스의 정보를 관리
  • 프로세스 제어 블록(PCB) - 프로세스 정보를 저장
    • 0 이상의 양의 정수 …

※ 프로세스 생성은 커널에서 수행

프로세스제어블록

Nice 값이 크면 우선순위가 낮음 (양보를 잘해준다)

3.2.3 프로세스의 생명 주기와 상태 변이

프로세스생명주기

  • New 상태 - 프로세스가 새롭게 생성되었을 때의 상태

    • 커널은 새 프로세스의 코드와 데이터를 메모리에 적재하고, PCB를 만들어 프로세스 테이블의 빈 항목에 등록한다. 그리고 PCB에는 프로세스 상태를 New로 기록한다

    ※ 대부분 실행 준비가 완료되면 Ready로 전환 / 실시간 운영체제는 Deadline 내에 실행될 수 있는 Ready상태에 있는 프로세스 실행

  • Ready 상태 - 스케줄링을 기다리는 준비 상태로 커널에 있는 준비 큐(ready queue)에 들어간다.

    • **CPU 스케줄링** : 하나의 프로세스를 선택하는 과정

    ※ 기아 프로세스 : 장시간 선택을 받지 못한 프로세스

  • Running 상태 - CPU에 의해 현재 실행중인 프로세스

    • 실행이 완료되면 Terminated/Zombie 상태로 만듦

    • Running 상태에서 상태 변경할 때 스케줄링 실행 → PCB에 컨텍스트 저장 → 선택된 프로세스의 컨텍스트 스위칭 수행

  • Blocked 또는 Wait 상태 - 자원 요칭 및 입출력 요청하고 완료를 기다리는 상태

    • 요청 받으면 CPU 스케줄링 실행하여 컨텍스트 스위칭
  • Terminated/Zombie 상태 - 프로세스 종료 시 자원 모두 반환
    • 종료시 상태를 Terminated/Zombie 상태로 변경하지만 완전히 종료된 것은 아니며 부모 프로세스가 종료 코드를 읽어가기 전까지 PCB도 프로세스 테이블에 그대로 남겨둔다.
  • Terminated/Out 상태
    • 부모 프로세스가 PCB에서 종료 코드를 읽어갈 때 커널은 Zombie 상태의 PCB를 시스템에서 제거하며 프로세스 테이블에서도 제거한다.

3.2.4 프로세스 스케줄링

  • 스레드 (thread)는 프로세스보다 작은 크기의 실행 단위로서, 개발자가 작업(task)을 구현하는 단위 이며 운영체제에 의해 스케줄링되는 단위이다.
  • 오늘날 멀티스레드 운영체제에서 실행 단위는 프로세스가 아니라 스레드이다

3.3 프로세스의 계층 구조

3.3.1 프로세스의 부모 - 자식 관계

  • 모든 프로세스는 프로세스(부모)에 의해 생성

프로세스부모관계

  • 유휴 프로세스 (#0) - Ready 상태가 하나도 없을 때 실행되는 프로세스
    • 시스템 종료 과정을 책임짐
  • init 프로세스 (#1) - sshd 프로세스 생성 및 로그인 확인 후 쉘 프로세스를 자식으로 생성
  • kthreadd (#2) - 커널 모드로 실행되면서 커널의 기능을 돕는 프로세스

3.3.3 부모자식 프로세스의 실행 관계

  • fork() - 자식 프로세스를 생성하는 시스템 호출 함수

  • exit() - 현재 프로세스의 종료를 처리하는 시스템 호출 함수

  • wait() - 부모가 자식 프로세스가 종료할 때까지 기다리는 시스템 호출 함수

3.3.4 좀비 프로세스: 종료후 방치된 자식 프로세스

종료하였지만, 부모가 종료코드를 읽지 않는 상태로 시스템에 남아 있을 때, 이 프로세스를 좀비 프로세스라고 한다.

3.3.5 고아프로세스와 입양

어떤 경우든, 부모가 먼저 종료한 자식 프로세스들을 고아 프로세스(orphan process)라고 부 른다.

3.3.6 백그라운드 프로세스와 포그라운드 프로세스

  • 사용자와 대화를 하느냐 하지 않느냐에 따라 나뉨

3.3.7 CPU 집중 프로세스와 I/O 집중 프로세스

  • CPU 집중 프로세스 - 프로세스의 작업이 대부분 계산 중심적인 일로 구성되어 실행의 많은 부분에 CPU가 활용

  • I/O 집중 프로세스 - 프로세스의 작업 중 많은 부분 이 파일 입출력이나 네트워크 전송 등 입출력 작업

※ CPU 바운드 프로세스, I/O 바운드 프로세스

3.4 프로세스 제어 (fork, exec, wait, exit)

3.4.1 프로세스생성과 fork()

  • 시스템 부팅 과정에서 프로세스 생성
  • 로그인 시 쉘 프로세스 생성(bash, Windows 탐색기)
  • 사용자 명령에 따라 응용프로그램 프로세스 생성(vi a.c)
  • 배치(at, batch) 프로세스 생성
  • 응용프로그램이 다중처리 (multitasking)를 위해 자식 프로세스 생성

자식 프로세스가 생성되는 과정

3.4.2 프로세스오버레이와 exec()

  • 프로세스 오버레이(process overlay)는 현재 실행중인 프로세스의 주소 공간에 새로운 응 용프로그램을 적재하여 실행시키는 기법으로 exec() 시스템 호출이 사용된다

호출 프로세스의 모든 영역들이 사라진다. 그렇지만 호출 프로 세스의 PID는 그대로 계승된다.

exec

execlp

3.4.3 프로세스종료와프로세스종료 대기

부모 프로세스가 자식의 종료 확인
  • 자식이 남긴 종료 이유를 전달받도록 하는데 목적

부모가 wait() 시스템 호 출을 시행하면, wait()의 커널 코드는 자식 프로세스의 PCB에서 종료코드를 읽고, 자식 프로 세스의 PCB를 삭제하고 프로세스 테이블의 항목도 제거한다.

종류코드의 범위와 의미
  • 0〜255 사이의 1바이트 숫자로

※ WEXITSTATUS 매크로로 하위 8비트 가져올 수 있음

4.4 좀비프로세스

  • 자신이 남긴 종료코드가 부모에게 전달되지 않은 상태로 있을 때 좀비 프로세스라고 부른다

좀비 프로세스들이 존재하게 되는 이유는 부모 프로세스를 작성한 개발자의 무지에서 비롯되 거나 부모 프로세스에 오류가 발생하여 wait()를 부르지 않고 비정상 종료해버린 경우가 대부 분이다.

This post is licensed under CC BY 4.0 by the author.