이론/기초 11

네트워크 - 레이턴시 및 신뢰성

레이턴시 레이턴시 원인 네트워크가 아닌 레이턴시로 입력 샘플링, 랜더링, 인풋렉 등등이 있을 수 있다. 네트워크에 해당하는 레이턴시에는 다음 지연들이 포함된다. 처리 지연 : 네트워크 주소 변환이나 암호화 => 요즘 라우터 성능이 좋아서 크게 신경쓰지 않아도.. 전송 지연 : 물리적 매체에 비트를 기록하는 시간. => 서버의 물리적 위치 조정이나, 패킷을 가능한 크게 만들어서 헤더 비중이 적게 만들어 개선할 수 있음. 큐잉 지연 : 라우터의 처리 용량보다 많은 패킷이 도착했을 때 큐잉해놓고 나중에 처리. 이때 대기열에 머무르는 시간 => 적은 수의 큰 패킷을 보내는게 유리하다. 전파 지연 : 매체를 타고 전파되는데 걸리는 시간. => 일단 물리적 거리를 가깝게 할 수 있음. 그러나 라우터등의 배치에 따라..

이론/기초 2023.09.01

게임 네트워크 토폴로지

개요 네트워크 토폴로지란 여러 컴퓨터가 네트워크상에서 연결되어 있는 모습을 말한다. 대표적으로 클라이언트 - 서버 P2P 가 있으며, 둘을 섞은 토폴로지도 존재한다. . 클라이언트 - 서버(CS) CS 토폴로지에서는 게임 인스턴스 하나를 서버로 두고 나머지 게임 인스턴스는 그 서버에 접속하는 클라이언트가 된다. 각 클라이언트는 오직 서버하고만 통신하며, 서버는 이들 모든 클라와 통신을 전담한다. 클라가 n개면 O(2n)개의 연결이 존재하게 된다. 각 클라가 초당 b바이트 데이터를 보낸다면, 초당 b*n 바이트를 수신할 수 있도록 서버의 대역폭을 확보해야 한다. 즉, 클라가 증가할수록 서버의 대역폭도 선형으로 늘어난다. 클라이언트가 받는 데이터의 양도 작게나마 늘어나긴 한다. 받아야 하는 데이터가 많아지기..

이론/기초 2023.08.27

OS - 라이브러리

라이브러리 여러 프로그램에서 자주 사용하는 함수와 데이터들을 실행이 가능한 바이너리 형태로 묶어놓은 파일을 의미한다. 다음 코드를 보자 #include int main() { printf("Hello"); return 0; } 실행 가능한 printf 함수의 바이너리는 어디에 있을까? stdio.h에 있을까? 그 안에 존재하는 것은 printf함수의 정의가 아니라 선언이다. 그럼 어디에있음? "라이브러리"에 있다. 라이브러리는 정적 라이브러리랑 동적 연결 (Dynamic link)라이브러리로 나눌 수 있다. . 정적 라이브러리(static library) static library를 만드는 상상을 해보자. 헤더에 함수를 선언하고, 적절히 정의도 해놨다. foo.h / foo.cpp 이렇게하고 컴파일 돌리..

이론/기초 2023.08.20

OS - 메모리 관리 기초

메모리 페이지의 상태 페이지의 상태는 Reserve/Commit/Free가 있음. Commit상태는 하드랑 RAM모두 포함한다. 힙 메모리를 할당받으면 해당 메모리 페이지가 Commit 상태가 되는 것. 처음에는 Free상태였다가 할당받으면 Commit 문제없지? 그러면 Reserve는 왜 필요할까? 그냥 나중에 할지도 모르니까 예약해두는거임. 이러면 다른 요청에 의해서 reserve된 페이지는 할당에서 제외시킴 . 페이지 할당 가상 메모리 시스템은 페이지 관리로 관리되기 때문에 페이지 중간부터 할당을 시작할 수 없고, 페이지 크기의 배수 단위 할당만 가능함. 그러면 메모리 할당 시작 주소는? 페이지 크기일까? => 아님, 그러면 메모리 파편화가 심해질 수 있음 그래서 더 넓은 값을 할당의 경계로 삼는다..

이론/기초 2023.08.13

OS - 쓰레드

컨텍스트 스위칭 프로세스와 마찬가지로 쓰레드도 컨텍스트 스위칭이 존재하는데, 프로세스보다는 훨씬 빠르다. 주된 이유는 캐쉬 메모리때문인데, 프로세스와 달리 쓰레드끼리는 스택영역을 제외한 메모리들을 공유하기 때문에 캐쉬 활용율이 높다. + 프로세스 전환에 비하여 일부 레지스터를 더 공유할 수 있긴 한데 이런 차이는 크지 않을 것. . 커널모드 유저모드 프로세스는 독립된 메모리 공간을 갖는데, 시스템 함수 등의 호출을 위해서 본인에게 할당받은 메모리 공간을 벗어날 필요가 있다. 이런 경우를 지원하기 위해 커널모드가 있으며, 커널이 실행되어야 하는 경우에 프로세스가 커널모드에서 돈다. 커널에 접근할 필요가 없는 경우라면 프로세스는 유저모드에서 돌고, 커널 영역으로의 접근이 차단된다. 그러나, 이런 모드 전환은..

