일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Three(Two) Tone Shading
- VR
- Cartoon Rendering
- 프로그래밍 기초
- Cell Shader
- Specular
- ColorGradingLutPass
- 메모리 누수
- ASW(Application SpaceWarp)
- 작업 집합
- AppSW
- 3d
- Virtual Byte
- OculusMotionVectorPass
- 개인 바이트
- working set
- 가상 바이트
- URP로 변경
- URP
- C언어
- Windows Build
- 벡터
- 게임 수학
- Toon Shader
- Cell Look
- Private Bytes
- Rim Light
- Today
- Total
WinCNT
프로세스와 스레드 본문
1. 프로세스
프로세스는 프로그램의 실행 단위이다
.exe("실행 가능한"이라는 포맷) 파일을 실행시키면 일반적으로는 하나의 프로세스가 생성된다
참고로 Process Exploer(작업 관리자의 강화판)를 통해 프로세스의 다양한 정보를 볼 수 있다
주제에서 벗어나지만 Process Exploer와 같이 특정 정보를 확인할 수 있는 다양한 툴이 존재한다.
디버그 모드로 실행시킨 프로그램의 디버그 정보를 실행 시점부터 캐치하는 툴인 DebugView,
DLL들의 종속성을 볼 수 있는 Dependency Walker 등이 그 예
2. 스레드
스레드는 프로세스 내부의 실행 단위(하부 단위)이다
프로세스 내부의 스레드들은 스택 메모리(전역 변수 같은 것들) 이외의 것들을 공유한다
스레드는 다음과 장단점이 있다
(장점의 대가로 단점을 얻었다는 느낌이다)
스레드의 장점
- 생성과 속도가 빠르다
- 적은 메모리를 점유한다
- 정보 교환이 쉽고 Context Switcing 부하가 적다
스레드의 단점
- 자원 선점 문제를 신경써야 한다
- 동기화 문제를 신경써야 한다
참고로 디버그 모드의 화살표는 EIP(혹은 프로세스 카운터)를 나타내는데, 그 화살표도 스레드라고 보면 된다
즉, 멀티 스레드 프로그램은 여러 개의 화살표가 처리되고 있다는 뜻이기도 하다
예를 들어 무한 루프를 도는 함수를 2개 만들고 스레드를 나눠서 실행시키면 2개의 무한 루프가 각각 처리된다
(하나의 스레드인 경우는 하나의 무한 루프를 처리하느라 다른 처리로 넘어가지 못 함)
반대로 스레드를 동시에 실행되기 때문에 스레드 간의 경쟁이 발생하기도 한다
예를 들어 1~100,000을 루프하며 1씩 더하는 함수를 2개의 스레드로 실행했을 경우,
전역 변수의 결과 값이 200,000이 되지 않는 현상이 발생한다(보통 200,000보다 적게 나온다)
그 가장 큰 원인으로는 스레드 간의 경쟁이 일어나기 때문
1씩 더하는 처리는 사실 어셈블리로 보면 다음과 같다
전역 변수의 값을 레지스터에 저장 -> 레지스터에 저장된 값을 +1 -> 레지스터의 값을 다시 전역 변수에 저장
만약 스레스1, 스레스2에서 전역 변수를 동시에 가져왔는데,
스레스1의 처리가 빨라서 계속해서 값을 갱신했다고 해도, 스레스2의 처리가 느리면
스레스1의 갱신된 값이 다시 스레스2의 갱신 값으로 덮어쓰기가 되는 현상이 발생하기도 한다
참고로 값이 늘어나는 현상보다 줄어드는 현상이 많이 일어나는데,
그 이유는 전역 변수의 값을 가져오고 다시 저장하는 처리(메모리)보다
레지스터에서의 처리(CPU)가 어마무지하게 빠르기 때문
그래서 스레드에서는 동기화가 매우 중요하다
동기화 중에 가장 쉬운 것은 크리티컬 섹션이 있다(DB의 Lock같은 것)
물론 매우 어렵다...그럼에도 스레드를 쓰는 이유는 컴퓨터의 성능을 최대한으로 발휘할 수 있기 때문
하나의 프로그램이 여러 프로세스를 가지는 방향으로 발전하지 않은 이유는 다음과 같다
프로세스는 서로의 메모리가 별도로 관리(가상 메모리)되므로, 생성 시에 필요한 정보를 모두 복사해줘야 한다.
그래서 생성 및 제거가 느리고, 프로세스간 정보 교환이 어려우며, 상당량의 메모리를 중복해서 지녀야 한다
또한 그렇기 때문에 숫자가 늘어날수록 Context Switching의 부담이 상당히 커진다
따라서 프로세스보다 더 작은 실행 단위 개념이 만들어지게 되는데 이것이 스레드이다
by 나무위키
태초의 CPU는 하나의 코어(머리)를 가지고 있었다(MS-DOS 등등)
즉, 멀티 태스킹을 할 수 없던 시절도 있었다
하지만 싱글 코어에서도 윈도우가 돌아가기도 했는데
그 때의 멀티 태스킹은 하나의 프로세스를 시간만으로 처리하고,
그 정보를 저장하고 다른 프로세스를 처리하는 방식으로 구현했다
지금의 멀티 태스킹의 방식은 비슷하지만, CPU의 물리적인 코어도 늘었을 뿐만 아니라
CPU를 논리적으로도 분할해서 사용하고 있다
(무한 루프를 도는 프로세스가 있어도 하나의 논리적인 CPU 이용률만 올라가는 것도 같은 이유)
3. Context Switching(컨텍스트 스위칭)
하나의 프로세스가 CPU를 사용 중인 상태에서 다른 프로세스가 CPU를 사용하도록 하기 위해, 이전의 프로세스의 상태(문맥)를 보관하고 새로운 프로세스의 상태를 적재하는 작업을 말한다(by 위키백과)
키워드는 멀티태스킹, PCB(Process Control Block)
참고로 인간의 뇌는 복잡하기 때문에 컨텍스트 스위칭이 느리지만 CPU는 컨텍스트 스위칭이 매우 빠르다고 보면 된다
(예를 들어 프로그래밍을 하다가 갑자기 그림을 하라고 하면 전환에 시간이 걸리는 등등)
4. 스레드와 프로세스의 차이점
프로세스: 각각의 은행 지점
스레드: 은행 지점 하나에 속한 고객 창구 여러 개
나무위키의 예시가 재미있어서 가져옴
포장 일을 한다고 했을 때,
멀티스레드는 블리치의 노이토라 지르가처럼 팔을 더 돋아나게해서 일처리하는 방식이며
멀티프로세스는 나루토처럼 그림자 분신술을 쓰는 방식이라 할 수 있다
작업장의 크기가 한정되어 있다면 부담이 적은 노이토라의 방식이 효율적이라고 할 수 있다
하지만 따로생각하고 따로일하는 그림자분신과 달리 단순히 팔만 늘리고 뇌는 1개인 노이토라는
팔에 대한 작업분배를 헷갈린다는 문제가 생길 여지가 있다(병목현상, 데드락 등)
즉, 많아진 팔을 적재적소에 놀지않고 부지런히 분배하려면 본인의 두뇌도 좋아야 한다라는 제반조건이 생긴다
SSS
'게임 프로그래밍(학습 내용 정리) > C' 카테고리의 다른 글
함수 호출 규약(Calling Convention) (0) | 2022.04.25 |
---|---|
C언어 - 연산자와 수식 (0) | 2021.10.07 |
C언어 - 데이터 타입(자료형)과 변수 (0) | 2021.10.06 |