일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Rim Light
- 메모리 누수
- URP로 변경
- Windows Build
- ColorGradingLutPass
- C언어
- URP
- Cell Look
- Three(Two) Tone Shading
- Cartoon Rendering
- Specular
- 프로그래밍 기초
- working set
- ASW(Application SpaceWarp)
- 벡터
- Private Bytes
- 개인 바이트
- 작업 집합
- 게임 수학
- 3d
- Toon Shader
- Cell Shader
- 가상 바이트
- OculusMotionVectorPass
- AppSW
- Virtual Byte
- VR
- Today
- Total
WinCNT
시스템 프로그래밍이란 무엇인가? 본문
게임에서의 시스템 프로그래밍
기획
컨셉 기획자 - 세계관 등등 눈에 보임, 컨셉 담당 아트와 연관이 있음
시스템 기획자 - ?? 문서는 나오지만 눈에 보...이나?
컨텐츠 기획자 - 컨셉과 시스템을 아우르는 기획자, 재미를 추구하거나 잘 팔리는 아이템을 만들거나 한다
게임에서의 시스템 프로그래머는 시스템 기획을 가지고 기반을 만드는 작업을 한다!
퀘스트는 전형적인 컨텐츠
예시
용사가 초보자의 샘에서 슬라임을 10마리 잡으면 아이템과 경험치를 얻는다는 퀘스트
위의 시점은 플레이 기획
하지만 초보자의 샘(이동 시스템), 슬라임(AI 시스템),
경험치 획득(스탯 시스템), 아이템 획득(아이템 시스템) 등등
보이지 않는 시스템에 대한 기획도 필요하다
이러한 시스템에 대한 조합으로 퀘스트, 즉 컨텐츠가 만들어진다
그래서 프로그래머는 퀘스트를 만들 수 있는 툴을 만든다
즉, 기획자와 프로그래머 둘 다 잘 해야 컨텐츠가 잘 나온다는 뜻!!
일반적인 관점에서의 시스템 프로그래밍
그럼 게임에서의 말고, 전체적인 관점에서의 시스템 프로그래밍이란 무엇일까?
일단 시스템의 사전적인 의미는
체계적인 방법이나 조직, 제도 혹은 방식을 뜻한다
운영 체제 : Operating System
컴퓨터 하드웨어 자원을 관리하는 소프트웨어
Ex) Windows 10, Mac OSX, Linux, iOS, Android 등등
시스템 프로그래밍이란 직접 하드웨어를 관리하는 것을 뜻하지는 않는다
시스템 프로그래밍이란 운영 체제를 통해서 하드웨어를 사용할 수 있도록 하는 프로그래밍을 뜻한다
제프리 리처의 Windows via C/C++의 책 또한
C/C++(어셈블리어 말고)로 Windows 운영 체제를 통해서
CPU, RAM, 파일, 디스크, 입출력, 네트워킹 등등을 관리하기 위한 내용들이 있는 것이다
운영 체제(OS), Shell, Kernel
기본적으로 커널에서 제공하는 기능 등을 시스템 콜(System Call)를 통해서 하고 있다
참고로 커널이란 커널은 운영 체제의 핵심이며, 시스템 작동을 시작하기 위해
주 메모리에 로드되는 운영 체제의 첫 번째 프로그램이다
커널과 OS의 비교
기준 | 커널 | 운영 체제(OS) |
기본 | 커널은 운영 체제의 중요한 부분입니다. | 운영 체제는 시스템 프로그램입니다. |
인터페이스 | 커널은 소프트웨어와 컴퓨터 하드웨어 간의 인터페이스입니다. | 운영 체제는 컴퓨터의 하드웨어와 사용자 간의 인터페이스입니다. |
유형 | 획일 화 된 커널과 마이크로 커널. | 단일 및 다중 프로그래밍 일괄 처리 시스템, 분산 운영 체제, 실시간 운영 체제. |
목적 | 커널 메모리 관리, 프로세스 관리, 작업 관리, 디스크 관리. | Kernel의 책임 외에도 운영 체제는 컴퓨터의 보호 및 보안을 담당합니다. |
커널(Kernel)과 쉘(Shell)
커널은 컴퓨터 운영 체제의 핵심 역할을하며 시스템의 모든 것을 제어할 수있는 컴퓨터 프로그램
(주 메모리에 로드되는 운영 체제의 첫 번째 프로그램)
셸은 운영 체제에서 제공하는 서비스에 액세스하기위한 인터페이스로 작동하는 컴퓨터 프로그램
커널과 셸의 위키피디아의 정의는 다음과 같다
Kernel
A computer program at the core of a computer's operating system and generally has complete control over everything in the system.
On most systems, the kernel is one of the first programs loaded on startup (after the bootloader).
Shell
In computing, a shell is a computer program which exposes an operating system's services to a human user or other programs.
In general, OS shells use either a command - line interface(CLI) or graphical user interface (GUI)
폴더 탐색기든 CMD든 토탈 커맨더든 유저 인터페이스만 다를 뿐 커널에서 사용되는 기반은 똑같다
작업 관리자든 리소스 모니터든 커널이 제공하는 서비스를 이용해서 유저가 사용할 수 있도록 만든 GUI이다
즉, 커널의 서비스를 이용하면 굳이 작업 관리자나 리소스 모니터를 사용하지 않아도
같은 서비스를 게임을 위한 툴 등을 만들 때 넣을 수 있다
작업 관리자 실행 = Ctrl +Shift + Esc
리소스 모니터를 실행 = resmon
svchost(서비스 호스트의 약자)
시스템 호출 - 위키백과, 우리 모두의 백과사전 (wikipedia.org)
시스템 호출 또는 시스템 콜(system call)
간단히 시스콜(syscall)은 운영 체제의 커널이 제공하는 서비스에 대해, 응용 프로그램의 요청에 따라 커널에 접근하기 위한 인터페이스이다.
보통 C나 C++과 같은 (어셈블리어와 비교했을 때의) 고급 언어로 작성된 프로그램들은 직접 시스템 호출을 사용할 수 없기 때문에, 고급 API를 통해 시스템 호출에 접근하게 하는 방법이다.
운영 체제의 구성상, 커널과 응용 프로그램은 CPU의 권한 수준(privilege levels)이나 하드웨어 접근 능력이 다르다.
커널은 CPU 시스템의 RAM/FLASH 등에 물리 주소가 일치하는 링커 구조를 가지고 특정 메모리 위치에서 동작한다.
이때 커널의 기계어 코드에서 사용하는 모든 주소는 물리 주소로 고정되어 컴파일되고 로드되어 실행된다.
따라서 커널은 부팅과정에서 전체 메모리 리소스 중에 일정 부분을 점유하여 동작하고
인터럽트 등 모든 하드웨어 접근이 가능하다.
이때 커널의 기계어 코드에서 사용하는 모든 주소는 물리 주소로 고정되어 컴파일되고 로드되어 실행된다.
따라서 커널은 부팅과정에서 전체 메모리 리소스 중에 일정 부분을 점유하여 동작하고 인터럽트 등
모든 하드웨어 접근이 가능하다.
그러나 응용 프로그램은 커널이 제공하는 자원을 사용하므로, 메모리에서 상황에 따라 다른 위치를 점유/실행한다.
응용 프로그램은 사용자 요청에 따라 실행되는 프로그램이므로 물리 주소를 확정할 수 없다.
(응용 프로그램은 가상 주소 공간이 주어지며 이는 물리 주소와 일치하지 않는다)
따라서 응용 프로그램이 작성되면 메모리 위치가 처음부터 로드될 것으로 생각하고 개발도구에서 링크된다.
보통 MMU를 통해 논리 주소를 물리 주소로 변환한다.
응용 프로그램은 CPU의 권한수준이 사용자 공간(user space)에서 동작하며 특정한 기계어 명령어 실행이 불가능하다.
이와 같은 상황에서 응용 프로그램이 파일 시스템을 사용하는 등 기타 여러 상황에서 커널에 의존해야만 한다.
응용 프로그램에서 커널의 서비스를 사용하는 방법이 시스템 호출이다.
시스템 프로그래밍의 라이브러리나 API
윈도우 라이브러리 파일 - 위키백과, 우리 모두의 백과사전 (wikipedia.org)
윈도우 라이브러리 파일이란 마이크로소프트 윈도우 운영 체제는 라이브러리(DLL)를 지원하는데,
이것들은 복사본 하나만 메모리에 올라와도 여러 프로세스에서 사용될 수 있는 코드 라이브러리이다.
DLL은 런타임 시에 사용되는 라이브러리이며, 한 번도 사용되지 않으면 메모리에 로드되지 않고
사용될 때 메모리에 로드되며, 그 이후로는 로드된 DLL에 링크하여 사용할 수 있게 된다
- KERNEL32.DLL
- 메모리 관리, 입출력 명령, 프로세스와 스레드 생성, 그리고 동기화 함수들 같은 대부분의 Win32 베이스(base) API들을 응용 프로그램에 내보낸다.
- 대부분의 것들이 (NTDLL.DLL에 의해 내보내진) 상응하는 네이티브 API를 호출함으로써 KERNEL32.DLL의 내부에 구현되어 있다.
MSVCRT.DLL, MSVCPP.DLL, CRTDLL.DLL
MSVCRT.DLL은 비주얼 C++ 버전 4.2부터 6.0까지의 마이크로소프트 비주얼 C 런타임 라이브러리(C++ 라이브러리로는 MSVCPP.DLL)이다.
이것은 이 버전의 비주얼 C++로 컴파일된 프로그램과 C와 C++ 프로그램이 요구하는 일반적인 라이브러리 함수 집합들을 제공한다.
이것들은 문자열 처리와 메모리 할당 그리고 C 스타일 입출력 호출같은 것들을 포함한다.
네이티브 API - 위키백과, 우리 모두의 백과사전 (wikipedia.org)
네이티브 API(Native API)는 윈도우 NT와 사용자 모드의 응용 프로그램에서 사용되는 API이다.
자바와 달리 C/C++로 만든 응용 프로그램처럼 바로 커널에게 직접 요청할 때 사용되는 API를 네이티브 API라고 부른다
다른 윈도우 구성 요소들이 사용되기 힘들 때 사용되며, 주로 시스템 부팅 시나 kernel32.dll 같은 윈도 API를 구현하는 용도로 쓰인다.
ntdll.dll의 엔트리 포인트는 LdrInitializeThunk이다.
대부분의 네이티브 API의 호출은 ntoskrnl.exe에서 구현되며, ntdll.dll에 의해서 사용자 모드로 노출된다.
(즉 프로그래밍 할 때 ntdll.dll의 함수 등을 사용한다는 의미)
CreateMutexA function (synchapi.h) - Win32 apps | Microsoft Docs
CreateMutexA 함수(synchapi.h)
함수 뜻 파악하기!
CreateMutex - 뮤텍스 객체를 만든다
A-ansi, w-wide(보통 패러미터에 string이 있음)
synch - 동기화 api.h - api 헤더
CreateMutexA은 뮤텍스 개체를 만들거나 오픈하는 함수(이름은 붙이거나 안 붙일 수 있음)
참고) 뮤텍스 객체란?
https://heeonii.tistory.com/14
프로세스 간 메시지를 전송하거나, 공유메모리를 통해 공유된 자원에 여러 개의 프로세스가 동시에 접근하면 Critical Section(여러 프로세스가 데이터를 공유하며 수행될 때, 각 프로세스에서 공유 데이터를 접근하는 프로그램 코드 블록) 문제가 발생할 수 있다.
이를 해결하기 위해 데이터를 한 번에 하나의 프로세스만 접근할 수 있도록 제한을 두는 동기화 방식을 취해야 한다. 동기화 도구에는 대표적으로 뮤텍스(Mutex)와 세마포어(Semaphore)가 있다.
이들은 모두 공유된 자원의 데이터를 여러 스레드/프로세스가 접근하는 것을 막는 역할을 한다.
Mutex 뮤텍스
공유된 자원의 데이터 혹은 임계영역(Critical Section) 등에
하나의 Process 혹은 Thread가 접근하는 것을 막아준다(동기화 대상이 하나)
즉, 임계구역(Critical Section)을 가진 스레드들의 실행시간(Running Time)이 서로 겹치지 않고
각각 단독으로 실행(상호배제_Mutual Exclution)되도록 하는 기술
※ 참고) 동기화 대상이 하나 이상인 방식은 Semaphore 세마포어라고 한다
커널 객체와 핸들
C는 함수라는 기능을 담당하는 부분을 사용할 수 있지만
OOP가 가능한 C++부터는 기능을 담당하는 객체를 사용할 수 있게 된다
커널에서 함수를 호출했을 때 객체의 핸들을 반환한다
Windows에서는 커널 객체를 요구하면 핸들을 받는다
커널 객체는 커널의 메모리 영역에 존재하는 객체이다
(당연히 유저 영역에 존재하지 않음)
유저는 핸들을 통해 커널 객체에 대해서 제어를 할 수 있다
즉 핸들은 놀이동산의 자유이용권 팔찌 같은 것이라고도 할 수 있다
직접 커널 객체를 이용하는 것이 아니라 핸들로 제어하며 사용이 끝나면 반납(Close)도 해야 한다
ㅁ
'게임 프로그래밍(학습 내용 정리) > 시스템 프로그래밍' 카테고리의 다른 글
Exception Filter (0) | 2022.03.22 |
---|---|
실제 핸들과 허위 핸들(Pseudo Handle) (0) | 2022.03.22 |
프로세스와 스레드 (0) | 2022.03.21 |
커널 오브젝트와 프로세스 (0) | 2022.03.14 |
커널 오브젝트 (0) | 2022.03.08 |