Page

관련 포스팅

2023년 10월 5일 목요일

OS Chapter3 정리: The Process Model, Process Creation, Process Termination, Process Hierarchies, Process States, Implementation of Processes, Modeling Multiprogramming, Linux

OS Chap3


The Process Model

프로세스 모델은 실행 중인 프로그램의 인스턴스로, 프로그램 카운터(PC), 레지스터, 변수 등의 현재 값들을 포함하는 것입니다. 이것은 운영 체제에서 프로그램이 실행되는 방식을 설명하는 중요한 개념 중 하나입니다. 프로세스는 각각 독립적으로 실행되며, 운영 체제는 이러한 프로세스들을 관리하고 조율하여 시스템의 작동을 제어합니다.

UNIX 시스템에서의 프로세스는 메모리를 세 개의 세그먼트로 나누어 사용합니다: 텍스트 세그먼트(프로그램 코드), 데이터 세그먼트(변수), 스택 세그먼트입니다. 데이터 세그먼트는 상향으로 성장하고 스택은 하향으로 성장합니다. 이러한 메모리 구조는 프로세스가 데이터와 코드를 관리하고 실행하는 데 도움이 됩니다.

멀티프로그래밍 시스템은 다음과 같은 특징을 가지고 있습니다:

  1. CPU가 빠르게 프로세스 간에 전환됩니다.
  2. CPU는 각 프로세스를 수십 또는 백 밀리초 동안 실행합니다.
  3. 엄밀히 말하면 어느 한 순간에 CPU는 하나의 프로세스만 실행합니다.

이렇게 빠른 프로세스 간 전환을 멀티프로그래밍이라고 합니다. 여기에는 하나의 순간에 활성화되는 프로그램이 하나뿐인 경우가 포함됩니다. 이는 여러 프로그램이 동시에 실행되는 것처럼 느껴질 수 있지만, 엄밀히 말하면 CPU는 한 번에 하나의 프로세스만 실행합니다.

Process Creation

프로세스 생성은 네 가지 주요 이벤트에 의해 발생합니다:

  1. 시스템 초기화: 운영 체제가 부팅될 때 대개 여러 프로세스가 생성됩니다. 일부는 사용자와 상호 작용하고 작업을 수행하는 전경 프로세스(foreground processes)입니다. 다른 것들은 백그라운드에서 실행되며 특정 기능과 관련이 있으며 특정 사용자와 관련되지 않습니다. 이러한 백그라운드에서 실행되는 프로세스는 데몬(daemons)이라고 불립니다. 데몬은 이메일, 웹 페이지, 뉴스, 인쇄 등과 같은 활동을 처리하기 위해 백그라운드에서 실행됩니다.

  2. 실행 중인 프로세스가 프로세스 생성 시스템 호출을 실행: 종종 실행 중인 프로세스는 작업을 수행하는 데 도움이되는 하나 이상의 새 프로세스를 생성하기 위해 시스템 호출을 사용합니다. 예를 들어, 네트워크를 통해 대량의 데이터를 가져와 이후 처리를 수행하는 경우 데이터를 가져오고 공유 버퍼에 넣는 프로세스를 생성하고, 다른 프로세스가 데이터 항목을 제거하고 처리할 수 있도록 할 수 있습니다. 다중 프로세서 시스템에서는 각 프로세스를 다른 CPU에서 실행하도록 허용하는 것이 작업을 빠르게 할 수 있습니다.

  3. 새 프로세스 생성을 요청하는 사용자 요청: 대화형 시스템에서 사용자는 명령을 입력하거나 아이콘을 (두 번) 클릭하여 프로그램을 시작할 수 있습니다. 이러한 동작 중 하나를 수행하면 새 프로세스가 시작되고 선택한 프로그램이 해당 프로세스에서 실행됩니다. 명령 기반 UNIX 시스템에서 X를 실행 중인 경우 새 프로세스가 시작된 창을 가져옵니다.

  4. 배치 작업의 시작: 프로세스 생성이 발생하는 마지막 상황은 대형 메인프레임에서만 해당되며 일련의 상점에서 하루가 끝날 때 재고 관리 등의 작업에 적용됩니다. 여기서 사용자는 시스템에 배치 작업을 제출할 수 있습니다(원격으로 가능). 운영 체제는 더 많은 작업을 실행하기 위해 충분한 리소스가 있는 경우 새 프로세스를 생성하고 입력 대기열에서 다음 작업을 실행합니다.

Process Termination

