select 관련 질문입니다

미해결질문
유영재 프로필

안녕하세요 선생님 select 이론과 더불어 IO Multiplexing에 대해서 궁금한 점이 있습니다

이론 수업을 들을 때는 약간 하드웨어적으로 보면 인터럽트라고 느껴졌는데 라이브코딩을 보면서 결국엔 fd를 여러개 읽는 방법에서 polling이라고 느껴졌는데

제 개인적으로 정의를 내리자면 여러 fd를 읽을 수 있는 polling 방식이라고 느껴지는데 맞나요? 

그리고 추가적으로, select는 단발성이라서 주기적으로 등록을 해줘야 되는 것인가요?

ProgCoach4U 프로필
ProgCoach4U 2달 전

Q1. 여러 fd를 읽을 수 있는 polling 방식이라고 느껴지는데 맞나요? 

말씀하신 부분이 맞는 부분도 있고, 그렇지 않은 부분도 있습니다. 

I/O Multiplexing은 여러 fd에서 발생하는 이벤트를 모아 관리할 수 있는 기능 입니다. 일반적으로는 관심있는 fd를 multiplexer에 등록해놓고 대기(blocking)하고 있다가 등록된 fd에서 기대하던 이벤트가 발생하면 깨어나는 방식으로 동작합니다. 이런 방식을 흔히 event-driven 방식이라고 합니다. polling이라고 얘기할 수는 없죠.

polling 방식이라고 함은 어떤 이벤트가 발생했는지 발생하지 않았는지 지속적으로 알아보아야 합니다. fd가 non-blocking I/O로 동작한다면 polling 방식으로 동작해야 합니다. 예를 들어, non-blocking I/O로 동작하는 fd에 대해 read() 호출 시 읽을 데이터가 없어도 바로 리턴됩니다.

fd와 관계없이 select() 자체로 polling 방식으로 동작하게 하는 방법이 있습니다. select()의 timeout parameter를 0초로 입력하면, select() 호출 즉시 리턴됩니다. 이 방법으로 polling을 하는 select()를 구현할 수도 있습니다. 

 

Q2. select는 단발성이라서 주기적으로 등록을 해줘야 되는 것인가요?

네. 맞습니다. select() 호출 후 select()를 재호출 할 때, select()에 넘겼던 파라미터는 모두 다시 설정하셔야 정상동작 합니다. select() 호출이 리턴되고나면 파라미터로 넘긴 값들이 변경되기 때문에 반드시 다시 설정하셔야 합니다.

유영재 프로필
유영재 2달 전

1번 질문에 대해서 조금 더 궁금한 것이 select 방식이 event_driven 형식이지만 blocking 되어있기 때문에 결국 실시간으로 유지하려면 while안에서 select만 구현하는 것이 맞는 코드이지 않나요?

결국 cpu 자체가 select에 blocking 되어있기 때문에 그렇게 생각했습니다

그러면 결론적으로는 매분매초 검사하는 폴링방식과 다른 것이 없지 않나 생각이 듭니다

다른 일을 하지 못한다면요 

ProgCoach4U 프로필
ProgCoach4U 2달 전

프로세스가 select에 의해 blocking 되어 있는 동안 다른 프로세스가 스케쥴되어 동작합니다. blocking 된 프로세스는 잠자고 있는 상태라고 보시면 되고, CPU는 다른 프로세스를 동작시켜 주고 있는 상태로 보시면 됩니다. blocking 된 프로세스에 기다리고 있던 이벤트가 발생하면, 해당 프로세스를 깨워 줍니다. 마치, 여자친구를 기다리며 잠자고 있다가 여자친구가 도착하면 일어나는 것과 같죠 :) 따라서 여자친구가 도착했는지 매번 쳐다봐야 하는 폴링 방식과는 동작 방식이 다릅니다.

앞서 실시간 처리에 대해 언급 하셨는데.. latency가 매우 중요하다면 event-driven 보다 polling이 유리할 수 있습니다. 하지만 (중간에 sleep이 없는)polling 방식은 CPU resource 소모가 매우 크기 때문에 latency와 CPU utilization 간의 trade-off라고 볼 수 있습니다. 

 

유영재 프로필
유영재 2달 전

아 프로세스를 나누어서 생각하면 되군요. 프로세스 하나에서 select와 다른 일을 하려고 생각했기 때문에 그런것 같습니다 ㅎㅎㅎ