2005년 4월 22일 금요일

Nonblocking, blocking 혼합

Spin-lock이 유용한 경우
Spin lock은 nonblocking이기 때문에 resource를 많이 잡아먹는 단점이
있지만 blocking보다 response time이 빠르다.
(Kernel-User mode 전환 같은 일을 하지 않아도 된다.)

Network I/O에서도 마찬가지.
따라서 nonblocking과 blocking의 장점을 모두 취하기 위해서
일정 횟수(시스템의 특성에 따른)만큼 nonblocking으로 polling한 후 blocking하게 짜면
잦은 I/O에 따른 response time 향상과 I/O가 적을 때 blocking을 통해
resource를 절약하는 장점을 모두 취할 수 있다.
예) spinlock를 n번 돌고 sleep.
     polling n번하고 block.

또 다른 방법으로는 먼저 blocking을 한 후 I/O가 available함을 알았을 때,
nonblocking을 이용하여 loop를 돌아 buffer의 크기보다 더 큰 데이터를 한 번에 처리할 수도 있다.
예) select로 기다리다가 I/O가 가능해지면 loop를 돌아 가능한한 많이 nonblock read(), write() 한다.

물론 이런 tuning들은 시스템의 초기에 넣기 보다는
많은 경험이 쌓이고 예측이 가능할 때, 그리고 변화가 적은 안정한
상태에서 가능한 것들이다.
(이른 최적화는 코드를 복잡하게 하고, 이해하기 힘들어지고
버그를 늘리고 오히려 느리게 만들 수도 있다.)

댓글 없음:

댓글 쓰기