#블로킹
외부 디바이스에 처리를 요청 한 후, 응답을 기다리는 함수를 호출할 때 스레드에서 발생하는 대기 현상을 블로킹이라고 한다. 이때 스레드에서 CPU는 아무런 연산을 하지 않는다.
그러니까, 예를들어, connect()함수를 호출하고, 소켓에 연결이 있을때까지 CPU는 잠들어있는것을 블로킹이라고 할 수 있지 않을까- 네트워크 장치로부터 응답이 오기전까지 CPU가 해당 스레드에서 해줄수있는 일은 없으니까..
#논블로킹
반면 논블로킹 소켓은 외부 디바이스의 처리를 마냥 기다리지 않는다. '외부 디바이스는 지금 바빠!' 라는 결과를 반환한다.
만약 스레드가 외부 디바이스의 결과를 받아야 다음 로직이 진행된다면, CPU는 외부디바이스한테 "데이터 왔어? 데이터 왔어?" 라고 계속 물어봐야 한다.. 이는 CPU 과부하를 일으킨다.
#논블로킹 해결책
여러 소켓중 하나라도 송신버퍼에 빈공간이 생기거나, 수신버퍼에 뭔가 데이터가 들어온다면 CPU에 이를 알려줄 필요가 있다!
해결책: 블로킹상태에서 타임아웃을 정해서 기다리도록, 그래서 CPU가 외부디바이스의 상태를 지속적으로 체크하지 않도록 도와주는 함수가 필요하다.
그 함수의 처리로직은 아래와 같다
0) 관리할 소켓리스트를 입력받는다
1) 일정시간동안 블로킹한다.(0초면 블로킹하지 않는다.)
2) 소켓중 하나라도 응답이 온다면,
3) 해당 소켓에서 데이터를 읽어온다.
* 여기서 궁금한점이, 블로킹상태에서 외부디바이스에 응답이 도착하면 외부디바이스는 CPU한테 인터럽트를 날려서 이 사실을 알려주는건가?
'Today I learned' 카테고리의 다른 글
2020 12 08 (0) | 2020.12.08 |
---|---|
2020 12 04 (0) | 2020.12.04 |
2020 12 02 (0) | 2020.12.02 |
2020 11 30 (0) | 2020.11.30 |
2020 11 29 (0) | 2020.11.29 |
댓글