: 프로세스란 실행 중인 프로그램을 뜻으로 디스크에 실행 파일 형태로 존재하던 프로그램이 메모리에 올라가서 실행되기 시작하면 비로소 생명령을 갖는 프로세스가 된다.
하드웨어 문맥
: CPU의 수행 상태를 나타내는 것 (프로그램 카운터 값, 각종 레지스터에 저장하고 있는 값)
프로세스의 주소 공간
: 코드, 데이터, 스택으로 구성되는 독자적인 공간
커널 상의 문맥
: 운영체제가 프로세스를 관리하기 위한 자료구조를 유지하는 것 (PCB, 커널스택)
실행
: 프로세스가 CPU 를 보유하고, 기계어 명령을 실행하고 있는 상태
준비
: 프로세스가 CPU만 보유하면 당장 명령을 실행할 수 있지만 CPU 를 할당받지 못한 상태를 가리킨다.
봉쇄
: CPU 를 할당 받더라도 당장 명령을 실행할 수 없는 프로세스 상태, 이는 자원을 효율적으로 관리하기 위해 나눈다.
( ex - 프로세스가 요청한 입출력 작업이 진행 중인 경우)
❗ 디스크에서 파일의 내용을 읽어와야 하는 명령 등 작업이 완료되어야 후속 처리가 가능한 경우 해당 작업이 완료 될때 까지 봉쇄 상태로 만들고 적절한 프로세스를 선정해 CPU를 할당한다.
: 운영체제가 시스템 내의 프로세스 들을 관리하기 위해 프로세스마다 유지하는 정보들을 담는 커널 내의 자료구조를 뜻한다.
프로세스 상태 : CPU 를 할당해도 되는지 여부를 결정하기 위해 필요.
프로그램 카운터 값 : 다음에 수행할 명령의 위치를 가리킨다.
CPU 레지스터 값 : CPU 연산을 위해 현 시점에 레지스터에 어떤 값을 저장하는지 나타낸다.
CPU 스케줄링 정보, 메모리 관리 정보 : 각각 그 프로세스의 CPU 스케줄링과 메모리 할당을 위해 필요한 정보
자원 사용 정보 : 사용자에게 자원 사용 요금을 계산해 청구하는 용도로 사용한다.
입출력 상태 정보 : 프로세스가 오픈하는 파일 정보 등 프로세스의 입출력 관련 상태 정보를 나다낸다.
준비 큐
: 운영체제는 준비 상태에 있는 프로세스들을 줄 세우기 위해 준비 큐를 두고 준비 큐의 제일 앞에 줄 서 있는 프로세스에 제일 먼저 CPU를 할당한다. 준비 큐에 프로세스를 줄 세우는 방법은 CPU 스케줄링 방법에 따라 달라진다 (6장)
장치 큐
: CPU 를 기다리는 프로세스를 줄 세우는 준비 큐 외에도 운영체제는 특정 자원을 기다리는 프로세스 들을 줄 세우기 위해 자원 별로 장치 큐를 둔다.
작업 큐
: 시스템 내의 모든 프로세스를 관리하기 위한 큐로, 프로세스의 상태와 무관하게 현재 시스템내에 있는 모든 프로세스가 작업 큐에 속한다. (준비, 장치 큐 포함.)
: 어떤 프로세스 에게 자원을 할당 할지를 결정하는 운영체제 커널의 코드이다
장기 스케줄러 (작업 스케줄러)
: 어떤 프로세스를 준비 큐에 진입시킬지 결정하는 역할을 한다.
단기 스케줄러 (CPU 스케줄러)
: 준비 상태의 프로세스 중에서 어떤 프로세스를 다음번에 실행 상태로 만들 것인지 결정한다.
❗ 과거에는 장기 스케줄러가 빈번히 호출되어 시스템 호츌이 매우 떨어져 프로세스의 수를 조절하는 역할도 했는데 현대는 시분할 시스템용 운영체제에서는 프로세스가 시작 상태가 되면 장기 스케줄러 없이 곧바로 프로세스에 메모리를 할당해 준비큐에 넣어줘서 장기 스케줄러 대신 중기 스케줄러를 두는 경우가 많다.
중기 스케줄러
: 너무 많은 프로세스에게 메모리를 할당해 시스템 성능이 저하되는 경우 이를 해결하기 위해 메모리에 적재된 프로세스의 수를 동적으로 조절하기 위해 추가된 스케줄러이다. 메모리에 올라와 있는 프로세스 중 일부를 선정해 이들로부터 메모리를 통째로 빼앗아 그 내용을 디스크의 스왑 영역에 저장한다. (스왑 아웃)
중지 상태
: 중기 스케줄러의 등장으로 프로세스 상태에 추가된 상태, 디스크로 스왑 아웃된 프로세스의 상태
중지준비 상태
: 준비 상태에 있던 프로세스가 중기 스케줄러에 의해 스왑 아웃된 상태
중지봉쇄 상태
: 봉쇄 상태에 있던 프로세스가 중기 스케줄러에 의해 스왑 아웃된 상태
: 운영체제가 프로세스를 전부 생성하는 것은 아니다. 이미 존재하는 프로세스가 다른 프로세스를 복제 생성하게 된다. 이때 생성한 프로세스를 부모 프로세스, 생성된 프로세스를 자식 프로세스라고 부른다. 부모 프로세스를 종료하기 위해선 후손 프로세스를 모두 종료해야 종료할 수 있다.
자식 프로세스의 생성 방법은 fork() 시스템 콜을 해야한다.
프로세스 종료
자발적 종료
: 프로세스는 시스템 콜을 통해 운영체제에게 자신이 종료됨을 알릴 수 있는 것. 이때 종료를 통보 받은 운영체제는 이 프로세스로부터 자원을 회수하고 시스템 내에서 이 프로세스를 정리하게 된다. exit() 함수는 프로그램 개발자가 명시적으로 호출하지 않아도 프로그램 종료되는 지점에 컴파일러가 자동으로 삽입해 프로세스의 종료 직전에 항상 호출한다. 때문에 프로세스 간의 동기화가 가능해진다.
비자발적 종료
: 부모 프로세스가 자식 프로세스의 수행을 강제 종료시키는 것이다. 이는 abort() 라는 함수를 통해 이우어지게 된다.
❗ 강제 종료되는 상황
- 자식 프로세스가 할당 자원의 한계치를 넘어서 많은 양의 자원을 요구할 때
- 자식 프로세스에게 할당된 작업이 더 이상 필요하지 않을 때
- 부모 프로세스가 종료(exit) 되는 경우 등
: 프로세스는 각자의 독립적인 주소 공간을 가지고 있어, 다른 프로세스의 주소 공간을 참조하는 것을 허용하지 않는다. 이는 부모 프로세스, 자식 프로세스에도 동일하게 적용된다. 하지만 프로세스 간의 협력통해 효율성을 높일수 있다.
협력 매커니즘
: 대표적으로 IPC(Inter-Process Communication) 이 있다.
IPC 란 하나의 컴퓨터 안에서 실행 중인 서로 다른 프로세스 간에 발생하는 통신을 말하고 동기화 보장 공유 데이터를 두 프로세스가 사용할 수 있다고 하면 데이터의 불일치 문제가 발생할 수 있기 때문에 프로세스 간의 통신과 동기화를 이루기 위한 메커니즘 필료.
메세지 전달 방식
: 프로세스 간에 공유 데이터를 일체 사용하지 않고 메시지를 주고받으면서 통신하는 방식
직접 통신
: 통신 하려는 프로세스의 이름을 명시적으로 표시한다
간접 통신
: 메시지를 메일 박스 또는 포트로 부터 전달 받는다
공유메모리 방식
: 본래 프로세스는 독립적인 주소 공간을 가져 그 주소 공간은 자신만 볼수 있다. 그렇지만 공유 메모리 영역은 각자의 주소 공간에 공통적으로 포함되는 영역이므로 여러 프로세스가 읽고 쓰는게 가능하다.