프로세스 종료는 다음과 같은 일반적인 조건에 의해 발생합니다:

  1. 정상 종료 (자발적 종료).
  2. 오류 종료 (자발적 종료).
  3. 치명적 오류 (강제 종료).
  4. 다른 프로세스에 의한 종료 (강제 종료).

Normal exit (voluntary) 정상 종료 (자발적)

대부분의 프로세스는 작업을 완료했기 때문에 종료됩니다. 컴파일러가 주어진 프로그램을 컴파일한 경우, 컴파일러는 작업을 완료했음을 운영 체제에 알리기 위해 시스템 호출을 실행합니다. UNIX에서는 이 호출이 'exit'이며 Windows에서는 'ExitProcess'입니다. 화면 지향 프로그램도 자발적 종료를 지원합니다. 워드 프로세서, 인터넷 브라우저 및 유사한 프로그램은 항상 사용자가 임시 파일을 제거한 다음 종료하도록 알리는 아이콘 또는 메뉴 항목을 가지고 있습니다.

Error exit (voluntary) 오류 종료 (자발적)

종료의 두 번째 이유는 프로세스가 치명적 오류를 발견했기 때문입니다. 예를 들어, 사용자가 "cc foo.c" 명령을 입력하여 프로그램 "foo.c"를 컴파일하고 해당 파일이 없는 경우 컴파일러는 이 사실을 간단히 발표하고 종료합니다.

화면 지향 대화형 프로세스는 일반적으로 잘못된 매개변수가 주어질 때 종료하지 않습니다. 대신 대화 상자를 팝업하고 사용자에게 다시 시도하라는 메시지를 보냅니다.

Fatal error (involuntary) 치명적 오류 (강제 종료)

종료의 세 번째 이유는 종종 프로그램 버그로 인한 프로세스에서 발생한 오류입니다. 이러한 오류 예로는 불법 명령 실행, 존재하지 않는 메모리 참조 또는 0으로 나누기가 포함됩니다. 일부 시스템 (예: UNIX)에서는 프로세스가 특정 오류를 스스로 처리하길 원하는 경우 해당 오류가 발생할 때 프로세스가 종료되는 대신 프로세스에 신호가 전달됩니다.

Killed by another process (involuntary) 다른 프로세스에 의한 종료 (강제 종료)

프로세스가 다른 프로세스를 종료하도록 운영 체제에 지시하는 시스템 호출을 실행하는 경우 프로세스가 종료될 수 있습니다. UNIX에서 이 호출은 'kill'이며 해당하는 Win32 함수는 'TerminateProcess'입니다. 이 경우 죽이는 프로세스는 죽는 프로세스에 대한 필요한 권한을 가지고 있어야 합니다.

Process Hierarchies

프로세스 계층구조는 일부 시스템에서 부모 프로세스가 자식 프로세스를 생성할 때 부모 프로세스와 자식 프로세스가 특정 방식으로 연결된 상태를 유지하는 경우가 있습니다. 자식 프로세스는 더 많은 프로세스를 생성할 수도 있습니다.

UNIX

UNIX에서는 한 프로세스와 해당 프로세스의 모든 자식 및 하속 프로세스는 프로세스 그룹을 형성합니다. 사용자가 키보드에서 신호를 보낼 때, 해당 키보드와 관련된 프로세스 그룹의 모든 멤버에게 신호가 전달됩니다. 각 프로세스는 개별적으로 해당 신호를 받아서 처리하거나 무시하거나, 또는 기본 동작으로 해당 신호에 의해 종료될 수 있습니다.

Windows

반면, Windows에는 프로세스 계층구조라는 개념이 없습니다. 모든 프로세스는 동등합니다. 프로세스 계층구조의 유일한 단서는 프로세스가 생성될 때 부모에게 특별한 토큰(핸들이라고 함)이 부여되며 부모는 이를 사용하여 자식을 제어할 수 있다는 것입니다. 그러나 이 토큰을 다른 프로세스로 전달하여 계층 구조를 무효화시킬 수 있습니다. UNIX에서는 프로세스가 자식 프로세스를 상속하지 않을 수 있습니다.

Process States

  1. Running (actually using the CPU at that instant)
  2. Ready (scheduled and runnable; temporarily stopped to let another process run)
  3. Blocked (unable to run until some external event happens)

프로세스 상태

프로세스는 세 가지 상태 중 하나에 있을 수 있습니다:

  1. 실행 중 (실제로 CPU를 사용 중인 상태)
  2. 준비 중 (스케줄되어 실행 가능하며, 일시적으로 다른 프로세스가 실행되도록 일시 중지된 상태)
  3. 차단됨 (어떤 외부 이벤트가 발생할 때까지 실행할 수 없는 상태)