이론/기초 2023.08.06

OS - 프로세스

프로세스 프로세스란? 프로세스는 실행 중인 프로그램을 의미한다. 프로그램을 실행하는 순간, 메모리 할당이 이뤄지고 이 공간으로 바이너리 코드가 올라간다. 이 순간부터 프로그램은 프로세스라고 불린다. . 프로세스의 구성 요소 메모리 프로세스의 메모리는 4가지 영역으로 구성된다. Data영역 : 전역변수나 static변수의 할당을 위해 존재 Stack영역 : 지역변수 할당과 함수 호출시 전달되는 인자들이 저장되는 영역. Heap영역 : 동적 할당을 위해 존재 Code 영역 : 실행파일을 구성하는 명령어들이 올라가는 영역. . 레지스터 셋(register set) 프로그램을 실행하면 CPU의 레지스터들이 해당 프로그램을 위한 데이터로 채워질탠데 이런 데이터 상태 또한 프로세스의 일부로 볼 수 있다. . 프로세..

이론/기초 2023.07.30

아스키코드 & 유니코드

문자의 표현방법 아스키코드는 1바이트임. 알파뱃+확장문자 해도 256개가 넘지 않으니까. 그런데 이러면 다른 영어가 아닌 언어들은 '곤란' 그래서 유니코드는 2바이트를 씀. 이러면 65536개 표현 가능. 문자셋에 대해 알아보자. 문자셋은 약속된 문자의 표현방법을 의미한다. SBCS, MBCS, WBCS로 나눌 수 있다. SBCS(Single Byte Character Set) : 모든 문자를 1바이트로 표현한다. 아스키코드가 대표적 WBCS(Wide Byte Character Set) : 모든 문자를 2바이트로 표현한다. 유니코드가 대표적이다. MBCS(Multi Byte Character Set) : 모든 문자를 '여러 바이트' 즉 어떤 문자는 1바이트로 어떤 문자는 2바이트로 표현하는 식이다. 이 ..

이론/기초 2023.07.23

컴퓨터 구조 기초 - 4

메모리 보통 메모리라고 하면 RAM을 생각하지만 CPU의 레지스터, 캐쉬, 하드디스크, USB등도 메모리라고 할 수 있다. . 메모리 계층 구조 일반적으로 메모리 계층을 레지스터 / L1 캐시 / L2캐시 / RAM / 기타 저장장치(HDD,SDD, 플래시 메모리) 위와 같이 구분할 수 있는데, 당연히 레지스터 접근이 가장 빠르다. 레지스터가 아닌 메모리에서 데이터를 입출력 하기 위해서는 메모리 버스를 거쳐야 한다. 그만큼 느리겠지? 메인메모리를 제외한 L1, L2캐쉬에 필요한 데이터가 존재할 확률은? 무려 90%이상! 물론 세팅마다 다르겠지만 어 그러면 그냥 캐쉬를 1테라 쓰면 안됨? ㅇㅇ 안됨. 너무 비싸고 기술적인 문제도있음 . 캐시 템퍼럴 로컬리티 (Temporal Locality) : 한 번 접..

이론/기초 2023.07.16

컴퓨터 구조 기초 - 3

스택 프레임 함수 내 선언된 변수는 스택에 할당됨. 함수 호출 과정에서 할당되는 메모리 블록(지역변수 선언 등으로 할당되는)을 가리켜 스택 프레임이라 한다. 스택프레임은 함수에 종속된다. 함수가 종료되면 스택프레임이 반환된다. . sp 레지스터 스택을 쌓기 위해서는 현재까지 저장한 데이터의 위치를 알아야겠지? 이를 기억하기 위해 CPU내에 sp(stack pointer)레지스터가 존재함. 스택 프레임이 반환되면 sp레지스터를 움직여야 하는데, 문제는 얼마나 움직여야 하는지를 모른다. 그래서 또 이를 기억하기 위해 프레임 포인터(FP)가 존재한다. . 프레임 포인터 스택프레임이 반환되면 sp를 fp위치로 맞추면 그만임. 그럼 fp값들은 어디에 보관? 함수가 호출되면 그때 스택에 fp값을 저장함. 반환될 때..

이론/기초 2023.07.09

컴퓨터 구조 기초 - 2

레지스터 크기와 명령어 16비트 컴퓨터가 있다고 가정하자. 그러면 레지스터 사이즈도 16비트인 게 좋을 것이다. 그리고 16비트의 레지스터 r0~r7이 있다고 하자. 명령어 역시 레지스터 크기와 같아야 좋으니까 16비트라고 하자. 자 그럼 16비트로 어떻게 명령어를 구성할 것인가? 명령어의 종류가 8개인 컴퓨터라고 가정하자. 명령어가 8개이니까 이 모든 명령어를 식별하기 위해서는 3비트가 필요하다. 사칙연산 만들어보기 사칙 연산을 예로 들어 보자. A = B+C 를 의미하는 명령어를 구현하고 싶다. 어떻게 해야 할까? 우선 '덧셈'이라는 명령에 해당하는 id가 있을 것이다(3비트) 그리고 B+C의 값을 저장할 레지스터가 필요하다. 대충 레지스터도 r0~r7까지 8개가 있다고 하자. 레지스터의 주소를 구분..

이론/기초 2023.07.01