본문 바로가기

전체 글6

시간 관련 함수와 C++11 <chrono> 컴퓨터의 시간 측정 방법성능을 측정하거나 게임 프레임을 맞추는 등 시간과 관련된 기능을 추가해야 할 때가 있다. 다만 언어적 차원에서 시간 관련 함수를 제공하기는 힘들다. OS나 CPU자체에서 제공하는 기능에 의존할 수밖에 없다. (OS도 코드이기 때문에 하드웨어의 기능을 이용하여 사용하는 것뿐이다) 실제로 chrono 라이브러리도 내부적으로는 OS에서 제공하는 함수를 랩핑하고 있다. chrono 라이브러리에 관련한 글을 쓰는 김에 주로 사용하는 시간 관련 함수들을 정리해 보려 한다.컴퓨터의 시간 측정 방법에 대해 알아보려면 우선 CPU의 동작에 대해서 알아야 한다. CPU는 쿨럭의 주기에 맞춰 명령어가 실행되면서 작동된다. 쿨럭속도는 ㎐로 1초에 n번 반복되면 n㎐라고 한다. 평균 쿨럭 3.7G㎐ 라면.. 2024. 10. 31.
C++11 <random> 기존의 난수 생성#include "pch.h"#include int main(){ ::setlocale(LC_ALL, "kor"); time_t t = ::time(NULL); ::srand(t); ::wcout  기존 C언어에서 0부터 99 사이의 난수를 구하는 방법이다. srand()로 시드값을 설정해서 시드값을 기반으로 난수를 생성한다. 위 실행 결과를 보면 알다시피 같은 시드값으로 구한 난수는 모두 동일하다. 즉, 진짜 난수가 아니고 난수처럼 보이는 것이다. MSDN에서도 rand()는 의사 난수를 생성하며 사용을 권장하고 있다.또한 rand 함수의 결괏값을 나머지 연산을 통해 난수를 구하기 때문에 확률은 달라지게 된다. MSDN에 따르면 rand 함수의 범위는 0~32767이다. 여기서 23이.. 2024. 10. 30.
소켓 통신과 IOCP 네트워크 라이브러리 TCP 소켓 통신 소켓 모드소켓에는 소켓함수 호출 시의 작동에 따라 두 가지로 나뉜다. 블로킹 소켓은 함수가 완료될 조건이 아니라면 조건을 충족할 때까지 스레드는 Sleep 하게 되고, 넌블로킹 소켓은 조건을 충족하지 못했더라도 함수는 반환되며 뒤의 작업을 이어서 실행할 수 있게 된다. 이때, 반환된 함수의 리턴값이 WSAEWOULDBLOCK이면 조건을 충족하지 못한 경우이다. ioctlsocket 함수로 소켓 모드를 변경할 수 있다.예로 들어 accpet 함수를 블로킹 소켓으로 실행을 할 경우, backlog queue가 비어 있다면 스레드는 대기상태가 된고, 새로운 호스트가 connect를 하지 않는 이상 accept 함수에서 빠져나오지 못하게 된다. ioctlsocket 함수를 이용하여 논브로킹 소.. 2024. 10. 27.
메모리와 Object Pool 메모리 32bit64bit널 포인터 할당 파티션0x00000000~0x0000FFFF0x00000000'00000000~0x00000000'0000FFFF유저 모드0x00010000~0x7FFEFFFF0x00000000'00010000~0x000006FB'FFFEFFFF64Bytes 접근 금지0x7FFF0000~0x7FFFFFFF0x000006FB'FFFF0000~0x000006FB'FFFFFFFF커널 모드0x80000000~0xFFFFFFFF0x000006FC'00000000~0xFFFFFFFF'FFFFFFFF 널 포인터 할당 파티션 : nullptr 접근 시, 메모리 접근 위반을 일으키기 위한 공간유저 모드 파티션 : 프로세스의 코드들이 로드되는 파티션 64Bytes 접근 금지 파티션 : 유저영역과 .. 2024. 10. 17.
네트워크 통신과 Serializing Buffer 데이터의 전달 과정L7단에서의 전달할 데이터를 Message라고 한다. 추가로 TCP헤더( 호스트 내의 프로세스를 특정하는 prot)가 추가된 Segment와 IP헤더(실질적인 전송 경로를 결정하게 되는 ip)가 추가된 Packet, Ether헤더(물리적인 주소인 Mac Address)와 Trailer가 붙은 Frame이 있다. 일반적으로 이러한 데이터를 통틀어서 패킷이라고 부르긴 한다.송신 측에서 데이터 전송을 위해 send를 할 때, 해당 데이터는 캡슐화 과정을 거쳐 치고 수신 측에서는 역캡슐화를 통해 최종 목적지인 수신 측 응용프로그램에 도달하게 된다. L2  스위치호스트에서 패킷을 전송하면 캡슐화를 통해 L2스위치(허브)에 도달하게 된다. 허브에는 따로 주소가 없고, 기본적으로 더미허브와 스위치허.. 2024. 10. 15.
TCP의 작동과 Ring Buffer TCP의 작동L4버퍼의 소켓당 버퍼의 유한하다. 따라서 수신 측은 송신 측에게 헤더의 Window(2Bytes)를 이용하여 버퍼의 여유공간을 알려준다. 이를 윈도우사이즈라고 한다. 일반적으로 송신 측은 윈도우사이즈를 이용해서 수신 측의 ACK가 도달하지 않더라도 수신 측 버퍼의 여유공간을 생각해서 송신하는 슬라이딩윈도우방식을 사용한다.Window Size는 2Bytes이기에 65535라는 최댓값을 가지고 있다. 그러나 이 값은 빨라진 인터넷 속도와 더불어 커져가는 데이터크기에 적합하지 않다. 따라서 윈도우스케일이라는 개념이 도입됐다. 3-way-handshake시의 패킷 캡처를 보면 TCP옵션으로 윈도우 스케일이 보인다.윈도우 스케일이 8이면, 2^8인 256이 윈도우사이즈에 곱해짐으로써 총 윈도우 사이.. 2024. 10. 14.