프로세스는 실행 중, 차단됨 또는 준비 중 상태 중 하나에 있을 수 있으며, 이러한 상태 간의 전환은 다음과 같이 표시됩니다.

전환 1은 운영 체제가 프로세스가 현재 진행할 수 없다는 것을 발견했을 때 발생합니다. 일부 시스템에서는 프로세스가 차단된 상태로 진입하려면 pause와 같은 시스템 호출을 실행할 수 있습니다. 다른 시스템, UNIX를 포함한 일부 시스템에서는 프로세스가 파이프 또는 특수 파일(예: 터미널)에서 읽고 입력이 없을 때 자동으로 차단됩니다.

전환 2와 3은 프로세스 스케줄러, 운영 체제의 일부,가 프로세스가 전혀 알지 못하게 발생합니다. 전환 2는 스케줄러가 실행 중인 프로세스가 충분히 오랫동안 실행되었으며 다른 프로세스가 CPU 시간을 가질 시간이라고 판단할 때 발생합니다. 전환 3은 다른 모든 프로세스가 공정하게 CPU 시간을 사용한 후 첫 번째 프로세스가 다시 CPU를 사용할 때입니다.

전환 4는 프로세스가 대기하던 외부 이벤트(예: 일부 입력의 도착)가 발생할 때 발생합니다. 해당 순간에 다른 프로세스가 실행 중이지 않으면 전환 3이 트리거되어 프로세스가 실행을 시작합니다. 그렇지 않으면 CPU를 사용할 수 있을 때까지 준비 상태에서 잠시 기다려야 할 수 있습니다.

운영 체제의 가장 낮은 수준은 스케줄러이며, 이 스케줄러 위에 여러 프로세스가 있습니다. 모든 인터럽트 처리와 프로세스 시작 및 중지 세부 정보는 여기에서 스케줄러라고 부르는 곳에 숨겨져 있으며, 사실 많은 코드가 필요하지 않습니다. 운영 체제의 나머지 부분은 프로세스 형태로 잘 구조화되어 있습니다. 그러나 실제로는 이렇게 멋지게 구조화된 시스템은 많지 않습니다.

프로세스로 구조화된 운영 체제의 가장 낮은 계층은 인터럽트 및 스케줄링을 처리합니다. 이 계층 위에는 순차적인 프로세스들이 있습니다.

Implementation of Processes

프로세스 구현

프로세스 모델을 구현하기 위해 운영 체제는 프로세스당 하나의 항목을 포함하는 테이블(구조체 배열)을 유지합니다. 이 테이블은 프로세스 테이블이라고 하며, 각 항목에는 프로세스의 상태에 대한 중요한 정보가 포함되어 있습니다. 이 정보에는 프로세스의 프로그램 카운터, 스택 포인터, 메모리 할당, 열린 파일의 상태, 회계 및 스케줄링 정보, 프로세스가 중지되었을 때 저장해야 하는 모든 정보 등이 포함됩니다. 이 정보들은 프로세스가 실행 중인 상태에서 준비 또는 차단된 상태로 전환될 때 저장되어 나중에 프로세스가 중지되었던 것처럼 다시 시작될 수 있도록 합니다.

하나 또는 각 CPU에서 유지되는 여러 순차적 프로세스의 환상. 사용자 프로세스가 디스크 인터럽트가 발생할 때 어떤 동작을 하는지에 대한 최하위 수준 운영 체제의 기본 구조.

각 I/O 클래스와 관련하여 인터럽트 벡터라고 불리는 위치가 있습니다. 이 위치는 일반적으로 메모리 하단 부근에 고정 위치하며 인터럽트 처리에 사용됩니다.

Modeling Multiprogramming

다중 프로그래밍 모델링은 운영 체제에서 여러 프로세스가 동시에 실행될 때 CPU의 효율적인 사용을 모델링하는 방법입니다. 이 모델링은 CPU 이용률을 확률적인 관점에서 고려합니다.

가정하자면 하나의 프로세스가 실행 중일 때 그 프로세스가 I/O 작업이 완료되기를 기다리는 시간 비율을 p로 표현할 수 있습니다. 그리고 메모리에 동시에 n개의 프로세스가 있는 경우, 모든 n개의 프로세스가 I/O를 기다리고 있다는 상황 (이 경우 CPU가 비어 있는 상태)의 확률은 p^n 이 됩니다. CPU 이용률은 이러한 확률적 모델을 통해 계산됩니다.

