Reference
프로세스의 생성과정 및 상태 전이
프로세스vs 스레드 개념
스케줄링의 종류
스케줄링 muti-level
프로그램
어떤 작업을 하기 위해 실행할 수 있는 파일
프로세스
실행되어 작업 중인 컴퓨터 프로그램
프로세스
운영체제로부터 자원을 할당받은 작업의 단위
스레드
프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위
쓰레드는 프로세스의 한계로 인해 생성된 개념이다. 과거에는 하나의 프로세스만을 사용했지만 기술이 발전하면서 프로세스 하나만으로는 작업이 어려워 졌다. 그렇기에 프로세스 내에서 여러 작업을 할 수 있는 스레드라는 개념이 생기게 되었다.
그렇다면 프로세스를 여러개 사용하는 것은 안되는 것인가? 라고 생각할 수 있지만 프로세스 하나를 사용하기 위해서는 CPU 자원을 할당받아야 하는데 할당받는 자원이 중복되고 큰 메모리를 차지하게 되어 비효율적이게 될 것이다.
쉽게 말해 크롬 브라우저를 생성하는 것이 프로세스이고 그 안에서 블로그를 작성하면서 노래를 동시에 들을 수 있는 작업이 쓰레드 라고 이해하면 쉬울 것이다.
이때 다중 작업을 진행 할 경우 다중(멀티) 쓰레드라고 부른다.
프로세스의 자원 구조
💡 STACK
영역
: 지역 변수와 같은 함수가 호출이 종료되면 되돌아올 임시적인 자료를 저장하는 독립적인 공간이다. STACK
은 함수의 호출과 함께 할당되며, 호출이 완료되면 소멸한다. 만일 STACK
의 영역을 초과하면 Stack overflow 가 발생한다.
💡 HEAP
영역
: 생성자, 인스턴스와 같은 동적으로 할당되는 데이터들을 위해 존재하는 공간이다. 사용자의 의해 메모리 공간이 동적으로 할당되고 해제된다.
💡 DATA
영역
: 코드가 실행되면서 사용하는 전역 변수나 각종 데이터들이 모여있다. 데이터영역은 .data
,.rodata
,.bss
영역으로 세분화된다.
.data
: 전역변수 또는 static 변수 등 프로그램이 사용하는 데이터 저장.bss
: 초기값 없는 전역변수, static 변수가 저장.rodata
: const같은 상수 키워드 선언된 변수나 문자열 상수가 저장💡 TEXT
영역
: 프로그래머가 작성한 프로그램 함수들의 코드가 CPU가 해석 가능한 기계어 형태로 저장되어 있다.
Data
영역과 Text
영역은 선언할 때 크기가 정해지는 정적 영역이지만, Stack
영역과 Heap
영역은 크기가 줄었다 늘었다 하는 동적 영역이다. 그렇기 때문에 위 그림에서 stack과 heap 영역 사이에 화살표가 쳐 있는 것을 볼 수 있다.
스레드끼리 프로세스의 자원을 공유하면서 프로세스 실행 흐름의 일부가 때문에 동시 작업이 가능하다. 이때 프로세스 4가지 메모리 영역(Code,Data,Heap,Stack) 중 스레드는 Stack만 할당받아 각자 스레드에 복사하고 Code(text), Heap, Data는 프로세스내의 다른 스레드들과 공유된다.
이렇게 공유자원을 공유하도록 구성된 이유는 하나의 프로세스를 다수 의 실행 단위인 스레드로 구분하여 자원을 공유하고, 자원의 생성과 관리의 중복성을 최소화하여 수행 능력을 올리기 위해서이다.
운영체제에서 CPU를 사용할 수 있는 프로세스를 선택하고, CPU를 할당하는 작업을 말한다. 프로세스 스케줄링은 프로세스의 우선순위, 작업량 등을 고려하여 효율적으로 배치하여, 이를 통해 운영체제는 CPU를 효율적으로 사용하며 시스템 전반적인 성능을 향상시킨다.
운영체제에서 다중 스레드를 관리하며, CPU를 사용할 수 있는 스레드를 선택하고, CPU를 할당하는 작업
스레드 스케줄링 종류
Round-Robin : 선점형 스케줄링 방식, 현대적인 CPU 스케줄링
Priority-based Scheduling :
⚡ 선점과 비선점 두가지 방식 모두 적용 가능 , 우선순위가 높은 프로세스에 CPU를 먼저 할당
⚡ 기아 현상과 무기한 봉쇄가 발생할 수 있으며 에이징 기법을 통해 해결
Multi-level Queue scheduling
⚡ Ready Queue를 여러 개로 분할하고, 각각의 queue의 우선순위를 정하고, 각각의 프로세스는 해당 프로세스의 우선 순위에 따라 각각의 queue에 배치되고, queue 간 경쟁을 통해 하나의 queue가 cpu를 점유하는 형태.
Multi-level Feedback Queue
⚡ Multilevel queue의 경우 queue와 프로세스에 대한 우선순위를 정해야 하고, queue의 time slice를 하는 등, 구현 방법이 복잡하다
CPU가 한 프로세스에서 다른 프로세스로 전환할 때 발생하는 일련의 과정
CPU는 한번에 하나의 프로세스만 실행 할 수 있으므로 여러개의 프로세스를 번갈아가며 실행하며 CPU 활용률을 높이기 위해 컨텍스트 스위칭이 필요하다.
운영체제에서 프로세스를 관리하기 위해 해당 프로세스의 상태 정보를 담고 있는 자료구조
Context switching을 실행하면서 기존 프로세스의 상태를 어딘가 저장해둬야 다음에도 똑같은 작업을 이어서 할 수 있고, 새로운 작업의 상태도 저장해놔야 어디서 부터 시작할 수 있을 지 알 수 있을 것이다.
즉, PCB는 프로세스 스케줄링을 위해 프로세스에 관한 모든 정보를 저장하는 임시 저장소 이다.
💡 이때 프로세서 제어블록은 중요한 정보를 포함하고 있기 때문에, 일반사용자가 접근하지 못하도록 각각의 프로세스 안의 커널 스택(커널 내의 주소)에 위치
따라서 운영체제는 PCB에 담신 프로세스 고유 정보를 통해 프로세스를 관리하고, 실행 상태를 파악하고, 우선순위를 조정하며, 스케줄링을 수행하고 다른 프로세스와의 동기화를 제어한다.
운영체제의 커널이 프로세스들을 구분하기 위해 사용하는 프로세스 식별자(이름)
PCB가 각 프로세스 안의 커널 주소 공간에 존재해 오직 커널에서만 사용될 수 있는 구조체라고 한다면, PEB는 어플리케이션이 접근해 사용할 수 있는 사용자 모드 주소 공간에 위치한, 프로세스의 정보를 담고 있는 데이터 구조체이다.
컨텍스트 스위칭을 함으로써 빠른 반응성과 동시성을 제공하지만, 실행되는 프로세스의 변경 과정에서 프로세스의 상태, 레지스터의 값이 저장되고 불러오는 등의 작업이 수행되기 때문에 시스템에 많은 부담을 준다.
컨텍스트 스위칭 과정에서 Process A가 Process B로 컨텍스트 스위칭 될 때 Process B가 바로 idle->excute 되는 것이 아니라 idle 상태에서 조금 있다가 excute 되는 것을 확인할 수 있다.