프로세스, 스레드

프로세스

1960년대. 멀틱스 시스템 설계자가 처음 사용하였고 작업이란 용어와 함께 사용되며, 다양한 정의를 가진다.
가장 일반적인 정의는 실행중인 프로그램이다.

디스크에 저장되어 있던 실행 가능한 프로그래밍 메모리에 적재되어 운영체제의 제어를 받는 상태
해당 프로세스가 사용하고 있는 메모리 영역(자신의 주소공간)이 존재함을 의미한다.
프로세서 할당(점유)시간과 메모리, 파일, 입출력장치 등의 자원이 필요하며, 자원은 프로세스 생성 및 실행 시 할당
현재의 활동 상태를 나타내는 프로그램 카운터, 프로세서의 현재 활동(레지스터 내용) 포함

프로그램과 달리 프로세서는 메모리에 주소공간을 갖는 능동적인 개체이다.

  • 실행 스택(Stack): 호출된 프로시저(함수)의 복귀 주소와 지역변수 등의 일시적인 데이터를 저장하는 영역
  • 실행 힙(Heap): 텍스트(코드) 영역과는 별도로 유지되는 자유 영역
  • 데이터(정적 변수): 프로세스 실행 중 동적으로 할당 받는 영역, 전역 또는 정적 변수 저장
  • 텍스트(코드): 프로세서가 실행하는 코드 저장

메모리 내에 동일한 사본을 여러 사용자가 공유할 수 있도록 작성된 프로그램, 루틴
실행 중 사용할 데이터를 보관하는 실행 스택과 공통적인 데이터를 보관하는 데이터 영역을 가진다.
프로세서가 동일한 프로그램을 사용하여도 텍스트(코드) 영역은 같으나 별도의 스택에 서로 다른 데이터를 가지므로 별개의 프로세스로 인식한다.
데이터베이스, 문서 편집기 등
프로세서는 사용자 관점에서 세그먼트(코드, 데이터, 스택)의 가상 주소 공간을 갖는 상태를 의미, 시스템 관점에서 실행 중인 프로그램을 의미한다.
처리 상태에 있는 데이터 구조로 표현 가능하다.

실행 유형에 따라 크게 3가지로 구분한다.

  • 운영체제 프로세스: 커널 프로세스, 시스템 프로세스라 부른다.
  • 사용자 프로세스: 사용자 코드 수행
  • 병행 프로세스: 독립 프로세스, 협동 프로세스로 나뉜다.

실행, 비실행 프로세스 구분

프로세스는 실행되며 상태가 변하므로 운영체제는 프로세스 제어에 필요한 프로세스 상태를 점검해야 한다.

  • 실행 상태: 명령어가 실행되는 상태, 즉 프로세스가 프로세서를 점유한 상태
  • 대기, 보류 상태: 프로세서가 이벤트(입출력 종료와 같은 외부 신호)가 일어나길 기다리는 상태
  • 준비 상태: 프로세스가 프로세서를 할당받기 위해 기다리는 상태
  • 대부분의 프로세스는 준비, 대기(보류) 상태이며, 어느 한 순간에 한 프로세스만 실행 상태가 된다.
    시스템의 모든 프로세스는 종료되어 시스템을 떠날 떄까지 준비, 실행, 대기 상태로 변화하며 실행되는 과정을 반복한다.
    운영체제는 프로세서 스케줄러를 이용해 프로세스 상태 변화를 관리한다.

작업 스케줄러

스풀러가 디스크에 저장한 작업들 중 실행할 작업을 선정, 준비 리스트에 삽입한다.
이를 통해 다중 프로그래밍의 정도를 결정하는 핵심적인 역할을 수행한다.
선정한 작업에 대한 프로세스의 생성에서 종료까지의 과정 수행을 위해 상태 변화를 일으킨다.
실행 프로세스가 자발적으로 프로세서 반환 전 할당된 시간이 경과하면 준비 상태로 변경된다.
실행 프로세스가 실행하다 입출력 명령이 발생 시 대기 상태로 변경된다.
대기 프로세스는 보류 이유가 제거되면 준비 상태로 변경된다.
준비 프로세스는 디스패치가 프로세서를 할당하면 다시 실행 상태로 변경된다.

