Post

입출력 다중화


컴퓨터 구조

컴퓨터 구조를 공부하면서 알게된 내용을 요약해서 작성해보자.

파일

  • 프로그래머가 입출력 작업을 실행하는 코드를 작성한다면 파일이라는 개념을 벗어나는 것은 불가능하다.
  • 사실상 모든 입출력 장치는 파일이라는 개념으로 추상화된다.

파일 서술자

  • 식당 웨이팅할 때 번호표를 받으면 직원은 내가 누군지 아무것도 모르고 번호표만으로 찾을 수 있다.
  • 이와 마찬가지로 유닉스/리눅스 세계에서 파일을 사용하려면 번호를 하나 빌려야하고 이것을 파일 서술자라고 한다.
  • 파일을 열 때 커널은 파일 서술자를 반환하며, 파일 작업을 실행할 때 해당 파일 서술자를 커널에 전달해 주어야 한다. 커널은 이 숫자를 얻은 후 해당 숫자에 대응하는 파일에 관련된 모든 정보를 찾아 파일 작업을 완료할 수 있다.

입출력 다중화

  • 여러 신호를 하나로 합치는 장치를 다중화기라고 한다.
  • 신호를 수신하는 쪽에서 신호를 수신한 후 원래의 여러 신호로 복원하는 장치를 역다중화기라고 한다.
  • 입출력 다중화 과정
    • 파일 서술자 획득 -> 특정 함수 호출 -> 커널에 전달 -> 함수 반환 -> 파일 서술자 획득 -> 상응 처리
    • 리눅스에서 입출력 다중화 기술을 사용하는 방법 3가지: select, poll, epoll

select, poll, epoll

  • select
    • 파일 서술자 묶음에 제한이 있다. 일반적으로 1024개를 넘을 수 없다.
    • select 호출될 때 대응하는 프로세스 또는 스레드는 감시 대상인 파일의 대기열에 배치되므로 블로킹되며 일시중지된다.
    • 파일 서술자 중 하나라도 읽기 가능 또는 쓰기 가능 이벤트가 나타나면 프로그램 또는 스레드가 다시 깨어난다.
    • 프로세스가 깨어났을 때 어떤 파일 서술자가 읽고 쓸 수 있는지 알 수 없어, 어떤 파일 서술자가 이미 준비 완료 상태인지 알려면 처음부터 끝까지 다시 확인해야 한다.
    • 이것이 select가 대량의 파일 서술자를 감시할 때 효율이 매우 떨어지는 근본적인 원인이다.
  • poll
    • select와 매우 유사
    • select에 비해서 1024개라는 제한을 넘지 못한다는 문제를 해결하는 것 뿐이다.
  • epoll
    • 위 문제들을 해결하려고 epoll이 등장했다.
    • 이 문제를 해결하는 방법은 커널에 필요한 데이터 구조를 생성한다.