프로세스(Process)
운영체제 이론에서 배우는 프로세스를 공부한 토대로 정리한 개념입니다.
목차
- 프로세스란?
- 프로세스 구성
- 프로세스 상태(Process state)
- 스레드(Thread)
- 프로세스 스케줄링(Process Scheduling)
- 문맥 교환(Context Switch)
- 프로세스 생성
프로세스란?
운영체제를 논의할 때 한 가지 주안점은 ‘CPU 활동들을 어떻게 부를것인가’ 입니다.
일괄처리 시스템은 잡(job)을 실행하는 반면 시분할시스템은 태스크(task)를 가지고 있습니다. 싱글태스킹, 멀티태스킹 지원 임베디드 등에서 운영체제는 ‘메모리 관리’ 같은 운영체제 내부 활동을 지원할 필요가 있는데 여러가지 면에서 이 활동들은 유사하므로 이들을 모두 ‘프로세스’라고 부릅니다.
더 단순하게 설명하자면, 프로세스는 실행중인 프로그램을 가리키는 말이며 실행중인 ‘상황’을 저장하고 관리하는 역할을 합니다. 프로세스는 실행될 때 가상 메모리 공간을 할당 받습니다. 프로세스는 실행되는 과정에서 많은 프로세스를 생성하는 것이 보통입니다. 부모-자식 프로세스 간에도 독립적인 가상 메모리 공간을 할당받습니다.
프로세스의 능동성
프로그램은 디스크에 저장된 파일과 같은 수동적인 존재인 반면,
프로세스는 다음 실행할 명령어를 지정하는 프로그램카운터(PC)같은 자원 집합을 가진 능동적인 존재 입니다.
프로세스 구성
프로세스의 주소공간
각 프로세스는 메모리 상에 가상주소 공간을 갖습니다. (이것을 쉽게 ‘메모리에는 각 프로세스가 존재한다’고 말합니다)
메모리상의 ‘프로세스의 주소공간’은 프로세스의 구조로 표현 할 수 있습니다.
프로세스 주소공간의 데이터는 아래에서 부터 쌓입니다. 코드/ 데이터(전역변수)/ 힙(동적할당)/ 스택(임시저장)
- 프로세스의 주소공간
- 스택(stack): 함수의 매개변수, 복귀주소, 로컬 변수와 같은 임시적인 자료를 가진다. 부족하면 할당받는다.
- 힙(heap): 프로세스 실행 중 동적으로 할당받는 메모리 이다.
- 데이터(data): 전역변수를 수록한다. ‘프로그램’이 종료될때 까지 유지해야 하는 데이터를 주로 저장하는 공간이다.
- 텍스트(code): 코드를 저장한다.
프로세스 제어블록
운영체제에서 각 프로세스는 프로세스 제어 블록(PCB)에 의해 표현됩니다.
프로세스 제어블록은 특정 프로세스와 연관된 정보를 저장합니다.
- 프로세스 상태: 새로운(new), 준비완료(ready), 실행(running), 대기(waiting), 또는 종료(terminated)
- 프로그램 카운터: 이 프로세스가 다음에 실행할 명령어의 주소를 저장한다.
- CPU 레지스터들: 누산기, 인덱스, 스택 등의 레지스터들과 상태코드 정보를 저장한다. (컴퓨터마다 수, 종류 다양)
- 이 상태정보는 프로세스가 계속 올바르게 실행되도록 하기 위해 인터럽트 발생 시 저장되어야 한다.
- CPU-스케줄링 정보: 프로세스 우선순위, 스케줄링에 대한 정보를 저장한다.
- 메모리 관리 정보: 기준(base)레지스터, 한계(limit)레지스터의 값을 포함한다. os 메모리 시스템에 따라 페이지 테이블, 세그먼트 테이블 같은 정보를 저장한다.
- 회계 정보: cpu 관련 정보
- 입출력 상태 정보: 이 프로세스에게 할당된 입출력 장치들과 열린파일 목록을 저장합니다.
프로세스 상태
위는 프로세스의 상태 변화를 그림으로 나타낸 프로세스 상태도 입니다.
프로세스는 실행되면서 상태가 변합니다. 프로세스의 상태를 결정하는 요인은 그 프로세스의 현재 활동입니다.
프로세스는 다음 상태 중 하나를 갖습니다.
- 새로운(new): 새로운 프로세스가 생성중이다.
- 실행(running): 명령어들이 실행되고 있다.
- 대기(waiting): 프로세스가 어떤 사건(i/o완료 혹은 signal 수신))이 일어나길 기다리고 있다.
- 준비완료(ready): 프로세스가 처리기(processor)에 할당되기를 기다리고 있다.
- 종료(terminated): 프로세스의 실행이 종료되었다.
이 상태들의 이름은 운영체제에 따라 달라지나 이들이 나타내는 상태들은 모든 시스템에서 찾아 볼 수 있습니다.
어느 한 순간에 한 처리기에서 오직 하나의 프로세스만 실행됨을 인식하는 것은 중요합니다.
스레드
스레드는 프로세스 내에서 실행되는 흐름의 단위입니다.
지금까지 설명한 프로세스의 모델은 단일 스레드를 실행하는 프로그램임을 암시했습니다. 유저는 동일 프로세스 내에서 문자를 입력하며 철자 검사기를 수행할 수 없습니다. 그러나 현대 대부분 운영체제는 프로세스의 개념을 확장하여 하나의 프로세스가 다수의 스레드를 가질 수 있도록 허용합니다. 즉 멀티스레드(multi-thread)라고 합니다. 이러한 특성은 다중 처리기 시스템에서 장점이 빛을 발합니다. 스레드를 병렬로 실행할 수 있게 되는데 스레드를 지원하는 시스템에서는 PCB에 각 스레드의 정보를 저장할 수 있도록 확장됩니다.
프로세스 스케줄링
다중프로세스(multi-process)의 목적은 cpu 사용을 최대화 하기위해 항상 어떤 프로세스든 실행되도록 하는 데 있습니다. 시분할의 목적은 각 프로그램이 실행되는 동안 사용자와 상호작용을 하기위해 프로세스들 사이에서 cpu를 빈번하게 교체하는 것입니다. 이 목적을 위해 프로세스 스케줄러가 cpu에서 실행가능한 프로세스들 중 하나의 프로세스를 선택합니다. 단일처리기 시스템에서는 단 하나의 프로세스만 실행중에 있을 수 있습니다. 만약 프로세스가 여러개 있다면 cpu가 자유로워져 다시 스케줄 될 때 까지 기다려야 합니다.
스케줄링 큐
프로세스가 시스템에 들어오면 잡큐에 놓여집니다. 잡큐는 시스템 내의 모든 프로세스로 구성됩니다. 메인 메모리에 존재하며 ready상태의 프로세스들은 ready 큐 라 불리는 리스트 상에 유지됩니다. 이 큐는 일반적으로 연결리스트로 자료를 저장합니다. ready 큐의 헤더는 리스트의 첫번째와 마지막 pcb를 가리키는 포인터를 저장합니다.
문맥 교환
문맥교환은 인터럽트가 끝나고 하던 프로세스 작업을 복구하는 데 중요 역할을 합니다. 인터럽트는 운영체제가 CPU를 현재 작업에서 빼앗아 커널 루틴을 실행할 수 있게 합니다. 인터럽트가 발생하면 시스템은 인터럽트 처리가 끝난 후 문맥을 복구할 수 있도록 현재 실행 중인 프로세스의 현재 문맥을 저장해야 합니다. 이는 결국 프로세스를 중단했다가 재개하는 작업입니다. 문맥(CPU레지스터값,p상태)은 프로세스의 PCB에 표현됩니다.
- 일반적으로 커널모드이든 유저모드이든 CPU 상태를 저장하는 작업을 수행한다.
- 나중에 연산을 재개하기 위해 상태 복구 작업을 수행한다.
- 이 일련의 과정을 문맥교환(Context Switch) 이라 한다.
프로세스 생성
대부분 시스템 내 프로세스들은 병행 실행될 수 있으며 반드시 동적 생성되고, 제거 되어야 한다.
그러므로 os는 프로세스 생성 및 종료를 위한 기법을 제공해야 한다.
프로세스는 실행하는 동안 여러개의 새 프로세스를 생성할 수 있습니다. 생성하는 프로세스는 부모 프로세스, 새로운 프로세스는 자식 프로세스 라고 부릅니다. 이 새로운 프로세스는 자식 프로세스를 생성하는데 이 결과 프로세스 트리 를 형성합니다. linux나 windows같은 현대 운영체제는 프로세스를 구분하기 위해 식별자(pid)를 사용하며 각 프로세스는 고유한 pid 값을 갖습니다. pid는 정수값을 갖는데 pid가 1인 프로세스는 언제나 ‘init 프로세스’로서 역할을 합니다. init 프로세스는 모든 프로세스의 루트 부모 역할을 수행합니다. 시스템이 부팅되면 init 프로세스는 다양한 유저 프로세스를 생성합니다.
이해에 도움이 되는 참조
- 운영체제 9th edition