준비 -> 실행

  • 디스패치: 준비 리스트 맨 앞에 있던 프로세스가 프로세서를 선택(배당되어 실행)하는 것
  • 시간할당: 실행 프로세스가 프로세서를 일정 시간만 사용할 수 있도록 시간을 제한한다. (특정 프로세서 독점 방지)

실행 -> 준비
프로세스가 프로세서를 점유한 상태를 ‘프로세스가 실행 상태에 있다.’ 라고 한다.
운영체제는 프로세스의 독점을 방지하기 위해 인터럽트 클록을 둔다.

실행 -> 대기(보류)
실행 프로세스가 지정 시간 전에 입출력 연산 등이 필요하거나 새로운 자원 요청 등의 문제 발생 시 스스로 프로세서를 양도하고 대기 상태로 변경한다.

대기 -> 준비

  • 깨움: 프로세스의 마지막 상태 변화로 입출력 작업이 끝났을 때 발생한다.

프로세스의 교환은 인터럽트와 트랩, 시스템 호출로 나타낸다.

실행 중인 프로세스가 인터럽트 되어 운영체제가 다른 프로세스를 실행 상태로 변경, 제어를 넘겨줄 때 프로세서의 레지스터 내용은 저장해야 한다.
프로세스는 현재 사용되는 자원에 대한 정보를 가지며, 실행되는 과정에서 여러 프로세스가 파생될 수 있는 능동적인 개체이다.
자원을 할당 받은 상태의 프로그램을 의미하기도 한다.

프로세스 관리

실행 중 프로세스 생성 시스템을 호출, 새로운 프로세스를 생성 가능하다.
프로세스 생성 순서 저장, 부모-자식 관계를 유지하며 계층적으로 생성된다.

  • 부모 프로세스: 생성하는 프로세스
  • 자식 프로세스: 생성되는 프로세스

유닉스 시스템의 일반적인 프로세스 계층 구조

1
2
3
처음 부팅 시 식별자가 0인 첫 번째 프로세스 swapper 생성
init(PID = 1) page daemon(PID = 2) 생성
swapper(PID = 0) page daemon(PID = 2)를 운영체제 프로세스라 하며 운영체제 모드에서만 실행

모든 사용자 프로세스는 FORK 명령을 통해 계층적으로 init 의 자식 프로세스이다.

프로세스는 운영체제, 다른 사용자의 응용 프로그램 요청에 의해 생성된다.

운영체제가 새로운 프로세스를 생성, 추가하려면 프로세스 관리를 위한 프로세서 제어 블록(PCB)을 만든 후 프로세스에 주소 공간을 할당해야 한다.

프로세스가 작업을 수행하기 위해 자원이 필요하다.

자식 프로세스 생성 시 필요한 자원을 운영체제로부터 직접 부모 프로세스의 자원 일부 사용이 가능하다.
부모 프로세스는 자식 프로세스에 자원을 나눠주거나 일부 자원를 공유 가능하다.
프로세스 생성 시 획득하는 다양한 물리적, 논리적 자원 외 약간의 초기화 데이터가 부모 프로세스에서 자식 프로세스로 전달되는 경우도 있다.

새로운 프로세스 생성 시 실행과 관련해 다음 두 가지 경우가 가능하다.

부모 프로세스, 자식 프로세스가 동시에 실행된다.
부모 프로세스, 자식 프로세스들이 모두 종료될 때까지 기다린다.
자식 프로세스가 부모 프로세스의 주소 공간을 복사한다.
자식 프로세스가 별도의 프로그램을 적재한다.

프로세스가 명령 실행 후 종료되고 운영체제에 프로세스를 삭제 요청한다.

  • 일괄 처리 환경: 작업 종료를 의미하는 신호로 인터럽트 발생 또는 시스템 호출로 중지 명령 전달, 프로세스를 완료한다.
  • 대화형 환경: 사용자가 로그아웃 하거나 터미널을 닫을 때 오류에 의해 프로세스를 종료한다.
  • ABORT 시스템 호출을 이용한 프로세스 종료

부모 프로세서는 아래의 이유로 자식 프로세스를 종료 가능하다.

  • 자식 프로세스가 할당된 자원을 초과하여 자원을 사용할 때
  • 자식 프로세스에 할당된 작업이 더 이상 없을때