즉, CPU 이용률은 다음과 같은 공식으로 계산됩니다:

CPU 이용률 = 1 - (모든 프로세스가 I/O 대기 상태일 확률) CPU 이용률을 높이기 위해서는 모든 프로세스가 동시에 I/O를 기다리는 확률을 최소화해야 합니다. 이 모델은 프로세스 간의 독립성을 가정하며, 한 프로세스가 I/O를 기다리는 동안 다른 프로세스가 CPU를 사용할 수 있다는 가정을 바탕으로 합니다.

예를 들어, 만약 프로세스가 대부분의 시간을 사용자가 터미널에서 무언가를 입력하기를 기다리는 경우 (또는 아이콘을 클릭하기를 기다리는 경우), 이 시간은 I/O 대기 시간에 해당합니다. 이런 경우 80% 이상의 I/O 대기 시간은 일반적입니다. 그리고 이 모델을 통해 CPU가 비어 있는 시간을 최소화하려면 메모리에 적어도 10개의 프로세스가 있어야 합니다. 이렇게 하면 CPU의 낭비를 10% 미만으로 유지할 수 있습니다.

Linux

Linux의 /proc 파일 시스템은 커널 데이터 구조에 대한 인터페이스를 제공하는 가상 파일 시스템입니다. 이 파일 시스템은 주로 다음 경로에 마운트됩니다.

/proc/ 디렉토리에는 시스템 하드웨어 및 실행 중인 프로세스에 대한 정보가 풍부하게 포함되어 있습니다. 또한 /proc/ 디렉토리 내의 일부 파일은 사용자와 애플리케이션이 커널에 구성 변경을 전달하기 위해 조작할 수 있습니다.

Linux에서 모든 프로세스는 /proc 내의 디렉토리를 통해 표현됩니다. 이 디렉토리는 프로세스의 주소 공간 등을 포함합니다.

프로세스 모니터링 도구로는 pstree, ps 및 top 등이 있습니다.

  • pstree: 프로세스 트리를 표시합니다. 예를 들어, pstree –p -T 명령을 사용하여 프로세스 트리를 표시할 수 있습니다.
  • ps: 현재 프로세스의 스냅샷을 보고합니다. ps aux와 같은 명령을 사용하여 현재 실행 중인 프로세스를 표시할 수 있습니다.
  • top: Linux 프로세스를 표시합니다. 단순히 top 명령을 실행하면 상위 프로세스가 표시됩니다.

man ps 명령을 사용하여 ps 명령의 상태 코드에 대한 자세한 정보를 얻을 수 있습니다. 이 코드는 다음과 같이 프로세스 상태를 나타냅니다:

  • D: 불가능한 슬립 (일반적으로 IO와 관련되며 종료할 수 없음)
  • I: 아이들 커널 스레드
  • R: 실행 중 또는 실행 가능 (실행 대기열에 있음)
  • S: 인터럽트 가능한 슬립 (이벤트 완료를 기다리며 종료할 수 있음)
  • T: 작업 제어 신호에 의해 일시 중지됨
  • X: 종료됨 (보통 나타나지 않아야 함)
  • Z: 데드 (종료되었지만 부모에 의해 수거되지 않음)
  • <: 높은 우선순위 (다른 사용자에게 불쾌함)
  • N: 낮은 우선순위 (다른 사용자에게 친화적임)
  • +: 포그라운드 프로세스 그룹에 속함

또한 다음과 같은 특별한 상태를 갖는 프로세스가 있을 수 있습니다:

  • Zombie process: 부모 프로세스는 자식 프로세스가 종료되길 기다리고 그런 다음 프로세스 테이블에서 자식 프로세스 항목을 정리합니다. 좀비 프로세스는 부모 프로세스가 자식 프로세스 종료를 기다리지 않을 때 쉽게 생성됩니다. 좀비 프로세스는 시스템 자원을 많이 소비하지 않지만 시스템의 작업 목록에서 계속 살아 있습니다.

  • Orphan process: 부모 프로세스가 종료되거나 종료되기 전에 자식이 종료되는 경우입니다. 이것은 부모 프로세스가 종료되었지만 자식 프로세스가 아직 실행 중인 경우를 의미합니다. 자식 프로세스는 자동으로 init 프로세스 (pid가 1인 모든 프로세스의 부모)에 의해 채택됩니다.

댓글 없음:

댓글 쓰기

관련 포스팅