본문 바로가기

전체 글

(18)
람다(lamda) 표현식을 이해해보자 람다?? 람다식은 흔히 이름없는 함수, 일회용 함수라고 부른다. 어째서 이런 식으로 부르는 걸까? 람다의 특징 람다의 가장 큰 특징은 함수명을 선언하고 사용하는 것이 아닌 식별자 없이 실행가능한 함수라는 것이다. 말 그대로 함수를 선언하지 않고 그냥 사용한다. 람다 표현식의 형태 람다식은 내용이 없으면 정말 기괴한 형태를 띄고있다. [ ] ( ) { } ( ) 각각 [캡처] (매개변수) { 함수 로직 } (호출) 이라는 뜻을 가지고 있다. 호출은 필수가 아니다! 예시 호출 O: [](int a, int b) { return a + b }(1,2) 호출 X: [](int a, int b) { return a + b } 이런식으로 사용한다. 캡처 영역 그럼 캡처 영역엔 도대체 어떤게 들어갈까? 캡처영역은 기..
스마트 포인터를 이해해보자 똑똑한 포인터 이름에서 알려주다시피 스마트포인터는 일반 포인터보다 똑똑하다. 스마트 포인터는 어떤 점을 개선하기 위해 나온 걸까? 메모리 오염 메모리오염은 할당되지 않는 메모리를 사용하는 것을 말한다. 주로 할당해제를 한 후에도 그 메모리를 가리키는 포인터를 사용할 때 일어난다. 이게 그렇게 심각한 건가?라고 생각이 들 수 있다. 오염시킨 그 공간이 비어있는 상태라면 괜찮지만, 만약 다른 객체들이 할당받았던 상태라면?? 갑자기 다른 객체의 값이 바뀔 수 있는 것이다. 이것을 방지하기 위해 똑똑한 스마트 포인터가 개발 됐다. 스마트 포인터의 구동 방식 스마트 포인터는 3가지가 존재한다. shared_pointer unique_pointer weak_pointer 각각 동작 방법은 모두 다르지만, 메모리 오..
IOCP서버의 흐름을 이해해보자 IOCP를 이용하여 비동기를 처리하는 IOCP 서버는 어떤 식으로 동작이 될까? Accept를 예로 한 번 알아보자. 낚시를 이용한 비유 이해를 쉽게 하기 위해 우리는 accept활동을 낚시에 비유할 것이다. 낚시는 3가지 과정으로 이루어져 있다. 낚싯대 세팅 후 던지기 물고기 기다리기 물고기가 잡히면 그 후 물고기 처리 이것을 서버에 적용해 보면 소켓을 Completion port에 세팅하고, 비동기 입출력 진행하기 입출력 완료 기다리기 입출력이 완료되면 해당 입출력에 맞춰 후처리 하기 IOCP는 비동기 입출력을 할 때 Overlapped 오브젝트와 소켓을 completion port에 넣을 때 key값으로 정보를 전달할 수 있다. key값을 통해 socket의 정보를 담은 객체(여기선 Session이..
IOCP에 대해 이해해보자 IOCP와 Overlapped IO IOCP(Input Output Completion port)와 Overlapped IO는 상당히 유사하다. 구동 방식은 똑같지만 완료 통지 방법이 다를뿐이다. 그러니 Overlapped IO를 먼저 알고 있다면 IOCP를 이해하는데 굉장히 도움이 될 것이다. 이 글(Overlapped를 이해해보자)을 읽고 오면 도움이 될거다!! Overlapped의 문제점 Overlapped를 이해해보자에선 간단하게 입출력 활용법만 알아보고, 서버를 만들어보진 않았다. Overlapped IO로 서버를 구성하려면 어떤걸 먼저해야할까? 비동기 Accept를 위해 소켓을 논블로킹모드로 전환시켜야한다. u_long on = 1; ::ioctlsocket(socket, FIONBIO, &o..
Overlapped IO 모델을 이해해보자 Overlapped?? overlapped는 중첩이라는 뜻을 가지고 있다. IO를 중첩한다는 것이다. 하나의 스레드 내에서 동시에 둘 이상의 영역으로 데이터를 수신해, 입출력이 중첩되는 상황을 'IO 중첩'이라고한다. IO중첩이 일어나기 위해선 입출력 함수가 논-블로킹 모드로 작동해야한다! Overlapped IO의 핵심 overlapped IO는 이런 동작 원리에 있는 것이 아닌, 이 완료된 입출력의 확인방법에 있다. 논블로킹 모드로 진행되면, 완료 결과를 따로 확인해줘야한다. 윈도우에서 말하는 Overlapped IO는 입출력만을 뜻하는 게 아닌 완료를 확인하는 방법까지 포함한 것이다. Overlapped 입출력 관련 함수 Overlapped IO 모델을 위해선 특별한 소켓을 사용할 수 있다. 소켓은..
비동기 Notification IO 모델을 이해해보자 비동기(Asynchronous)?? 비동기는 "동시에 일어나지 않음" 이라는 뜻을 가지고 있다. 반대로 동기는 "동시에 일어남" 이라는 뜻을 가지고 있다. 동기 Notification IO에서 대표적인 것은 Select 모델이 있다. 그럼 도대체 뭐가 동시에 일어난다는걸까???? 그건 바로 함수의 "완료"와 "반환"이다. 비동기는 함수 호출 후 바로 반환되기 때문에 오래걸리는 작업이더라도 기다리지 않고 바로 다음 코드를 실행 시킬 수 있다. 비동기 Notification IO 모델 그럼 도대체 비동기Notification IO 모델은 어떤걸 비동기로 처리할까? 앞에서 동기 Notification IO 모델의 대표적인 예시는 Select라고했다. Select함수는 동기함수로 IO 관찰 대상을 등록하고, I..
epoll을 이해해보자 epoll??? epoll은 select의 단점을 보완하기 위해 만들어진 I/O통지 모델이다! 그럼 select의 단점부터 알아보자 select의 단점 select 후 모든 디스크립터 대상으로 반복문을 실행한다. select함수는 호출 할 때마다 인자로 관찰대상을 전달해야한다. 우리는 두 번째 단점에 집중 해 볼 것이다. select함수는 커널단의 힘을 더해 완성되는 기능이아닌 순수함수로 동작하기 때문에 select 함수 호출에 전달된 정보는 운영체제에 등록되지 않는다. 그래서 select를 실행 할 때 마다 항상 운영체제에게 관찰대상에 대한 정보를 전달 해주어야한다. 이를 보완하기 위해 만들어진 것이 epoll이다. 운영체제에게 관찰대상에 대한 정보를 딱 한 번만 알려주고, 바뀔 때만 알려주자! epo..
스레드의 동기화를 이해해보자 스레드의 임계영역 스레드 A, B 가있다. A는 1을 100번 빼는 걸 반복하고, B는 1을 100번 더하는 걸 반복한다. 하지만 둘은 같은 데이터를 건들고 있다고 한다면, 어떤 상황이 일어날까? 차근차근 더하고 빼고 해서 0이 될 것 같지만 실상 확인해 보면 0이라는 숫자는 잘 나오지 않는다. 심지어 계산할 때마다 계산 값이 다르게 나온다. 왜 이럴까? 스레드는 num에 있는 값을 바로 바꾸지 않고, 먼저 참조한 후 계산한 값을 적용시킨다. 이렇다 보니 이러한 현상이 생긴다. 먼저 쓰레드 B가 100이라는 값을 참조한 후, 1을 더해 101을 대입했다. 하지만 동시에 값을 건드린 Thread A가 100이라는 값에서 1을 뺀 99라는 값을 대입해 버렸기 때문에 이러한 현상이 발생한다. 이렇게 둘 이상의..