연속 종료

시스템이 부모 프로세스 종료 시 자식 프로세스의 존재를 허용하지 않아 종료시키는 현상으로 운영체제가 수행한다.
유닉스에스 exit 명령으로 프로세스 종료, 부모 프로세스는 wait 명령을 사용하여 자식 프로세스의 종료를 기다린다.

프로세스를 종료하는 경우, 그 예

  • 정상 종료: 프로세스가 운영체제의 서비스를 호출한 경우
  • 시간 초과: 프로세스가 명시된 전체시간을 초과하여 실행되거나 명시된 시간을 초과하면서 어떤 이벤트 발생을 기다리는 경우
  • 실패: 파일 검색 실패, 명시된 횟수를 초과하여 입출력이 실패한 경우
  • 산술 오류, 보호 오류, 데이터 오류 등
  • 메모리 부족, 접근 위반 등

프로세스를 파괴하는 것

제거 시 프로세스에 속한 자원을 시스템에 돌려주고 해당 프로세스는 시스템 리스트나 테이블에서 사라지며, 프로세스 제어 블록 회수
프로그램은 디스크에 저장된다.

프로세스 중단 (일시정지)

프로세서의 동작시간과 입출력 동작시간의 차이로 시스템의 활동시간이 유휴 상태로 되는 것을 해결 가능하다.
장시간 중단되는 경우 해당 프로세스에 할당된 자원을 다시 풀어주어야 하며 풀어줄 자원의 결정은 자원의 성질에 따라 결정한다.
다중 프로그래밍에서 중단은 자원 부족(대기) 상태를 의미하기도 한다.

운영체제는 다음 두 가지 방법으로 프로세스를 실행 가능하다.

새로운 프로세스를 생성하여 실행한다.
이미 실행 중인 프로세스를 중단시켰다가 다시 실행한다.

프로세스 재시작

중단 원인이 제거되어 프로세스가 다시 실행되는 것
중단 되었던 프로세스는 중단 되었던 지점부터 다시 시작

프로세스 중단과 재시작이 발생하는 경우

시스템에 장애가 발생하면 실행 중인 프로세스는 잠시 중단했다가, 시스템이 기능을 회복했을 때 다시 재시작할 수 있다.
프로세스의 어느 부분이 의심스러울 때 사용자는 실행 중인 프로세스를 중단하여 확인한 후 재시작하거나 정지할 수 있다.
처리할 일이 많아 시스템이 부담이 크면 프로세스 몇 개를 중단했다가 시스템이 정상 상태로 돌아올 때 재시작할 수 있다.

중단과 재시작을 추가한 프로세스 상태 변화

  • 중단: 프로세스 자신, 다른 프로세스에 의해 가능
  • 단일 처리 시스템: 프로세스 자신이 중단시켜야 한다.
  • 다중 처리 시스템: 다른 프로세서에 의해서도 가능하지만, 다른 프로세서가 재시작 시켜 주기 전에 실행이 불가능하다.

프로세스 제어 블록의 우선 순위 값 변경 가능

준비 리스트의 프로세스는 프로세서 중심 프로세스(낮은 우선 순위), 입출력 중심 프로세스(높은 우선 순위)로 구분한다.
입출력 중심의 프로세스를 자주 짧게 사용, 프로세서 중심 프로세스는 사용 횟수는 적으나 한번에 오래 사용하게 하여 균형을 유지한다.

인터럽트(interrupt)

현재 실행되는 프로세스와 별도로 외부에서 발생되는 여러가지 종료 이벤트(입출력 동작의 종료 등)에 의해 발생
제어가 인터럽트 처리 루틴으로 넘어간 후 에도 기본 시스템 관리 작업을 처리, 인터럽트 형태에 따라 관련된 운영체제 루틴으로 분기한다.
입출력 인터럽트

  • 클록 인터럽트: 현재 실행 중인 프로세스의 할당 시간을 조사하여 실행 중인 프로세스를 준비 상태로 변경, 다른 프로세스를 디스패치하여 실행 상태로 변경

트랩

부적절한 파일 접근, 현재 실행 중인 프로세스에 의해 발생되는 오류나 예외 상황으로 인해 발생