본문 바로가기

TIL

TIL#33(명예의 전당(1), Select 모델, IOCP)

오늘 한일
  • 명예의 전당(1)

문제 풀이

입력 받은 score만큼 for문을 이용해 반복하엿고 arr 배열에 스코어를 넣은 후 내림차순으로 정렬 한후 앞에서 부터 k번째 까지 hall_of_fame에 넣어 주었고 hall_of_fame 배열의  최솟값을 answer에 push해주었다.

다른 사람의 풀이

reduce를 이용해 간단하고 가독성있게 구현하였다.

  • Select 모델

select() 함수가 핵심인 I/O 모델로 소켓 함수 호출이 성공할 시점을 미리 알 수 있다.

  • 소켓(blocking socket) : 소켓 함수 호출 시 조건이 만족되지 않아 블로킹되는 상황을 막을 수 있다.
  • 넌블로킹 소켓(nonblocking socket) : 소켓 함수 호출 시 조건이 만족되지 않아 나중에 다시 호출해야하는 상황을 막을 수 있다.

아래 그림은 Select 모델의 동작 원리를 보여준다. Select 모델을 사용하려면 소켓 셋(socket set) 3개를 준비해야 한다. 소켓 셋은 소켓 디스크립터의 집합을 의미하며, 호출한 함수의 종류에 따라 소켓을 적당한 셋에 넣어두어야 한다. 예를 들면 어떤 소켓에 대해 recv() 함수를 호출하고 싶다면 읽기 셋에 넣고, send() 함수를 호출하고 싶다면 쓰기 셋에 넣으면 된다.

  • IOCP

윈도우즈에서 제공하는 I/O모델 중 최고의 성능

Completion Port객체는 Overlapped I/O에서 쓰레드 풀링과 Queue라는 메커니즘을 동시에 접목.

  • 쓰레드 풀링 : 여러개의 쓰레드를 대기상태로 미리 생성해 놓은 것을 쓰레드 풀이라고 하고 이 쓰레드 풀에 대기중인 쓰레드들 중에 현재 필요한 만큼 꺼내어 실행 상태로 바꾸어서 사용하고 다 사용한 쓰레드는 파괴하지 않고 다시 대기 상태로 바꾸어 쓰레드 풀에 넣어주는 일련의 과정을 쓰레드 풀링이라고 한다.
  • 쓰레드풀링을 사용하면 실행 상태의 쓰레드를 상황에 맞춰 조절하므로 잦은 컨텍스트 스위칭을 피할 수 있다.

Select 모델에서 select함수를 호출할 때마다 관찰대상에 대한 정보를 인자로 매번 전달해야 하지만 IOCP는 관찰대상의 정보를 매번 전달할 필요없이 관찰대상의 범위나 내용에 변경이 있을 때 변경사용만 알려주면 되기 때문에 성능적으로 더 뛰어나 선호되고있다.

어려웠던 점
  • reduce 사용법이 아직 서툴러 상황에 맞게 쓰지 못한다. (reduce함수를 공부해 적절하게 사용할 수 있게 해야겠다.)
  • IOCP에 대해 공부하면서 동작 구조를 그림으로 그려보았지만 처음보는 용어와 원리가 있어 제대로 이해하지 못하였고 Select보다 IOCP가 선호되는 이유도 간단하게는 이해하였지만 얼마나 성능이 좋은지도 정확히 알지 못하겠다.(IOCP를 더 공부해서 IOCP에 대한 지식을 완전히 내 것으로 만들어야겠다.)
오늘의 TIP
  • libuv란 nodejs를 구성하는 여러 라이브러리 중 하나로 javascript 엔진(싱글 스레드)을 사용하는 nodejs에서 비동기 I/O를 가능하도록 해주는 C언어 기반 라이브러리 이다. ( IOCP가 지원하는 모든 기능을 갖춘 이벤트 루프)