프로그램과 프로세스
- 우리가 흔히 말하는 프로그램이란 컴퓨터에서 실행되는 명령어의 모음이 들어 있는 데이터를 말하며 크게 코드(code)와 데이터(data)로 구성되어 있다.
- 우리가 프로그램을 클릭해서 실행을 시키고 메모리에 올라가고 프로그램이 활동을 시작하면 이를 프로세스(Process)라고 한다.
- 프로그램은 디스크 같은 저장소에 있으며 프로세스는 RAM 메모리에 있다.
- 각 프로세스는 독립된 메모리 공간을 가지기 때문에 서로의 메모리 공간을 읽고 쓸 수 없다.
스레드
스레드(Thread)는 프로세스(Process)에서 실행되는 실행의 단위이다. 이러한 스레드(Thread)가 두 개 이상이 있는 경우를 멀티 스레드(Multi Thread)라고 한다.
스레드와 프로세스의 차이
- 스레드는 한 프로세스 안에 최소 한 개 이상이 존재한다.
- 한 프로세스 안에 있는 스레드는 프로세스 안에 있는 메모리를 공유한다.
- 스레드는 각자의 스택을 가지고 있다. (로컬 변수는 스레드마다 각자 가지고 있다.)
- 스레드는 프로세스에 비해 생성 OverHead가 적다.
- 데이터를 공유하기 때문에 캐시미스가 적다.
- 스레드는 프로세스에 비해 통신이 간단하다
컨텍스트 스위치(Context Switch)
컨텍스트 스위치 우리말로 문맥교환인 이 용어의 뜻은 스레드가 실행을 하다가 일정 시간(타임 슬라이스)이 지나면 다른 스레드를 선택하며 이 과정에서 기존 스레드의 상태(호출 스택)을 *PCB(Process Control Block)에 저장하고 선택한 스레드의 상태(호출 스택)를 복원하는 과정을 말한다. 이러한 컨텍스트 스위칭은 Windows의 Scheduler가 알아서 진행한다. (x86 CPU에 는 스레드 전환 명령어가 있다)
컨텍스트 스위치의 과정 자체도 연산이 적지 않게 들며 컨텍스트 스위칭 중에는 CPU가 명령어를 실행하지 못하기 때문에 주의가 필요하다. 또한 컨텍스트 스위치의 전환 단위는 기계어 이다. 기계어 명령을 실행 중에는 컨텍스트 스위치가 일어나지 않는다.
* PCB: 운영체제가 프로세스에 대한 정보를 저장하는 장소
CPU개수와 스레드개수의 관계
외부적인 요인을 제외하고 CPU 개수와 스레드 개수가 동일하거나 적다면 컨텍스트 스위치는 일어나지 않는다. 하지만 반대로 CPU개수보다 스레드 개수가 많다면 컨텍스트 스위치는 일어난다.
다만 여기서 말하는 스레드의 개수는 실행 중(Runnable)상태의 스레드 개수를 말하는 것으로 실제 스레드가 CPU 개수보다 많아도 실행 중(Runnable)상태의 스레드가 CPU와 같거나 적다면 문제가 생기지 않는다. 대부분 운영체제에서 CPU 개수보다 프로세스의 개수가 많지만 성능에 문제가 없는 이유가 이 때문이다.
용어 정리
원자성(Atomicity): 변수를 건드리는 동안에 다른 스레드가 절대 건드리지 못해야 한다.
일관성(Consistency): 변수는 항상 일관성 있는 상태를 유지할 수 있다.
동기화(Synchronize): 이러한 원자성과 일관성을 유지하기 위한 조치를 동기화 라고 하며 대표적으로 임계영역, 뮤텍스(상호 배제), Lock(락) 이 존재한다.
인용
Book: 게임서버 프로그래밍 교과서(배현직)
'게임서버(Game Server)' 카테고리의 다른 글
[게임서버] OSI 7계층 및 3-way, 4-way (0) | 2020.08.19 |
---|---|
[게임서버] Socket pool와 DisconnectEx-IOCP (0) | 2020.05.29 |
[게임서버] AcceptEx와 ConnectEx-IOCP (1) | 2020.05.14 |
[게임서버] AcceptEx와 ConnectEx (0) | 2020.05.13 |
[게임서버] 유니티(C#)에서 Pragma pack 사용법 (0) | 2020.04.12 |