이번에는 프로세스의 관리에 대해서 알아보도록 하겠습니다.
우선 프로세스에 대해서 알아보도록 하겠습니다.
프로세스란?
프로세스의 정의는 다음과 같습니다.
- 수행 중인 프로그램: 프로세스는 메모리에 적재되어 실행되고 있는 프로그램입니다.
- 컴퓨터 상에서 수행 중인 프로그램의 인스턴스: 프로세스는 프로그램의 실행 인스턴스로, 동일한 프로그램이 여러 번 실행될 경우 각각의 실행 인스턴스가 독립적인 프로세스가 됩니다.
- 처리기에 할당되어 수행될 수 있는 개체: 프로세스는 CPU에서 실행될 수 있는 단위이며, 운영 체제는 프로세스에게 CPU 시간을 할당하여 실행합니다.
- 단일 순차 수행 스레드, 현재 상태, 연계된 자원 등에 의해 특징지어지는 활동 단위: 프로세스는 하나의 실행 흐름(스레드)을 가지며, 현재 상태(실행 중, 대기 중 등)와 연결된 자원(메모리, 파일 등)에 따라 특징지어집니다.
프로세스는 운영체제가 CPU에서 수행 중인 다양한 프로그램을 감시하고 제어하는 체계적인 역할을 하고 있습니다.
다중 프로그래밍 운영체제에서 발생하는 에러 원인 4가지와 그에 맞게 프로세스가 하는 일에 대해 설명하겠습니다.
- 부적절한 동기화 (Improper Synchronization):
- 프로세스 간의 동기화를 적절하게 구현하여 공유 자원에 대한 접근을 제어합니다. 예를 들어, 세마포어, 뮤텍스(mutex) 등을 사용하여 한 프로세스가 자원을 사용하는 동안 다른 프로세스가 접근하지 못하도록 합니다.
- 상호배제 실패 (Failed Mutual Exclusion):
- 자원에 대한 상호배제를 보장하기 위해 동기화 메커니즘을 사용하여 여러 프로세스가 동시에 동일한 자원에 접근하지 못하도록 합니다. 이로 인해 데이터의 일관성을 유지할 수 있습니다.
- 비결정적인 프로그램 연산 (Nondeterminate Program Operation):
- 비결정적인 실행 결과를 방지하기 위해 원자적(atomic) 연산을 사용하거나, 동기화된 접근을 통해 데이터를 보호합니다. 이를 통해 프로세스 간의 경합 조건(race condition)을 방지할 수 있습니다.
- 교착 상태 발생 (Deadlocks):
- 교착 상태를 예방하기 위한 알고리즘을 사용하거나, 교착 상태가 발생했을 때 이를 감지하고 회복하는 메커니즘을 도입하여 문제를 해결합니다. 예를 들어, 자원 요청 순서를 정하거나, 프로세스의 자원 사용을 관리하여 교착 상태의 발생을 최소화합니다.
프로세스와 프로그램의 차이
위 그림을 보면 하드 디스크에 저장된 프로그램과 메모리에 할당된 프로세스들을 확인해볼 수 있습니다.
뭔가 둘이 밀접하게 관련되어 보이지만, 서로 다른 개념이라는 것을 알 수 있습니다. 이 둘의 차이점을 서술하도록 하겠습니다.
- 정의:
- 프로그램 (Program): 특정 작업을 수행하기 위한 명령어들의 집합입니다. 프로그램은 디스크와 같은 저장 매체에 저장되어 있으며, 실행되기 전에는 메모리에 적재되지 않습니다.
- 프로세스 (Process): 실행 중인 프로그램의 인스턴스입니다. 메모리에 적재되어 CPU에서 실행되고 있는 상태로, 특정 시점에서의 실행 흐름을 가지고 있습니다.
- 상태:
- 프로그램: 정적이며, 실행되지 않은 상태입니다. 코드, 데이터, 리소스 정보 등을 포함하지만 실행 상태는 포함하지 않습니다.
- 프로세스: 동적이며, 현재 실행 중인 상태를 가지고 있습니다. 실행 중인 프로세스는 프로그램 카운터, 스택, 힙, 현재 상태 등과 같은 정보가 포함됩니다.
- 자원 할당:
- 프로그램: 메모리나 CPU와 같은 자원을 사용하지 않으며, 실행되기 전에는 자원을 요구하지 않습니다.
- 프로세스: CPU, 메모리, 파일 등 다양한 시스템 자원을 요청하고 사용합니다.
- 다중성:
- 프로그램: 동일한 프로그램이 여러 번 실행될 수 있지만, 각 실행은 별개의 프로세스를 생성합니다.
- 프로세스: 같은 프로그램의 여러 인스턴스가 동시에 실행될 수 있으며, 각 프로세스는 독립적으로 실행됩니다.
요약하자면, 프로그램은 실행하기 위한 코드의 집합이고, 프로세스는 그 프로그램이 실제로 실행되고 있는 상태를 의미합니다.
프로세스와 프로그램의 차이의 그림을 보면 똑같은 프로그램 notepad가 3개가 열려 있지만 독립적으로 사용되고 있다는 사실을 알 수 있습니다. 이처럼 하나의 프로그램을 여러 개로 나눠서 띄우면 이를 인스턴스라고 부릅니다.
인스턴스의 특징은 다음과 같습니다.
- 독립적인 실행: 각 인스턴스는 독립적으로 실행되며, 자체적인 메모리 공간, 자원, 상태를 가집니다.
- 상태 유지: 각 인스턴스는 자신만의 열려 있는 파일, 사용자 입력, 변수 값 등을 유지합니다. 예를 들어, 하나의 Notepad 인스턴스에서 작성한 내용이 다른 인스턴스에는 영향을 미치지 않습니다.
- 다양한 설정: 각 인스턴스는 사용자가 원하는 대로 설정할 수 있으며, 다른 인스턴스와는 별도로 동작합니다. 예를 들어, 한 인스턴스에서 파일을 열거나 저장해도 다른 인스턴스의 상태와는 관계가 없습니다.
그리고 윈도우 운영체제의 기본 프로그램 중 메모장이 인스턴스 간에 상호 통신을 할 때는 Windows 커널을 이용하여 통신하게 됩니다. Windows 커널은 다양한 프로세스 간 통신(IPC, Inter-Process Communication)을 지원하는 여러 메커니즘을 제공하게 됩니다.
프로세스 5가지 구성요소
- 사용자 코드 (User Code): 실행될 프로그램의 명령어 코드가 저장되는 공간입니다.
- 사용자 데이터 (User Data): 프로그램에서 사용되는 전역 변수와 같은 데이터가 저장되는 공간입니다.
- 사용자 스택 (User Stack): 함수 호출, 지역 변수, 매개변수 등을 저장하는 공간으로, 함수 호출 시마다 쌓이고 반환 시 제거됩니다.
- 힙 (Heap): 동적으로 할당된 메모리 공간으로, 프로그램 실행 중에 필요에 따라 크기를 조정할 수 있는 영역입니다.
- 프로세스 제어 블록 (PCB): 프로세스에 대한 정보를 관리하는 데이터 구조로, 프로세스 식별자, 상태, 프로그램 카운터, 메모리 관리 정보 등을 포함합니다.
다음 사진은 프로세스 주소 공간(Linux 32비트 주소공간 예)입니다
위 부분은 프로세스의 메모리 적재 예시 입니다. 예시를 이용하여 메모리 구조에서 각 영역의 특성에 대해 설명하도록 하겠습니다.
- 코드 영역 (Code Segment):
- 코드 영역은 프로그램의 실행 코드가 저장되는 부분입니다. 이 영역은 프로그램 실행 중에 변하지 않아야 하며, 일반적으로 읽기 전용으로 설정됩니다. 코드가 실행되면서 변경되지 않기 때문에 안전성을 보장합니다.
- 데이터 영역 (Data Segment):
- 데이터 영역은 전역 변수 및 정적 변수가 저장되는 부분입니다. 이 영역은 프로그램 실행 중에 변할 수 있으며, 초기화된 데이터와 초기화되지 않은 데이터(BSS)로 나뉩니다. 데이터 영역은 프로그램의 실행 중에 값을 수정할 수 있습니다.
- 힙 영역 (Heap Segment):
- 힙 영역은 동적으로 할당되는 메모리 공간입니다. 프로그램 실행 중에 필요에 따라 메모리를 할당하고 해제할 수 있으며, 이 영역도 값이 변할 수 있습니다. 메모리 할당과 해제는 프로그래머의 관리 하에 이루어집니다.
- 스택 영역 (Stack Segment):
- 스택 영역은 함수 호출 시 생성되는 지역 변수와 매개변수를 저장하는 공간입니다. 함수 호출과 반환에 따라 스택의 내용이 변화하므로, 이 영역 또한 변할 수 있습니다.
따라서 코드 영역을 제외한 데이터 영역, 힙 영역, 스택 영역은 모두 프로그램 실행 중에 동적으로 변할 수 있는 영역입니다. 코드 영역은 실행되는 동안 수정되지 않아야 하므로, 안정성과 보안성을 위해 중요한 역할을 합니다.
그리고 프로세스 메모리 적재에서 스택 영역과 힙 영역이 부딪칠 수 있게 되어있습니다. 만약 스택 영역과 힙 영역이 서로 부딪히게 되면 스택 오버플로우가 발생할 수 있습니다. 이를 조금 더 자세히 설명하자면
- 스택 영역 (Stack Area):
- 스택은 함수 호출 시 생성되는 지역 변수, 매개변수, 반환 주소 등을 저장하는 메모리 영역입니다. LIFO(Last In, First Out) 방식으로 작동하며, 스택의 크기는 일반적으로 한정되어 있습니다. 함수 호출이 깊어지면 스택 메모리가 소모되어, 결국 스택 오버플로우가 발생할 수 있습니다.
- 힙 영역 (Heap Area):
- 힙은 동적으로 할당되는 메모리 영역으로, 프로그램 실행 중에 필요에 따라 크기를 조정할 수 있습니다. 메모리의 임의 위치에 할당되기 때문에, 스택과 힙은 서로 다른 방식으로 관리됩니다.
- 스택 오버플로우 (Stack Overflow):
- 스택 오버플로우는 스택 영역이 할당된 메모리 공간을 초과하여 더 많은 데이터를 저장하려고 할 때 발생합니다. 이 경우, 스택이 힙 영역과 충돌하게 되고, 이로 인해 프로그램이 비정상적으로 종료되거나 예기치 않은 동작을 일으킬 수 있습니다.
따라서 스택과 힙의 메모리 영역이 서로 부딪히는 상황은 스택 오버플로우를 초래할 수 있으며, 이는 프로그래머가 관리해야 할 중요한 메모리 관리 문제 중 하나입니다.
프로세스 수행 제어
운영체제의 핵심 업무 중 하나는 프로세스 수행 제어입니다. 이는 여러 프로세스가 효율적으로 실행될 수 있도록 관리하고 조정하는 기능을 포함합니다.
1. 프로세스의 수행 패턴 결정 - 스케줄링
스케줄링은 여러 프로세스가 CPU와 같은 시스템 자원을 어떻게 사용할지를 결정하는 과정을 의미합니다. 운영체제는 여러 프로세스 간의 공정성과 효율성을 고려하여 스케줄링 알고리즘을 사용합니다. 주요 스케줄링 방법은 다음과 같습니다:
- 선점형 스케줄링 (Preemptive Scheduling):
- CPU를 할당받은 프로세스가 자원을 사용하던 중에도 우선순위가 높은 다른 프로세스가 CPU를 차지할 수 있도록 하는 방식입니다. 이 방식은 반응성이 중요한 시스템에서 유용합니다.
- 비선점형 스케줄링 (Non-Preemptive Scheduling):
- 현재 CPU를 사용 중인 프로세스가 자원을 반환할 때까지 기다려야 하는 방식입니다. 이러한 방식은 간단하지만, 우선순위가 낮은 프로세스가 오랫동안 CPU를 사용하게 될 수 있습니다.
- 스케줄링 알고리즘:
- FCFS (First-Come, First-Served): 요청된 순서대로 프로세스를 실행합니다.
- SJF (Shortest Job First): 가장 짧은 실행 시간을 가진 프로세스를 먼저 실행합니다.
- RR (Round Robin): 각 프로세스에 일정한 시간 간격으로 CPU를 할당합니다.
- Priority Scheduling: 프로세스에 우선순위를 매기고 높은 우선순위를 가진 프로세스를 먼저 실행합니다.
스케줄링은 시스템의 응답 시간, 처리량, CPU 활용도 및 공정성을 개선하는 데 중요한 역할을 합니다.
2. 프로세스에 자원 할당
운영체제는 프로세스에게 필요한 자원을 할당하는 기능을 담당합니다. 자원에는 CPU 시간, 메모리, I/O 장치, 파일 시스템 등이 포함됩니다. 자원 할당의 주요 작업은 다음과 같습니다:
- 메모리 할당:
- 프로세스가 실행되기 위해 필요한 메모리 공간을 할당합니다. 운영체제는 가상 메모리 기술을 사용하여 프로세스가 필요한 만큼의 메모리를 할당하고, 메모리 보호를 통해 각 프로세스가 다른 프로세스의 메모리에 접근하지 못하도록 합니다.
- CPU 시간 할당:
- 프로세스에게 CPU를 할당하여 실행할 수 있도록 합니다. 스케줄링 알고리즘을 통해 각 프로세스에 공정하게 CPU 시간을 분배합니다.
- I/O 자원 관리:
- 프로세스가 입출력 장치에 접근할 때 필요한 자원을 관리합니다. I/O 요청을 처리하고, 다른 프로세스가 동시에 I/O 작업을 수행할 수 있도록 합니다.
- 파일 시스템 접근:
- 프로세스가 파일에 접근할 수 있도록 파일 핸들을 제공하고, 파일에 대한 읽기 및 쓰기 권한을 관리합니다.
운영체제는 자원의 효율적인 사용을 보장하기 위해 자원을 할당하고 관리합니다. 이 과정에서 자원의 고갈, 교착 상태 및 비효율적인 자원 사용을 방지하기 위한 알고리즘과 전략을 사용합니다.
프로세스 상태 모델
프로세스 상태 모델에 대해서 설명하도록 하겠습니다. 5-상태 모델과 5-상태 모델에서 보류 상태를 가진 모델에 대해서 설명하도록 하겠습니다.
5-상태 모델
프로세스 상태 모델에서 5-상태 모델(생성, 준비, 수행, 블록, 종료)은 프로세스가 시스템에서 이동할 수 있는 상태를 설명합니다. 모든 프로세스가 블록 상태에 있게 되면 CPU가 유휴 상태가 되어 처리기 이용률이 떨어지고 시스템 성능이 저하됩니다.
해결방안: 스와핑(swapping) 통한 문제 해결
스왑 아웃 (Swap-Out):
- 모든 프로세스가 블록 상태에 있을 때, 운영체제는 메모리에 적재된 프로세스의 일부 또는 전체를 보조기억장치(예: 하드 드라이브)에 있는 스왑 영역으로 이동시킬 수 있습니다. 이 과정을 스왑 아웃이라고 합니다.
- 스왑 아웃된 프로세스는 보류(suspended) 상태에 있게 되며, 이로 인해 메모리의 자원이 해제됩니다.
스왑 인 (Swap-In):
- 보조기억장치에 있는 프로세스 중 준비된 프로세스가 있을 경우, 운영체제는 이 프로세스를 메모리에 다시 적재할 수 있습니다. 이 과정을 스왑 인이라고 합니다.
- 스왑 인된 프로세스는 준비 상태로 전환되고, CPU가 해당 프로세스를 실행할 수 있도록 준비가 됩니다.
장점
- CPU 활용도 증가: 스와핑을 통해 메모리에 공간을 확보하고, 필요한 프로세스를 실행함으로써 CPU의 유휴 상태를 최소화할 수 있습니다.
- 시스템 성능 개선: 스와핑을 통해 블록 상태에 있는 프로세스를 효율적으로 관리함으로써 시스템 전반의 성능을 향상시킬 수 있습니다.
5-상태 모델-보류 상태를 가진 모델
5-상태 모델에서 보류 상태(Suspended State)는 프로세스 상태 모델에 추가된 상태로, 프로세스가 메모리에서 제거되고 보조기억장치(예: 하드 드라이브)에 저장된 상태를 의미합니다. 이 모델은 전통적인 4-상태 모델(생성, 준비, 수행, 블록)에 비해 더 세분화된 상태 관리 방식을 제공합니다.
1. 보류 상태의 정의
- 보류 상태 (Suspended State): 프로세스가 현재 실행되거나 준비되지 않은 상태로, 보조기억장치에 저장되어 있는 상태입니다. 이 상태의 프로세스는 메모리에 적재되지 않으므로, CPU와 직접적으로 상호작용하지 않습니다.
2. 보류 상태의 필요성
- 메모리 자원 관리: 시스템 메모리가 부족하거나 모든 프로세스가 블록 상태에 있는 경우, 보류 상태를 활용하여 메모리 공간을 확보할 수 있습니다. 프로세스를 보조기억장치로 이동시키면 메모리에 새로운 프로세스를 로드할 수 있는 공간이 생깁니다.
- 다중 작업 환경: 여러 개의 프로세스가 동시에 실행되는 다중 작업 환경에서 메모리를 효율적으로 관리하기 위해 프로세스를 보류 상태로 두는 것이 필요합니다. 이를 통해 시스템이 부하를 관리하고, 필요할 때 적절한 프로세스를 메모리에 적재할 수 있습니다.
3. 보류 상태로의 전환
- 스왑 아웃: 프로세스가 블록 상태에 있거나 필요하지 않을 때, 운영체제는 해당 프로세스를 보조기억장치로 이동시키고 보류 상태로 전환합니다. 이 과정을 스왑 아웃이라고 합니다.
4. 보류 상태에서의 전환
- 스왑 인: 보조기억장치에 저장된 프로세스가 준비 상태가 되었을 때, 해당 프로세스는 메모리로 다시 로드됩니다. 이 과정을 스왑 인이라고 하며, 프로세스는 다시 실행 가능한 상태로 돌아옵니다.
5. 보류 상태의 장점
- 유연한 메모리 관리: 보류 상태를 통해 운영체제는 메모리 자원을 유연하게 관리할 수 있으며, 프로세스 간의 자원 경쟁을 줄일 수 있습니다.
- 시스템 성능 개선: 필요 없는 프로세스를 보조기억장치로 이동시켜 메모리에서 실행할 수 있는 프로세스의 수를 늘리고, 시스템의 전체적인 응답성을 개선할 수 있습니다.
결론
5-상태 모델에서 보류 상태는 프로세스 관리의 효율성을 높이는 중요한 요소입니다. 이를 통해 운영체제는 메모리 자원을 보다 효과적으로 활용하고, 다중 작업 환경에서 성능을 극대화할 수 있습니다. 보류 상태를 포함한 5-상태 모델은 프로세스의 생애 주기를 보다 세밀하게 관리할 수 있는 기반을 제공합니다.
프로세스 생성과 종료
프로세스 생성 이유
- 새로운 응용 프로그램 수행:
- 사용자가 새로운 프로그램을 실행할 때마다, 운영체제는 해당 프로그램을 수행하기 위해 새로운 프로세스를 생성합니다. 예를 들어, 사용자가 웹 브라우저를 실행하면 새로운 브라우저 프로세스가 생성됩니다.
- 대화형 로그온 (Interactive Logon):
- 사용자가 시스템에 로그인할 때 운영체제는 사용자 세션을 관리하기 위해 새로운 프로세스를 생성합니다. 이 프로세스는 사용자가 시스템과 상호작용할 수 있는 환경을 제공합니다.
- 서비스를 제공하기 위해 OS가 생성:
- 운영체제는 다양한 시스템 서비스(예: 프린터 서비스, 네트워크 서비스 등)를 제공하기 위해 백그라운드에서 프로세스를 생성합니다. 이러한 서비스는 시스템의 기능성을 유지하는 데 필요합니다.
- 기존 프로세스에 의한 생성:
- 기존의 프로세스가 자신을 복제하여 새로운 프로세스를 생성하는 경우입니다. 이를 통해 프로세스는 작업을 분담하거나 여러 작업을 동시에 수행할 수 있습니다. 일반적으로 **포크(fork)**라는 메커니즘을 사용하여 자식 프로세스를 생성합니다.
프로세스 종료 이유
- 정상 완료, 시간 한도 초과:
- 프로세스가 자신의 작업을 정상적으로 완료하고 종료할 때 발생합니다. 또는, 프로세스가 할당된 시간 내에 작업을 완료하지 못할 경우에도 종료될 수 있습니다.
- 메모리 부족 / 메모리 경계 범위 위반:
- 프로세스가 필요한 메모리를 할당받지 못하거나, 메모리 경계 범위를 벗어나게 되면 운영체제는 해당 프로세스를 종료하여 시스템의 안정성을 유지합니다.
- 보호 오류 / 산술 오류:
- 프로세스가 허용되지 않은 메모리에 접근하거나, 산술 연산 중에 오류가 발생하는 경우(예: 0으로 나누기) 프로세스는 종료됩니다.
- 입출력 실패 / 특권 명령어 수행:
- 프로세스가 입출력 장치와의 통신 중 실패하거나, 특정 권한이 필요한 명령어를 잘못 수행할 경우에도 종료됩니다.
- 오퍼레이터나 OS 간섭:
- 사용자가 수동으로 프로세스를 종료하거나, 운영체제가 시스템 상태를 유지하기 위해 프로세스를 강제로 종료하는 경우입니다.
- 부모 종료 / 부모 요구:
- 자식 프로세스는 부모 프로세스가 종료될 때 함께 종료되거나, 부모 프로세스가 자식 프로세스를 종료하도록 요청할 수 있습니다.
'컴퓨터 과학 > 운영체제' 카테고리의 다른 글
[운영체제] 스레드 동기화, 상호배체, 임계구역 (0) | 2024.12.15 |
---|---|
[운영체제] 컴퓨터 하드웨어 (2) | 2024.09.26 |
[운영체제] CPU(중앙처리장치)의 여러 구성 요소 (1) | 2024.09.11 |
[운영체제] 운영체제(Operating System)란? (2) | 2024.09.11 |