CPU : 요리사
RAM(MEMORY) : 작업대
프로세스와 스레드
- 운영체제(OS, Operating System)에서 배우는 개념
비동기
- CS 개념이라기보단 개발하다보면 많이 접하는 개념
인스턴스
- 설계된 것을 바탕으로 구현된 구체적인 실체
- 붕어빵 틀(클래스), 만들어진 붕어빵(인스턴스)
시스템자원
- CPU 시간
- 실행되기 위해 필요한 독립된 메모리 영역
문맥 교환(Context Switching)
- CPU는 한번에 하나의 프로세스만 처리할 수 있음
- 여러 프로세스를 처리해야 하는 상황에서는 돌아가면서 여러 프로세스 작업을 처리
- 이 과정을이 Context Switching
- 동작 중인 프로세스가 대기를 하면서 해당 프로세스의 상태(Context)를 프로세스 제어 블록(PCB)에 보관하고,
- 대기하고 있던 다음 순서의 프로세스가 동작하면서 이전에 보관했던 프로세스의 상태를 복구하는 작업
프로세스 제어 블록(PCB, Process Control Block)
- 특정 프로세스에 대한 중요한 정보를 저장하고 있는 커널 내의 자료구조
- 프로세스는 CPU를 할당받아 작업을 처리하다가 프로세스 전환이 발생하면 진행하던 작업을 저장하고 CPU를 반환해야 함
- 이때 작업의 진행 상황을 모두 PCB에 저장
- 그리고 다시 CPU를 할당받게 되면 PCB에 저장되었던 내용을 불러와 종료되었던 시점부터 다시 작업을 수행
PCB에 저장되는 정보
- 프로세스 식별자(Process ID, PID) : 프로세스 식별 번호
- 프로세스 상태 : new, ready, running, waiting, terminated 등의 상태를 저장
- 프로그램 카운터(Program Counter, PC) : 프로세스가 다음에 실행할 명령어의 주소를 가리킨다.
- CPU 레지스터
- CPU 스케줄링 정보 : 프로세스의 우선순위, 스케줄 큐에 대한 포인터 등
- 메모리 관리 정보 : 페이지 테이블 또는 세그먼트 테이블 등과 같은 정보를 포함한다.
- 입출력 상태 정보 : 프로세스에 할당된 입출력 장치들과 열린 파일 목록
- 어카운팅 정보 : 사용된 CPU 시간, 시간 제한, 계정 번호 등
Thread-safe
- 멀티스레드 환경에서 여러 스레드가 동시에 사용되어도 안전하다는 것
- 즉, 여러 스레드가 프로세스의 공유 자원(하나의 객체 및 변수)에 접근할 때,
- 공유 자원의 무결성을 보장하는 것( = 자원 동기화가 잘 되지 않는 이슈 없이 의도한 대로 동작하는 것)
function cureDisease(human, medicine) // 인자로 받은 medicine으로 human을 치료한다.
function getMedicine() // 치료에 필요한 medicine을 리턴한다.
// 동기
const human = new Human()
const medicine = getMedicine()
cureDisease(human, medicine)
// 비동기
const human = new Human()
console.log('human 병 걸림')
getMedicine({
params: {},
success: function (medicine) {
cureDisease(human, medicine)
}
})
console.log('human 병 치료됨')
$.ajax()
정리
프로세스란?
- 메모리에 적재되어 실행되고 있는 프로그램의 인스턴스
스레드란?
- 프로세스 내에서 프로세스의 자원을 이용하는 여러 실행 흐름의 단위
멀티 프로세스란?
- 하나의 프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 하나의 작업을 처리하도록 하는 것
멀티 스레드란?
- 하나의 프로그램을 여러 개의 스레드로 구성하고 각 스레드가 하나의 작업을 처리하도록 하는 것
멀티 프로세스 vs 멀티 스레드, 언제 뭘 사용해야 하는가?
- 이 두 가지는 동시에 여러 작업을 수행한다는 점에서 같지만 적용해야 하는 시스템에 따라 적합/부적합이 구분된다.
- 멀티 스레드는 멀티 프로세스보다 적은 메모리 공간을 차지하고 Context Switching이 빠르다는 장점이 있지만, 오류로 인해 하나의 스레드가 종료되면 전체 스레드가 종료될 수 있다는 점과 동기화 문제를 가지고 있다.
- 반면, 멀티 프로세스 방식은 하나의 프로세스가 죽더라도 다른 프로세스에는 영향을 끼치지 않고 정상적으로 수행된다는 장점이 있지만, 멀티 스레드보다 많은 메모리 공간과 CPU 시간을 차지하고 Context Switching에 많은 비용이 든다는 단점이 존재한다.
- 따라서 대상 시스템의 특징에 따라 오류가 나서 프로세스가 죽었을 때 크리티컬한 이슈가 발생하는지, Context Switching이 발생 빈도가 빈번한지 등을 따져 잘 선택해야 한다.