배경
기기의 발전으로 현재 일반인도 좋은 성능의 컴퓨터를 보급받아 사용하고 있다. 그뿐만 아니라, 게임 산업에서도 대규모의
인원을 감당하여 원활한 게임 플레이 환경을 조성하게 될 수 있다.
그렇기 때문에 개발자는 프로그래밍에 관해 기기의 성능을 최대한으로 활용할 수 있는 방식으로 수행해야할 필요가 있다.
핵심 키워드는 바로 동시성(Concurrency)이다.
동시성의 의미는 아주 간단하다. 서로 다른 두 행위(프로세스)를 동시에 수행하는 것을 뜻한다.
예를 들어,
네트워크를 통해 게임을 다운받는다고 가정해보자, 우리는 파일이 다운받는 동안에도,
유튜브와 같은 사이트를 통해 스트리밍 시청이 가능하다. 그리고 다운로드가 얼만큼 진행됐는지 Progress Bar를 통해
피드백(Feedback)을 동일한 시점에 받을 수 있다.
마찬가지로 서버의 경우, 유저와의 Connection을 생성하는 작업과 동시에, 기존에 연결을 유지하고 있는 사용자와의 상호작용을 수행한다. 이렇듯, 서버 프로그래밍에서도 동시성은 매우 중요한 요소라고 볼 수 있다.
우리가 컴퓨터를 동작시키기 위해 필요한 운영체제(Operating System)도 이러한 동시성을 제공하는 중요한 요소이다.
하드웨어(HW) 관점의 동시성
최근에 등장하는 대부분의 HW들은 멀티프로세서를 지원한다.
우리가 흔히 프로세서(Processor)라고 불리는 CPU 칩을 여러 개 사용하며,
각 CPU 칩에는 물리적 코어(Core)라고 불리는 "명령어를 처리하기 위한 독립적인 유닛"을 여러 개 포함하고 있다.
이 물리적 코어 하나 당, 하나의 프로세스를 처리할 수 있다.
이 환경은 우리가 컴퓨터로 서로 다른 프로세스(혹은 동일한 프로세스 내의 서로 다른 동작)을 동시에 실행시킬 수 있는
환경을 제공한다.
코어와 하이퍼스레딩
보통 하나의 코어당, 하나의 논리적 수행 단위( = 동시 처리 가능한 명령어 수)를 가지지만,
하이퍼스레딩(SMT, Simultaneous MultiThreading) 기술 덕분에 하나의 코어 당, 동시에 수행할 수 있는 여러 개의 논리적 수행 단위을 가진다. 이 수행 단위를 Hardware Thread라고 일컫는다.
예를 들어, 내가 사용하고 있는 노트북은 6코어 12스레드의 스펙을 가진다. 이는 하나의 코어당 2개의 Hardware Thread를 가진다는 것이다. ( 6코어 X 2 = 12 스레드)
SW 관점의 동시성
현대 OS는 "SW Threading"을 지원한다.
즉, 하나의 프로그램으로 여러 개의 기능을 동시에 처리할 수 있다는 것이다. 게임만 하더라도, 기본적인 게임 로직 외에도 채팅 등의 부가적인 기능들도 제공한다. 운영체제는 이 여러 기능들의 처리 과정을 관리한다.
이렇듯, 하나의 SW 프로세스 안의 독립적인 실행(= 기능) 단위를 Software Thread라고 하며, 멀티스레드 프로그래밍의
스레드는 이 Software Thread를 의미한다. 이 Software Thread의 경우, Hardware Thread와 다르게 항상 동작하는 것이 아니라, 상황에 따라 Run, Stop, Wait 등의 다양한 상태를 가진다. 그 덕분에 Harware Thread보다 더 많은 갯수를 생성해
프로세스를 처리할 수 있다.
정보 탐색을 위해 블로그 글을 보면 Hardware Thread와 Software Thread를 구분 짓지 않고 그냥 스레드라고 표현하기 때문에, 문맥에 따라 이 둘을 구분 짓는 능력이 필요하다. 아래 그림을 보면 좀 더 쉽게 이해할 수 있을 것이다.

'Server' 카테고리의 다른 글
| [Concurrency] Cache 구조 도식화 (1) | 2024.12.19 |
|---|---|
| [Concurrency] 스레드 개요 (0) | 2024.07.11 |
| [Web 서버 기초] ASP.Net Core - Middleware Pipeline (0) | 2024.06.12 |
| [Web 서버 기초] Web API Framework와 ASP.Net Core (0) | 2024.05.31 |
| [Web 서버 기초] Web API는 어떻게 동작하는가? (Feat. CRUD) (1) | 2024.05.29 |