✅프로세스 생명주기
프로세스 생명주기 = 프로세스 상태변화
Process란?
프로그램이 실행되어 메인메모리로 올라오게 되면, 그 프로그램을 프로세스 라고 부른다.
프로그램이 실행되어 프로세스가 되면 컴퓨터 안에 있는 PC, SP, 레지스터 값들, Text와 Data 영역, Stack, Heap 영역 등이 할당되고 사용된다. 프로그램 상태(HDD에서)는 이러한 작업이 일어나지 않지만 프로그램이 메모리에 올라와서 프로세스가 되면 많은 작업이 일어난다.
신규 : 프로세스가 이제 막 메인 메모리에 올라온 상태, 실행 불가, admit 동작을 거친 후 준비 단계로 감
준비: 변수 초기화 등 기초준비 작업이 끝나고 실행할 수 있는 상태, dispatch되면 수행 상태가 된다.
수행: cpu가 실제로 프로세스를 수행하고 있는 상태
대기: 프로세스 도중에 I/O작업이 필요하여 I/O작업을 수행하는 상태
**I/O : Input/Output, 컴퓨터시스템에서 정보를 입력하거나 출력하는 모든 작업을 나타낸다. 주로 대기상태에서 발생한다.
ex)
- 생성(Create): 워드 프로세싱 소프트웨어를 실행하여 새로운 프로세스가 생성됩니다.
- 준비(Ready): 프로세스는 실행을 기다리는 상태로 전환됩니다.
- 실행(Running): 운영체제는 준비 상태의 프로세스 중 하나를 선택하여 CPU를 할당하고, 워드 프로세싱 소프트웨어가 실행됩니다. 이 때, 사용자는 키보드를 사용하여 문서를 입력하고, 입력한 내용이 프로세스에 의해 처리됩니다.
- 대기(Waiting): 사용자가 문서를 저장하려고 할 때, 프로세스는 I/O 작업을 요청하게 됩니다. 이때, 소프트웨어는 디스크나 하드 드라이브와 상호작용하여 문서를 저장하는 작업을 수행합니다. 이 작업이 완료될 때까지 프로세스는 대기 상태로 전환됩니다.
- 완료(Terminated): 사용자가 작업을 마치고 프로세스를 종료하면, 해당 프로세스는 완료 상태가 되고 메모리에서 해제됩니다.
✅대기 큐 (Waiting Queue)
1. Job Queue : 메인 메모리가 가득 찼거나 CPU가 다른 작업을 수행 중일때 HDD의 프로그램들이 잠시 기다리는곳(아직 메모리에 올라오지 않은 상태)
2. Ready Queue : 이미 메모리에 올라온 프로세스들이 실행을 위해 대기하는 곳
3. Device Queue : I/O 장치들의 큐
✅Scheduling (스케쥴링), Scheduler
1. Job Scheduler(Long term scheduler) : Job Queue 의 프로그램들을 어떤 순서로 메모리에 올릴 것인지 결정, 프로그램이 새로 시작될 때, 메인 메모리가 가득 찬 경우에만 발생하므로 자주 일어나지 않는다.
2. CPU scheduler(Short term scheduler) : Ready Queue의 프로세스들을 어떤 순서로 서비스 할 것인지에 대한 스케줄러이다. 시공유 시스템의 경우 이러한 과정은 1초에도 수십번에서 많게는 수백번도 일어나기 때문에 이러한 스케줄러를 Short Term Scheduler라고도 하고 모든 스케줄링 중에서 CPU 스케줄링이 가장 중요하다.
3. Device Scheduler : Device Queue의 프로세스들을 어떤 순서로 I/O 장치를 이용하게 할 것인지에 대한 스케줄러이다. 이는 Disk Scheduler, Printer Scheduler, Mouse Scheduler 등 I/O, 보조기억 장치 스케줄러를 통틀어 가리키는 말이다.
✅주-보조 교환 (Swapping)
Swapping Scheduling(Midium Term Scheduler) : 동작없는 프로세스는 HDD로, 작업을 수행하면 다시 메모리로
각각 Swap Out, Swap In 으로 표현하며 임시 메모리의 목적으로 사용되는 HDD공간을 Backing Store or Swap Device라고 지칭
✅문맥교환 (Context Switching)
CPU 시간 공유 시스템의 경우 일정 시간이 지나면 기존 프로세스를 준비 상태로 만들고 다른 프로세스를 수행 상태로 만들어서 실행한다. 실행하는 프로세스를 Switch 하는 것을 통틀어서 Context Switching 이라고 한다.
문맥교환을 하는 이유는?
한 운영 체제에서 여러 프로세스가 CPU를 공유할 때 발생하는데 이유는 아래와 같다.
- CPU 스케쥴링 : 프로세스들에게 CPU 시간을 할당하고, 각각의 프로세스가 일정시간 동안 실행될 수 있도록 관리한다.
- 멀티프로세서 환경 : 프로세스의 실행을 다른 CPU로 이전하기 위해
- 인터럽트 처리 : 현재 실행중인 프로세스를 일시적으로 중단하고 인터럽트 처리를 위한 루틴으로 전환
- 자원의 점유 및 해제 : 프로세스가 다른 자원(입출력장치, 메모리)을 요청하고 할당 받을 때, 현재 실행중인 프로세스는 해당 자원을 점유하고 있어야한다. 다른 프로세스가 같은 자원을 사용해야할 경우 현재 실행중인 프로세스는 해당 자원을 해제하고 다른 프로세스에게 양보해야한다.
Context Switching을 전문적으로 담당하는 스케쥴러는 CPU 스케쥴러이다.
프로세스 A를 수행하다가 B로 넘어가면 정보를 저장하고, A의 차례가 왔을때 정보를 다시 꺼내는 작업을 수행하는 프로그램을 Dispatcher 라고 한다.
**시간공유시스템(Time-sharing system)
컴퓨터 시스템에서 여러 사용자가 동시에 컴퓨터 자원을 공유하는 방식
CPU 시간을 작은 시간 단위로 나누어 여러 프로세스에 할당하여 사용자들이 동시에 실행중인 것 처럼 느끼게 함.
ex) 사용자 A,B,C가 한대의 컴퓨터를 공유한다고 쳤을때, A,B,C가 시스템에 로그인하여 각자의 작업을 실행한다. 시간 공유 시스템은 작업을 작은 시간 단위로 분할하여 번갈아가면서 실행한다. 사용자 A는 웹브라우저를 실행하고 B는 문서작성, C는 데이터 베이스로 데이터를 처리하고 있다면 시간공유시스템은 각 사용자에게 공정한 자원할당을 제공하면서 동시에 여러작업을 수행할 수 있도록 한다. 이 때 사용자들은 프로세스들이 동시에 실행되는것 처럼 느낄 수 있다. 시스템이 작은 시간 단위로 CPU 시간을 분할하여 각 작업에게 번갈아가면서 할당하기 때문이다.
✅프로세스 메모리
1. Code = text 영역
실행할 프로그램의 코드가 저장된다.
2. Data 영역
전역변수와 정적변수가 저장된다. 프로그램 시작시 할당, 종료시 소멸
BSS(Block Stated Symbol) 영역: 초기화되지 않은 전역변수가 저장되는 곳, 프로그램실행 전에 할당, 초기화되지않은 전역변수들은 초기화 비용이 들지 않기 때문에 프로그램 크기를 줄이고 실행 속도를 향상시킬 수 있다.
ex)
초기화된 전역 변수: var name = "John" //name 변수는 John으로 초기화 되었고, 문자열 값을 가지고 있으며 전역스코프에서 접근 가능한 변수로 선언되었다.
초기화되지 않은 전역 변수: var count // count 변수는 var 키워드를 사용하여 선언되었지만 초기화되지 않았다. 이 경우 count 변수는 undefined로 값이 설정되며 전역 스코프에서 접근 가능한 변수로 선언된다.
3. Stack 영역
호출된 함수의 수행을 마치고 복귀할 주소 및 데이터를 임시로 저장하는 공간 (지역변수, 매개변수, 리턴값 등)
함수 호출시 기록하고 함수의 수행이 완료되면 사라진다. 메커니즘은 자료구조에서 배운 LIFO(Last In First Out)으로 저장/출력한다. 컴파일 시 stack 영역의 크기가 결정 되기 때문에 무한정 할당할 수 없다. 따라서 재귀함수가 반복해서 호출되거나 함수가 지역변수를 메모리를 초과할 정도로 가지고 있다면 stack overflow가 발생한다.
**컴파일? 프로그래밍언어로 작성된 소스코드를 컴퓨터가 이해하고 실행할 수 있는 기계어로 변환하는 과정
**재귀함수? Recursive function 함수, 자기자신을 호출하는 함수 ex) 이진 트리 순회
**stack overflow? 컴퓨터 프로그램에서 스택 메모리 영역을 넘어서 데이터가 쓰여지는 현상, 스택은 함수 호출과 관련된 정보를 저장하기 위해 사용되는 메모리 영역으로, 함수가 호출될때마다 스택에 프레임이 추가되고 함수가 반환될때마다 스택에서 해당 프레임이 제거됌. 과도한 함수호출, 무한재귀호출 등의 상황에서 함수가 무한히 자기 자신을 호출하며 스택이 계속 쌓이고 이로인해 스택오버플로우가 발생하고 프로그램은 예외상황으로 간주되어 비정상적으로 종료될 수 있다.
4. Heap 영역
동적데이터 영역, 프로세스 실행중에 필요한 메모리를 할당하고 해제하는데 사용된다. 프로그램에서 동적으로 크기가 변하는 데이터구조나 객체, 배열등을 저장하기 위해 사용된다.
✅커널 프로세스 메모리
커널(Kernel) : 대부분의 운영체제의 주요 구성 요소이며 컴퓨터 하드웨어와 프로세스를 잇는 핵심 인터페이스이다. 응용 로그램 조회에서 강제 종료할 수 있는 기능도 커널 프로세스의 역할이다. 하나의 프로세스x, 인터페이스o
**프로세스 vs 인터페이스
프로세스
- 컴퓨터에서 실행중인 프로그램을 의미
- 운영체제에서 메모리에 할당되어 실행되는 독립적인 작업 단위
- 각 프로세스는 프로그램코드, 데이터, 스택, 힙 등의 정보를 포함하며 실행중에는 CPU 시간과 메모리 공간을 할당 받음
인터페이스
- 서로 다른 시스템, 기기 또는 컴포넌트 간의 상호작용을 위한 규격이나 조건을 나타냄
- 일반적으로 메서드, 함수, 프로토콜, API등으로 표현될 수 있다
즉 프로세스는 실행중인 프로그램이고 인터페이스는 시스템간의 상호작용을 위한 규칙이며 규격을 정의하는 것.
커널프로세스의 메모리
- Code(text)영역 : 시스템 콜, 중단(interrupt) 처리 코드, CPU, 메모리 등 관리 코드
- Data 영역 : PCB(Process Controll Block) 저장// 옷의 tag 같은 존재로 현재 수행중인 프로세스의 상태, cpu사용정보등을 유지하기 위한 자료구조
- Stack 영역 : Process 커널 스택을 저장
- Heap 메모리는 사용하지 않는다
✅정리하기
1) 프로세스 : 메모리에 올라온 프로그램
2) 프로세스 생명주기 : 신규 - 준비 - 수행 - 대기 - 종료
3) PCB : 프로세스의 실행 정보와 상태 정보를 저장하는 자료구조 (PID, PC, Register, MMU 등)
4) 대기 큐 (Queue) : Job, Ready, Device Queue 등
5) Scheduler : Job, CPU, Device Schduler 등
6) Swapping : 안쓰는 프로세스 HDD로 내리고, 다시 쓰이면 메모리로 올리는 작업
7) Context Switching : Running 프로세스를 Ready로 만들고 다른 프로세스로 전환
8) Dispatcher : 컨텍스트 스위칭할 때 필요한 정보(PCB를 저장하고 꺼내는 프로그램)
9) CPU 시간공유 시스템 : (대부분의)OS에서 프로세스(스레드)가 시간단위로 나누어서 CPU를 사용할 수 있도록 관리해주는 시스템
10) 프로세스 메모리 공간 : 프로세스 주소 공간은 Code, Data, Stack, Heap 으로 구성됨
11) 커널 : 커널은 대부분의 운영 체제(OS)의 주요 구성 요소이며 컴퓨터 하드웨어와 프로세스를 잇는 핵심 인터페이스
12) PCB : 프로세스의 실행 정보와 상태 정보를 저장하는 자료구조로 커널 프로세스에 존재
✅런타임(Runtime)이란?
런타임은 프로그램이 실행되는 동안의 '환경'을 의미한다. 프로그램이 컴파일 되거나 인터프리트되어 실행될 때, 실제로 동작하는 시점을 가리킨다. 런타임 환경은 프로그램이 실행되는 동안 필요한 메모리, 프로세스 제어, 입출력 관리 등과 같은 기능을 제공한다.
런타임은 프로그래밍 언어에 따라 다른 의미를 가질 수 있다.
- 자바 런타임 (Java Runtime): 자바 프로그램은 자바 가상 머신(JVM) 위에서 실행됩니다. 자바 런타임 환경은 JVM과 JVM이 동작하는 데 필요한 라이브러리, 클래스, 자바 개발 도구 등을 포함합니다.
- 자바스크립트 런타임 (JavaScript Runtime): 자바스크립트는 브라우저 환경에서 실행되거나, Node.js와 같은 런타임 환경에서 실행될 수 있습니다. 자바스크립트 런타임은 자바스크립트 코드를 해석하고 실행하는 역할을 담당하며, DOM(Document Object Model) 조작, AJAX 호출, 타이머 등을 제어하는 기능을 제공합니다.
- Python 런타임 (Python Runtime): 파이썬 프로그램은 파이썬 인터프리터를 통해 실행됩니다. 파이썬 런타임은 인터프리터와 파이썬 언어의 기능을 지원하는 라이브러리, 모듈, 데이터 구조 등을 포함합니다.
✅참고자료
https://zangzangs.tistory.com/107
'필수 개발지식 > CS' 카테고리의 다른 글
[CS] Database에서 정규화(Normalization)란? (0) | 2023.07.05 |
---|---|
[CS] 쓰레드와 쓰레드 풀 (0) | 2023.07.05 |
[CS] DB INDEXING (0) | 2023.06.21 |
[CS 지식] CPU와 메모리, 스케쥴링, 메모리, 자료구조 (0) | 2023.06.15 |
[자료구조] 레드-블랙 트리(Red-Black Tree)란? (0) | 2023.06.14 |