프로세스
프로세스란?
프로세스는 실행 중인 프로그램을 의미한다.
프로그램을 실행하는 순간, 메모리 할당이 이뤄지고 이 공간으로 바이너리 코드가 올라간다. 이 순간부터 프로그램은 프로세스라고 불린다.
.
프로세스의 구성 요소
메모리
프로세스의 메모리는 4가지 영역으로 구성된다.
- Data영역 : 전역변수나 static변수의 할당을 위해 존재
- Stack영역 : 지역변수 할당과 함수 호출시 전달되는 인자들이 저장되는 영역.
- Heap영역 : 동적 할당을 위해 존재
- Code 영역 : 실행파일을 구성하는 명령어들이 올라가는 영역.
.
레지스터 셋(register set)
프로그램을 실행하면 CPU의 레지스터들이 해당 프로그램을 위한 데이터로 채워질탠데 이런 데이터 상태 또한 프로세스의 일부로 볼 수 있다.
.
프로세스의 상태
프로세스의 상태는 (OS마다 다르겠지만) 기본적으로 Ready / Running / Blocked 세 가지 상태가 존재한다고 볼 수 있다.
프로세스가 생성되면 Ready 상태로 존재한다. 여기서 프로세스는 CPU에 의해 실행되기를 기다린다.
스케줄러는 Ready상태에 있는 프로세스를 실행시킬 수 있다. 프로세스가 실행되면 Running상태로 전환된다.
Running상태인 프로세스가 다른 프로세스에게 우선순위가 밀리면 다시 Ready상태로 갈 수 있다.
Running상태에 있는 프로세스는 I/O등의 이유로 Blocked 상태로 전환될 수 있다. Blocked 상태에 빠진 프로세스가 다시 실행이 가능해지면 Ready상태로 전환된다. 만약 종료된다면 Blocked상태로 전환된 뒤 Exit상태로 바뀐다.
.
컨텍스트 스위칭
실행중인 프로세스의 전환은 시스템에 많은 부하를 주는데, 레지스터 셋을 교체하는데 많은 비용이 들기 때문이다. 이런 작업을 컨텍스트 스위칭이라 부른다.
.
커널 오브젝트
OS는 기본적으로 돌아가는 기능 이외에도 그림판 계산기 등등 프로그램이 포함되어 있다. 이런 걸 제외하고 컴퓨터를 운영하는데 필요한 OS의 핵심 부분을 커널이라고 부름.
커널은 프로세스 스레드 혹은 파일과 같은 리소스들을 관리하기 위해 필요한 정보를 저장한다. 이때 데이터를 저장하는 메모리 블록을 커널 오브젝트라 한다.
.
프로세스 스케줄링
CPU가 1개여도 프로그램은 여러 개를 실행할 수 있다. 이게 가능한 이유는 CPU가 프로세스를 번갈아가며 실행하기 때문.이 때 프로세스의 CPU 할당 순서 및 방법을 결정짓는 일을 스케줄링이라고 한다.
스케줄링에 쓰이는 알고리즘을 스케줄링 알고리즘이라고 하고, 이런 스케줄링 알고리즘을 적용해서 프로세스를 관리하는 OS모듈을 가리켜 스케줄러라 한다.
.
선점형 OS와 비선점형 OS
비 선점형 OS의 경우 지금 실행중이 프로세스보다 높은 우선순위의 프로세스가 등장해도 실행 대상을 변경하지는 않는다. 다른 프로세스가 실행되기 위해서는, 현재 실행 중인 프로세스가 명시적으로 CPU를 양보하거나, I/O 작업 등으로 블로킹 상태에 놓일 때 까지 기다려야 한다. 이런 방식은 프로그래머에게 매우 의존적(알아서 잘 관리해주길 기대해야함)
선점형의 경우에는 현재 실행 중인 프로세스보다 높은 우선순위의 프로세스가 등장하면, 스케줄러가 실행 순서를 조정한다. 최근의 OS는 대부분 선점형이다.
.
스케줄링 알고리즘 예시
많은 OS에서 쓰는 방식 중 하나는 우선순위에 따라 프로세스를 실행시키는 것. 우선순위가 낮다면 기아상태에 빠짐. 그래도 실행 중인 프로세스들의 I/O작업이 많다면 낮은 우선순위의 프로세스도 잘 실행된다.
우선순위가 같은 프로세스끼리는 라운드 로빈 방식을 쓸 수 있음. 이 방식은 정해진 시간만큼만 CPU를 쓰고 다른 프로세스한테 넘기는 방식. 이 때의 시간 간격을 퀀텀 혹은 타임 슬라이스라고 함. 이 간격이 너무 짧으면 컨텍스트 스위칭이 자주 발생해서 성능이 안 좋아지고, 너무 길면 응답성이 떨어진다.
윈도우나 리눅스가 우선순위 + 라운드로빈 방식을 씀.
.
스케줄러의 동작 시점
매 타임 슬라이스마다 / 프로세스가 생성 및 소멸될 때 / 현재 실행 중인 프로세스가 블로킹 상태에 놓일 때, 스케줄러가 동작한다.
.
우선순위 역전 (priority inversion)
A,B,C라는 프로세스가 있고 우선순위가 A>B>C라고 해보자. 그리고 A프로세스는 C프로세스의 작업을 대기해야 하고, 이를 위해 A프로세스는 Blocked상태에 놓인다. 그런데 C보다 높은 B 프로세스가 있기 때문에 C프로세스는 실행되지 못하고, A도 계속 기다리는 상황이 있을 수 있음. 결과적으로 보면 우선순위가 더 높은 A가 B때문에 실행이 되지 못하는 현상이 생긴다. 이런 현상을 해결하기 위해서는 A프로세스가 Blocked상태에 빠지기 전에 C의 우선순위를 높혀주는 방식을 써야 한다.
'이론 > 기초' 카테고리의 다른 글
OS - 메모리 관리 기초 (0) | 2023.08.13 |
---|---|
OS - 쓰레드 (0) | 2023.08.06 |
아스키코드 & 유니코드 (0) | 2023.07.23 |
컴퓨터 구조 기초 - 4 (0) | 2023.07.16 |
컴퓨터 구조 기초 - 3 (0) | 2023.07.09 |