본문 바로가기

컴퓨터61

Modern Effective C++ item 20 : 댕글링 포인터엔 weak_ptr 댕글링 체크엔 std::weak_ptrweak_ptr은 shared_ptr과는 달리 참조 횟수에 영향을 받지 않는 스마트 포인터이다. shared_ptr에서 고민했던 내용들을 생각해보자. 어떤 포인터가 주소를 가져오는데, 참조 횟수에 영향을 미치지 않는다면, 공유 자원의 일관성을 유지하기 위해서 실제 포인터가 할 수 있는 기능들을 대부분 포기해야할 것이다. 실제로 이 포인터는 역참조가 안되고, nullptr체크도 안된다. 게다가 참조 카운터를 고려안하므로 댕글링상태에 빠지기도 쉬울 것이다.(후후..) 스스로는 뭔가 제대로된 역할을 하기 힘든 포인터이다. 이런걸 smart하다고 말하기 어려울 수 있지만, shared_ptr과 함께 쓰일때 그 진정한 스마트함을을 갖출 수 있다. 결론부터 말하자면 이 포인터는.. 2015. 4. 14.
Modern Effective C++ item 19 : 공유자원은 std::shared_ptr 공유하는 자원을 사용할 때 std::shared_ptrstd::unique_ptr은 사용권을 양도하는 식으로 자원을 관리했다. 하지만 실제로 우리가 할당된 자원(포인터)을 사용할 때 unique한 방식보다는 여러 곳에서 그 자원을 공유하는 방식으로 사용하게 된다. 하지만 처음 할당한 자원을 여기저기에서 참조하고 있으면 dangling 포인터와 같은 자원관리 문제가 발생하기 쉽다. Java에는 Garbage Collection이라는 자동 자원관리 방식을 지원해서 공유된 자원에 유저가 신경쓸 필요없이 편하게 프로그래밍이 가능하다. 대신 유저가 자원이 해제되는 시점에 대해서 알기 어렵다는 단점이 있다. C++ 11부터는 shared_ptr을 사용하여 두가지 목표(자동 자원관리, 예측 가능한 해제시점)를 모두 .. 2015. 4. 14.
패킷 여행 in TCP/IP 네트워크 스택 패킷 여행지금까지 네트워크 서버를 만드는 법을 열심히 설명했지만, 실제 컴퓨터 내부적으로 데이터가 어떻게 전송되고 수신되는지는 이야기하지 않았다. 우리가 WSASend나 WSARecv라고 별 생각없이 코딩을 치고 빌드해서 프로그램을 실행하면, 컴퓨터는 그 작업을 수행하기위해서 수많은 작업을 수행한다. 송/수신시 데이터는 추상적으로 구분된 여러 네트워크 레이어를 거쳐 정해진 형식을 갖춰가면서 네트워크 process를 지나간다. 이 레이어들은 크게 어플리케이션에서 관리하는 유저 영역, 그리고 운영체제가 다루는 File, Socket, TCP/IP, 이더넷의 커널 영역, 마지막으로 네트워크 디바이스인 NIC(Network Interface Card, LAN카드)로 구분할 수 있다. 이 과정을 상세히 알아보면서.. 2015. 4. 12.
PAGE_LOCKING PAGE_LOCKING완벽한 이벤트 통지모델처럼 보이는 IOCP에도 문제는 있다. 그중 하나가 바로 이번에 다룰 PAGE_LOCKING 문제이다.PAGE_LOCKING의 원인 WSARecv/Send를 사용할때 우리가 직접 비동기 프로세서인 커널이 사용할 버퍼(WSABuf)를 할당하여 인자로 넘겨준다. 사용자인 우리는 가상메모리 수준에서만 메모리를 활용하면 되지만, 커널인 운영체제의 입장에서는 하드웨어 수준 작업을(커널 버퍼를 거치지 않고 직접 버퍼에 매핑시키는 경우에만 발생한다는 이야기도 있다) 수행하고 있기 때문에 분명한 물리 메모리 영역을 지속적으로 다룰 수 있어야한다. 일반적인 가상메모리 영역은 물리 메모리 상황에 따라서 Page 전환이 발생하여 실제 물리메모리 역역에서 배제되거나 이동될 수 있다... 2015. 4. 12.