연결 하나가 느려지자 나머지가 전부 멈췄다 · 보낸 만큼 다 나가지 않는다 · 퀴즈
퀴즈: 보낸 만큼 다 나가지 않는다
문항 6개. 정답과 해설은 풀어 본 뒤에 보여 드립니다.
send 가 20바이트 가운데 3을 돌려줬다면?
- 나머지 17바이트는 커널이 알아서 마저 보낸다
- 헤더가 잘못됐다는 뜻이므로 연결을 끊는다
- 20바이트가 상대에게 모두 도착한 것이다
- 3바이트만 나갔으므로 나머지를 들고 있어야 한다
보낼 것이 없는데 쓰기 준비를 계속 지켜보면?
- 다중화 호출이 즉시 돌아와 루프가 헛돈다
- 커널이 그 소켓을 관심 목록에서 자동으로 뺀다
- 읽기 준비 통지가 함께 사라진다
- 송신 버퍼가 가득 찰 때까지 아무 일도 없다
개행이 아직 없는 조각을 받았을 때 올바른 처리는?
- 잘못된 입력이므로 연결을 끊는다
- 받은 조각을 버리고 다음 조각을 기다린다
- 완성된 줄이 없으므로 조각을 보관한다
- 개행을 붙여 한 줄로 만들어 처리한다
레벨 트리거에서 읽기 준비마다 recv 를 한 번만 불러도 되는 이유는?
- 한 번의 recv 가 버퍼를 반드시 비우기 때문에
- 한 번만 부르면 부분 수신이 생기지 않기 때문에
- 커널이 남은 데이터를 다음 연결로 옮기기 때문에
- 남은 데이터가 있으면 다음에 다시 깨워 주기 때문에
부분 송신 버그가 시험에서 잘 드러나지 않는 이유는?
- 시험은 언제나 논블로킹 소켓을 쓰지 않기 때문에
- 작은 응답은 대개 한 번에 다 나가기 때문에
- 시험 환경에서는 send 가 예외를 내기 때문에
- 작은 응답은 커널이 모아서 한 번에 보내기 때문에
관심 이벤트를 다시 계산하기에 알맞은 두 시점은?
- 연결을 받을 때와 연결을 닫을 때
- 요청을 해석한 뒤와 응답을 기록한 뒤
- 보낼 것을 큐에 넣은 직후와 보내기를 마친 직후
- 유휴 검사를 시작할 때와 끝낼 때