Thread 01. 프로세스, 동시성, 병렬성, 비동기
1. 프로그래밍 기술을 바라보는 개발자의 관점
모든 프로그래밍 기술은, 폰 노이만 구조 이래 근본 원리와 기술 뿌리가 변하지 않았다.
모든 프로그래밍 기술은, 개발에 필요해서 등장했다.
모든 프로그래밍 기술은, 기존 개발 방법을 조금이라도 쉽고, 편리하게 하기 위해 발전된 다른 형태일 뿐이다.
그렇다면 스레드는 왜 등장했고, 어떤 부분을 개선하기 위해 등장했을까?
2. 프로세스와 실행
2.1 학습방향
스레드는 프로세스를 먼저 이해해야 한다.
스레드 학습 이전에 프로세스(≒실행) 관점에서 용어를 정리한다.
2.2 실행중인 프로세스 확인하기
- 윈도우 환경에서, Ctrl+ Shift + ESC 단축키를 눌러 Task Manager(작업 관리자)를 실행한다.
- 좌측의 [ Process ] 탭에서 현재 실행 중인 프로세스를 확인할 수 있다.
- 여러개의 프로그램이 동시에 실행중인 상태를 확인 할 수 있다.
- "여러개의 프로그램이 동시에 프로세스(실행)중이다."는 문장의 의미를 이해해야 한다.
2.3 소스코드 빌드와 실행
2.4 Process(프로세스)란 무엇인가?
2.4.1 사전적 의미
특정 목적을 수행하기 위한 작업을 모아놓은것이다.
- 경쟁사의 공세 대응 프로세스
- 선제 타격 프로세스
2.4.2 컴퓨터 분야에서 의미
빌드된 프로그램이 "실행" 중인 상태를 표현하는 단위다.
운영체제가 프로그램을 실행하기 위한 실행파일과 관련된 모든 데이터를 메모리에 적재하고 리소스(스레드, 메모리, 소스코드 등)를 차지하고 있는 상태다.
3. Process(프로세스)와 Processor(프로세서)
3.1 Processor(프로세서)
Process + or
접미사 -er, -or, -ee, -ist, -ian, -ant, -ent 모두 뜻은 '-하는 사람' 또는 '-하는 것'이란 뜻
"컴퓨터 내에서 프로그램을 수행하는 물리적인 중앙 처리 장치(CPU)" 기계를 표현하는 단위다.
3.2 싱글 코어 프로세서 & 멀티 코어 프로세서
2004년까지 컴퓨터 CPU의 코어는 1개였다.
단일 코어 성능 향상의 한계로, 코어 개수가 늘어나기 시작했다.
3. Parallel(병렬)과 Concurrency(병행)
3.1 병행(Concurrency) 처리
그렇다면, 코어가 1개일때는 프로그램 1개만 실행 할 수 있었을까?
코어가 1개일때도, 병행 처리를 통해 여러 프로그램을 동시에 처리했다.
동시성, 동시에 처리하는것처럼 보이는 것이다.
1개의 싱글 코어가 있고 4개의 작업이 있다고 가정하면, 아래 그림과 같이 운영체제(OS)가 적절히 CPU 자원을 할당하는 스케쥴링 작업을 통해 프로세스들을 계속 번갈아가면서 조금씩 처리함으로써 마치 프로그램이 동시에 실행되는 것 처럼 보이는 것이다.
그리고 이렇게 진행 중인 작업들을 A → B → C → D 로 번갈아 바꾸는 것을 Context Switching 이라고 부른다.
작업들이 스위칭 되는 과정에서, 이전 작업의 상태와 데이터를 저장하고, 다음 작업의 상태와 데이터를 불러들이는데 자원이 소모되는 문제가 발생한다.
3.2 병렬(Parallel) 처리
물리적으로 동시에 실행하는 것을 의미한다.
3.3 적절한 병행, 병렬 처리의 필요성
병행(Concurrency)의 한계
단일 코어의 성능 발전 한계(발열, 설계 등)로 멀티 코어가 필요했다.
병렬(Parallel) 처리의 한계
4코어의 CPU 환경에서, 한번에 4개의 작업이 동시에 실행할수 있다.
현재 실행이 필요한 4개는 오래 걸리는 작업, 4개는 짧은 작업이 있다고 가정한다.
이 때 문제는 병행처리 없이, 병렬 처리만으로 4개의 오래 걸리는 작업이 먼저 시작되면
나머지 가벼운 4개의 작업은 짧은 처리 시간에도 불구하고 실행중인 작업 완료를 기다려야 한다.
적절한 병행, 병렬 처리의 필요성
이러한 비효율적인 면을 극복하기 위해 작업을 아주 잘게 나눠 번갈아 가면서 처리하는 동시성과 병렬성을 적절히 동작되어야 한다.
4. 동기(Synchronous) & 비동기(Asynchronous)
4.1 동기(Synchronous) 프로그래밍
클라우드 서비스 및 데이터 관점에서 동기(同期)화는 "같은 데이터"를 맞추는 것이다.
실행(프로세스) 관점에서 동기화는 "실행 흐름"을 맞추는 것이다.
여러 작업의 실행 흐름을 맞춰 순서대로 동작하는 것이다.
4.2 비동기(Asynchronous) 프로그래밍
여러 작업의 실행이 독립적으로 동시에 동작하도록 개발하는 모든 방법론
예) 멀티스레딩, 멀티프로세싱, Non-block I/O