본문 바로가기

전체 글

(8)
IOCP에 대해서 Overlapped IO란? Overlapped 객체를 인자로 가지고 작업을 수행하는데, 작업이 끝날 때까지 기다리지 않고 바로 리턴을 한다. 이후 이 작업이 다 끝나고 나면 이벤트나 콜백을 통해 해당 작업의 종료 여부를 알 수 있다 ( 비동기 IO ) IOCP란? IO Completion Port의 약자로 윈도우에서 작동하는 논블록 프로세스로 최소한의 스레드를 사용해서 Port와 관련된 입출력을 처리하며 Overlapped I/O가 완료되면 이를 감지해서 사용자에게 알려주는 기법이다. 위의 그림처럼 5개의 IOCP 구조체가 존재한다. IOCP내에 등록되어 있는 장치들의 작업들이 끝나거나 PostQueuedCompletionStatus가 불리게 되면 대기 스레드 큐에서 대기하고 있던 스레드들이 릴리즈 스..
소켓( socket ) 통신에 대해 소켓 통신이란? 프로토콜, IP 주소, 포트 넘버로 정의되며 떨어져 있는 두 호스트를 연결해주는 도구로, 소켓을 통해 데이터를 주고 받을 수 있다. 서버와 클라이언트 통신 과정 1. 서버가 소켓을 생성한다. 2. 소켓을 bind한다. ( bind는 소켓에 ip주소와 port를 할당하는 과정 ) 3. bind된 소켓을 listen 상태로 둔다 ( listen 상태에서는 클라이언트가 connect 요청을 보낼 때 까지 대기한다. ) 4. 클라이언트가 소켓을 생성한다 ( 이 과정은 위에 먼저 일어날 수도 있다 ) 5. 클라이언트가 connect를 호출하여 연결하고자 하는 서버에 요청을 보낸다. 6. listen하고 있던 서버 소켓이 해당 요청을 accept하고 나면 두 소켓이 연결된다. ( listen하고 있..
동기화와 락( Lock )의 종류에 대해 동기화란? 앞의 글에서 멀티 스레드를 사용할 때, 스레드는 stack영역만 독자적으로 할당받고 나머지 메모리 영역은 공유를 한다고 하였다. 그럼 heap, data영역에 있는 값에 여러 스레드가 동시에 접근을 하게 되면 어떻게 될까? 당연하게 문제가 생기는데 읽기와 쓰기가 동시에 일어날 수도 있기 때문에 원하는 대로 값들이 나오지 않고, 메모리 해제와 동시에 해당 메모리 영역을 가리키게 되면 프로그램이 crash날 가능성도 있다. 이러한 문제를 해결하기 위한 것이 동기화이다. 즉 멀티 스레드 환경에서 여러 스레드들이 같은 메모리주소나 값에 접근을 할 때, 서로 작업한 내용들을 일치시키는 것을 동기화라고 한다. 임계 영역( Critical Section )이란? 임계 영역이란 위에서 말한 여러 스레드들이 ..
멀티 스레드에 대해서 스레드란 무엇인가? 각 프로세스에 최소 하나씩 있는 실제로 프로그램을 실행하는 단위로, 독자적인 메모리 공간을 stack만 할당받고 나머지 공간은 프로세스와 공유한다 -> 프로세스의 실질적 실행 단위 프로세스는 메모리 공간으로 code, data, stack, heap 영역을 가지고 있다. 이 중 스레드는 stack 부분만 공유를 하고 있다는 것이므로, 독자적인 stack 메모리 공간을 여러 스레드들이 가질 수 있고 나머지 메모리 영역에 접근하는데 있어 충돌이 발생할 수 있다는 문제를 가지고 있다. -> 멀티 스레드의 단점 그럼 멀티 스레드란 무엇인가? 멀티 프로세스가 아닌 멀티 스레드를 주로 사용하는데 그 이유는 메모리 공간과 매우 밀접하다. 프로세스같은 경우는 프로세스들이 각자의 메모리 공간을 가지고..
심볼 파일이란? 심볼 파일은 크게 pdb, map파일들로 나타낼 수 있다. 이것들은 컴파일 과정중 마지막 단계인 링킹단계에서 튀어나오는 부산물들이다. 심볼 파일들은 바이너리 실행 시 꼭 필요하지는 않지만, 디버깅 과정에서 유용하게 사용되는 정보들을 가지고 있다. 보통 전역변수, 지역변수, 함수 이름과 entry pointer 주소, fpo data, source line 번호 등이 있다.
빌드란? 빌드란 소스코드를 빌드 과정을 통해서 실행가능한 파일인 exe로 바꾸는 과정이다. 컴파일, 인터프립터, 하이브리드의 3가지 방법의 빌드가 존재한다. 컴파일 : 소스코드 전체를 기계어로 번역함 인터프립터 : 소스코드를 한 줄씩 번역하면서 실행함 하이브리드 : 소스코드 전체를 중간코드로 번역한 뒤 가상머신에서 한 줄씩 실행함 컴파일 과정 전처리 -> 컴파일 -> 어셈블 -> 링크의 4가지 과정을 통해 exe파일을 생성한다. 전처리 : 매크로나 include같은 것들을 코드에 포함시키는 과정 컴파일 : 고수준언어를 어셈블리어(저수준 언어)로 변환하는 과정 어셈블 : 어셈블리어를 어셈블러를 통해 object file로 바꾸는 과정 링킹 : object file들을 하나로 묶어서 exe파일로 만드는 과정 컴파일 ..
스마트 포인터에 대해 RAII : Resource Acquisition Is Initialization =>"자원 획득은 초기화" 라는 의미 "메모리는 초기화 시점에 할당이 완료되어야 한다","객체의 소멸은 자원의 반납이다" 즉 객체 생성 시 할당한 메모리를 객체 소멸 시 반납해라 이것이 적용된 것이 스마트 포인터 C++에서는 3가지의 스마트 포인터를 제공한다. unique_ptr, shared_ptr, weak_ptr 1. unique_ptr unique_ptr은 가리키고 있는 객체에 더 이상의 참조를 불가하기 때문에 안정성이 높음 move를 통해서 권한을 넘겨줄 수 있지만 복사는 불가능 2. shared_ptr shared_ptr은 하나의 객체에 참조 계수를 통해서 여러 shared_ptr이 접근 가능하도록 함 하나의 s..
메모리 풀(Memory pool)에 대해서 C++에서 동적으로 메모리를 할당하는 방법은 두가지가 있다. C언어의 라이브러리에서 지원하는 malloc/free와 C++에서 지원하는 new/delete가 있다. malloc/free malloc은 동적할당을 원하는 메모리의 양을 바이트 단위로 넘기면 해당 메모리양을 할당하여 void*타입으로 리턴한다. ( void*로 리턴하기 때문에 사용을 위해선 원하는 타입으로 캐스팅이 필요 ) 생성과 동시에 초기화가 안되고 할당 후 memset이나 값 대입을 통한 초기화를 필요로 한다. new/delete new는 할당할 메모리와 타입을 생성시 입력하면 그만큼을 동적할당한다. 동적할당 시 초기화할 때의 인자 수와 타입을 보고 생성자를 자동으로 호출한다. ( 없을 시 기본 생성자 ) malloc과는 다르게 생성과 ..