프로세스
스레드
- 프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위
프로그램
- 컴퓨터에서 실행 할 수 있는 파일
- 우리는 이 아직 파일을 실행시키지 않은 정적 프로그램을 흔히 프로그램이라 부른다.
프로세스
- 프로그램을 실행시켜 정적 프로그램이 동적으로 변하여 돌아가고 있는 상태
- 즉, 컴퓨터에서 작업 중인 프로그램을 의미한다.
프로그램 실행 시
- 프로그램을 실행하기 위해서는 프로그램을 실행하면 파일은 컴퓨터 메모리에 올라가게 되고, OS로부터 CPU를 할당받아 프로그램을 실행시키게 된다.
프로세스의 구조

- 스택 영역 : 함수 안에서 선언된 지역변수, 매개변수, 리턴값 등이 저장되며 함수 호출 시 생성되고 함수 종료 시 사라진다.
- 힙 영역 : 생성자, 인스턴스와 같은 동적으로 할당되는 데이터들이 저장되는 공간이며 사용자에 의해 메모리 공간이 동적으로 할당되고 해제된다.
- 데이터 영역 : 코드가 실행되면서 사용하는 전역 변수나 각종 데이터들이 모여있는 영역이다.
- .data 영역 : 전역 변수 또는 static 변수 등 프로그램이 사용하는 데이터 저장
- .BSS 영역 : 초기값 없는 (전역 변수, static 변수)가 저장
- .rodata 영역 : const와 같은 상수 키워드 선언된 변수 혹은 문자열 저장
- 코드 영역 : 프로그래머가 작성한 프로그램 함수들의 코드가 기계어 형태로 저장
프로세스 스케쥴링
- 운영체제에서 CPU를 사용할 수 있는 프로세스를 선택하고, CPU를 할당하는 작업
- 우선순위, 작업량 등을 고려하여 프로세스를 효율적으로 배치하여 운영체제는 CPU를 효율적으로 사용할 수 있게 되어 시스템의 전반적인 성능을 향상시킨다.
- 스케쥴링은 FCFS(First-Come First-Served), SJF(Shortest-Job-First), Priority, RR(Round-Robin), Multilevel Queue와 같은 다양한 알고리즘 방식으로 동작한다.
프로세스의 상태 전이
- 프로세스가 실행되는 동안 상태가 OS에 의해 변경되는 것
- 운영체제는 프로세스의 상태를 감시하고 프로세스 상태를 기반으로 프로세스 스케쥴링을 통해 프로세스를 관리하고 제어한다.

- 생성(New) : 디스크에서 메모리로 프로그램이 올라와 실행준비를 하는 상태
- 준비(Ready) : CPU를 기다리는 상태
- 실행(Running) : CPU를 잡고 instruction을 수행 중인 상태
- 대기(Blocked) : CPU를 주어도 당장 instruction을 수행할 수 없는 상태, Process 자신이 요청한 event가 즉시 만족되지 않아, 이를 기다리는 상태
- 종료(Terminated) : 수행이 끝난 상태
- Admitted (new -> ready) : 프로세스 생성을 승인 받음
- Dispatch (ready -> running) : 준비 상태에 있는 여러 프로세스들 중 하나가 스케쥴러에 의해 실행됨
- Interrupt (running -> ready) : Timeout, 예기치 않은 이벤트가 발생하여 현재 실행 중인 프로세스를 준비 상태로 전환하고, 해당 작업을 먼저 처리
- I/O or event wait(running -> blocked) : 실행 중인 프로세스가 입출력이나 이벤트를 처리해야 하는 경우, 입출력이나 이벤트가 끝날 때까지 대기 상태로 전환
- I/O or event completion (waiting -> ready) : 입출력이나 이벤트가 모두 끝난 프로세스를 다시 준비 상태로 만들어 스케쥴러에 의해 선택될 수 있는 상태로 전환
멀티 코어
- CPU 한 개는 여러 개의 core를 가질 수 있다.
- 코어가 여러 개 있다는 것은 명령어를 메모리에서 뽑아 해석하고 실행하는 반도체 유닛이 여러개 있다는 것을 의미한다.
- 예) 4코어 8쓰레드 CPU ⇒ 4개의 물리적 코어 개수와 8개의 논리적 코어 개수
- 해당 경우에서는 한개의 물리적 코어가 2개 이상의 스레드를 동시에 실행 가능하다는 의미이다.
CPU의 작업 처리 방식의 특징
병렬성
- 명령어를 메모리에서 뽑아 해석하고 실행하는 반도체 유닛인 여러 개의 코어에 맞춰 여러 개의 프로세스, 스레드를 돌려 병렬로 작업들을 동시 수행하는 특성이다.

