프로세스 .. 개념 하나 설명하려면 조금 한바가지임 .. 그래서 조금씩 나눠서 해보겠음 ~ ..
프로세스란?
실행 중인 프로그램을 의미
(= Program In Execution)
중요한 포인트는 실행 중이다. 라는 것
저장 장치에 들어 있는 구글은 그냥 프로그램, 이를 두번 클릭해서 실행이 되면(= 인스턴스화) 프로세스가 된다. 이 프로세스에게 CPU가 넘어가고 .. 하는 것
프로세스의 메모리 구조
스택 / 힙 / 데이터 / 코드 구조로 메모리가 나뉘어진다.
스택은 위 주소부터 할당이 되고, 힙은 아래 주소부터 할당이 된다.
스택
- 지역변수 / 매개변수 / 함수가 저장
- 컴파일 시 크기가 결정
- 동적
함수가 함수를 재귀적으로 호출하면서 동적으로 크기가 늘어날 수 있음, 이 때 다른 메모리 영역인 힙과 영역이 겹치면 안되기 때문에 힙과 스택 사이의 공간이 존재하는 것
힙
- 동적 할당
- 동적
데이터 영역
- 전역변수 / 정적변수 (static ..) 저장
- 정적
- 프로그램이 종료가 되면 사라지는 변수들이 저장
- BSS / Data 영역으로 구분
그냥 한 공간에 들어가면 안돼? ㅈㅅ.
예를 들어서 var a: Int? 라고 한다면 이건 아직 초기화가 되지 않은 변수이므로 0으로 초기화 되어서 BSS 영역으로 들어가고 만약 let b = 7이라고 초기화를 했다면 Data 영역으로 저장
코드 영역
- 프로그램에 내장되어 있는 소스코드가 들어가는 영역
- 수정 불가능한 기계어로 저장
- 정적
프로세스 제어블록 (PCB)
하나의 프로세스가 만들어져서 없어질 때까지 시스템에서는 PCB의 형태로 존재한다. 이는 테이블 모양의 자료구조를 갖고 있다.
즉, 프로세스 하나가 만들어진다는 것은 곧 그 프로세스에 대한 모든 것을 표현하는 PCB 하나가 만들어진다는 말과 같다.
PCB는 기본적으로 메모리에 저장시킨다.
(운영체제마다 차이는 있지만 기본적으로 아래와 같은 정보를 저장한다.)
- 프로세스 번호 (PID)
프로세스의 고유한 정수 번호이며 다른 프로세스와의 구별을 위해서 사용된다. - 프로세스 상태
준비, 실행, 대기, 보류 등의 상태를 나타낸다. - 우선순위
스케줄링 할 때 사용되는 우선순위이다. - 프로그램 카운터 값
다음에 실행될 명령어의 주소 값을 갖고 있다. - 메모리 포인터
프로그램과 데이터가 저장되어 있는 메모리 블록 위치와 공유되는 메모리 블록들에 대한 포인터를 포함하고 있다. - 문맥 데이터
문맥 교환 시에 CPU 레지스터 값들을 저장하는 영역이다. - 할당 받은 자원들에 대한 목록
개방한 파일 등 할당 받은 자원들의 정보이다. - 계정 정보
CPU를 사용한 시간 등의 정보이다. - 입출력 정보
진행 중인 입출력 요구 등의 정보이다.
프로세스 상태와 변화
프로세스가 만들어져 시스템에 존재하는 동안 여러 가지 사건들에 의해 일련의 상태 변화를 갖게 된다.
이러한 상태들은 시스템마다 조금씩 다르게 정의되지만, 기본적인 것만 정리하면 생성, 준비, 실행, 대기, 보류, 보류 대기, 종료가 있다.
(상태와 관련되어서는 프로세스 스케줄링을 정리할 때 다시 한번 언급할 것임 ..)
생성 상태
사용자가 요청한 작업이 커널에 등록되고 PCB가 만들어져 프로세스가 만들어진 다음 준비나 보류 준비 상태로 되기 위해 잠시 거치는 상태
운영체제는 프로세스를 생성한 후에 메모리 공간을 검사해서
> 충분한 공간이 있다면 메모리를 할당해서 준비상태로 바꾸어주고
> 그렇지 못하면 (= 충분한 공간이 없다면) 보류 준비 상태로 만든다.
준비 상태
CPU를 할당 받기 위해 기다리고 있는 상태
= 즉, CPU만 주어지면 바로 실행할 준비가 되어 있는 상태를 의미한다.
다중 프로그래밍의 경우 준비 상태의 여러 프로세스들은 메모리에 적재되어 있으며 CPU를 할당 받기를 기다리고 있는데 이를 위해서 큐(또는 리스트)가 사용된다.
준비 상태의 프로세스들은 순서에 따라 CPU를 할당 받으면 실행 상태가 되는데 이때 순서를 정하는 것을 CPU 스케줄링이라고 한다.
실행 상태
CPU를 할당 받아 실행 중인 상태를 말하는데 이때 CPU를 할당하는 것을 디스패치라고 한다.
실행 상태의 프로세스는 CPU 스케줄링 정책에 의해서 CPU를 뺏길 수 있으며 이 경우 준비 상태로 바뀌게 된다.
특히 시간 할당량(Time Quantum)이 소진되어 뺏길 때를 시간 종료라고 하는데, 이 경우도 인터럽트가 동원되어 처리된다.
대기 상태
또 다른 경우로 실행 상태의 프로세스가 입출력이 필요하게 되어 시스템 호출을 하게되면 입출력 처리의 종료를 기다리면서 대기 상태로 바뀌게 된다. CPU는 바로 준비 상태의 프로세스들 중에서 하나를 선택해 실행해 줄 것이다.
요청한 일이 완료되면 다시 실행 차례를 기다리기 위해 준비 상태로 바뀌면서 준비 큐에 들어간다.
종료 상태
프로세스가 종료될 때 아주 잠시 거치는 상태로 이 상태의 프로세스는 할당 되었던 모든 자원들이 회수되고 PCB만 커널에 남아 있는 상태이다.
운영체제가 시스템에 남겨져 있는 이프로세스의 흔적들을 최종 정리 후 PCB를 삭제하면 프로세스가 완전히 사라지게 된다.
예를 들어서 어떤 프로세스가 한 번의 시간 종료 인터럽트를 겪고 그 후 한 번의 입출력을 한 후 완료된다고 할 때 상태 변화 과정을 살펴보자.
먼저 생성 상태가 되고 메모리에 여유가 있다면 곧바로 준비 상태가 될 것이다.
이미 준비 상태에 있었던 프로세스들과 함께 CPU를 할당 받기 위해 기다리다가 차례가 되어 실행 상태로 가서 일을 하다가 시간 종료가 되어 CPU를 뺏기고 다시 준비 상태가 될 것이다.
다음 차례의 CPU 할당과 함께 다시 실행 상태가 된 후 아까 하던 일을 계속 하다가 입출력을 발생시키면 이번에는 대기 상태로 될 것이다. 기다리던 입출력이 완료되면 인터럽트를 통해 이 사실이 알려져서 시스템은 이 프로세스를 준비 상태로 만들고 아까처럼 CPU가 할당되기를 기다린다.
준비, 실행, 대기 상태 > Active State(= 활성 상태)
*활성 상태 : 실행될 프로그램과 데이터 등을 위해 메모리 공간의 일정량을 부여받았음을 의미
보류 상태
메모리가 부족하거나 다른 이유에 의해 시스템은 활성 상태의 프로세스로부터 메모리를 회수할 경우가 있는데 이 때를 보류라고 한다.
보류 상태는 프로세스가 메모리 공간을 뺏기고 디스크로 나가야 하는 걸 말한다.
(= Swapped Out)
나중에 다시 메모리로 들어오면 스왑되어 들어온다라부르며
(= Swapped In)
두 경우를 통틀어 스와핑이라 부른다.
보류 준비
메모리의 여유가 생기거나 또는 준비 상태의 프로세스가 전혀 없을 때 CPU의 할 일이 없게 놔두지 않기 위해서 대기 상태의 프로세스를 보류 대기로 만들고 메모리 공간이 확보되면 준비 상태로 바뀌게 된다.
(-> 위에서 말한 스와핑이 있게 되는 것)
보류 대기
대기 상태일 때 메모리 공간을 잃은 것이다.
'OS' 카테고리의 다른 글
[질문] 프로세스, 쓰레드 (0) | 2022.08.29 |
---|---|
시스템 콜과 인터럽트 (0) | 2022.08.29 |
프로세스 - 상태 (0) | 2022.08.29 |
쓰레드 (0) | 2022.08.29 |
운영체제란 무엇인가? (0) | 2022.08.22 |