동시성
- 둘 이상의 작업이 동시에 실행되는 것
- 병렬성과는 다르게 병렬성은 물리적으로 동시에 실행되는 것이면 동시성은 동시에 실행하는 것처럼 보이게 하는 것
- 예 ) 1개의 코어가 있고 4개의 작업이 있을 때, 한 작업씩 처리하는 것이 아니라 4개의 작업들을 조금씩 번갈아가면서 처리하여 프로그램이 동시에 실행되는 것처럼 보이게 함
- 이 동시성을 가지기 위해 여러 작업들을 번갈아 바꾸는 것을 Context Switching이라 한다.
프로세스 컨트롤 블록(Process Control Block) PCB
- 운영체제에서 프로세스를 관리하기 위해 해당 프로세스의 상태 정보를 담고 있는 자료구조
- 프로세스가 생성되면 메모리에 해당 프로세스의 PCB가 함께 생성, 종료 시 삭제된다.


PCB의 구성

- 포인터 : 프로세스의 현재 위치를 저장하는 포인터 정보
- 프로세스 상태 : 프로세스의 각 상태를 저장
- 프로세스 아이디 : 프로세스 식별자를 지정하는 고유한 ID
- 프로그램 카운터 : 프로세스를 위해 실행될 다음 명령어의 주소를 포함하는 카운터를 저장
- 레지스터 : CPU 레지스터에 있는 정보
- 메모리 제한 : 운영 체제에서 사용하는 메모리 관리 시스템에 대한 정보
- 열린 파일 목록 : 프로세스를 위해 열린 파일 목록
프로세스 컨텍스트 스위칭
-
CPU가 한 프로세스에서 다른 프로세스로 전환할 때 발생하는 일련의 과정
-
동작 중인 프로세스가 대기를 하면서 해당 프로세스의 상태를 보관하고, 대기하고 있던 다음 순서의 프로세스가 동작하면서 이전에 보관했던 프로세스의 상태를 복구하는 작업

Overhead란
- 어떤 처리를 하기 위해 들어가는 간접적인 처리 시간 혹은 메모리 등을 말한다.
Context Switching Overhead

컨텍스트 스위칭에서 오버헤드가 발생하는 원인
- PCB 저장 및 복원
- CPU 캐시 메모리 무효화에 따른 비용
- 프로세스 스케쥴링 비용
스레드
하나의 프로세스 내에서 동시에 진행되는 작업의 갈래 혹은 흐름의 단위
예) 크롬이라는 하나의 프로세스 안에서 youtube를 시청하며 파일을 다운로드 받고 온라인 쇼핑을 할 수 있다. 이는 하나의 프로세스 안에서 여러개의 thread가 진행 가능하기 때문이다.
- 스레드는 스레드끼리 프로세스의 자원을 공유하면서 동시 작업을 가능하게 한다.
- 이때 스레드는 프로세스의 구조에서 Stack만 할당받아 복사하고 나머지 Code, Data, Heap은 다른 스레드들과 공유한다.

스레드 스케쥴링
- 운영체제에서 다중 스레드를 관리하며, CPU를 사용할 수 있는 스레드를 선택하고, CPU를 할당하는 작업
- 스레드 스케쥴링은 프로세스 스케쥴링과 다르게 하나의 프로세스 내에서 다수의 스레드가 동작하는 형태이기 때문에, 스레드 간의 상호작용과 동기화 문제를 고려해야 함
스레드 상태 전이

- NEW : 스레드가 생성되고 아직 호출되지 않은 상태
- RUNNABLE : 스레드가 실행되기 위해 기다리는 상태
- CPU를 할당받을 수 있는 상태이며, 언제든지 실행될 수 있다.
- BLOCKED : 스레드가 특정 이벤트(입출력 요청)가 발생하여 대기하는 상태
- CPU를 할당받지 못하며, 이벤트가 발생하여 다시 RUNNABLE 상태로 전환될 때까지 대기
- TERMINATED : 스레드가 실행을 완료하고 종료된 상태
스레드 컨트롤 블록 (Thread Control Block) TCB

- TCB는 PCB안에 들어있다.
- 스레드의 상태 정보, 스레드 ID, 스레드 우선순위 등의 정보를 저장한다.
- 스레드가 생성될 때 생성되며, 스레드가 실행을 마치고 종료될 때 소멸된다.
스레드 컨텍스트 스위칭
- 멀티 스레드 환경에서 스레드 간의 실행을 전환하는 기술