HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
📖
공부한 책
/
📒
Computer Systems - A Programmer’s perspective
/
10. System Level I/O

10. System Level I/O

개요

  • Input/Output (I/O) 는 메인메모리와 외부 디바이스(disk drive, terminal, network) 사이의 데이터 복사의 과정을 말함
  • Unix 시스템에서는 고수준의 I/O 함수들은 커널에 의해 제공되는 시스템 레벨 Unix i/o 함수들에 의해 구현됨
    • 대부분은 고수준의 I/O 함수는 잘 작동하고 Unix I/O를 직접 사용할 필요는 없다.
  • 왜 Unix I/O에 대해서 알아야 해?
    • Unix I/O를 이해하는 것은 다른 시스템 컨셉에 대해 이해하는데 도움을 준다. i/o는 시스템의 운영에 필수적인 부분이고 이것 때문에 우리는 순환참조 문제에 자주 맞닥뜨린다(I/O와 다른 시스템 아이디어들 사이에)
    • 때때로 고수준의 i/o함수들 만으로는 불가능한 경우가 있음(예를 들어 file의 meta data, file size, file creation time 등). 이럴 때 Unix I/O를 직접 사용해야 할수 있음.
    • 그리고 네트워크 프로그래밍 에서는 standard I/O 는 risky하다

Unix I/O

  • 모든 I/O 장치(네트워크, 디스크, 터미널..) 는 파일로 모델링됨
  • 모든 입력과 출력은 적절한 파일을 읽고 쓰는 작업에 의해 수행됨
    • 이러한 device → file 매핑은 Unix kernel이 단순하고 저수준의 application interface 즉, Unix I/O를 export하게 해줌 ↔ 모든 입력과 출력이 uniform and consistent way로 다뤄질 수 있도록 해줌
      • Opening Files : 어플리케이션이 I/O 장치에 접근하겠다고 하면 kernel에게 해당 파일을 열어 달라고 요청을 함. kernel은 descriptor 라는 nonnegative 정수값을 반환함(이후 과정에서 파일을 식별할 수 있는 값)
      • Changing the current file position
      • Reading and writing files
        • buffer를 이용하게 되면 바이트 한 개씩 읽어서 메모리로 옮기는게 아닌 한번에 많은 양을 옮길 수 있기 때문에 Unix I/O의 system call을 최소화 할 수 있음
      • Closing files

I/O Redirection

  • shell 이 ls 를 실행한 후, standard output을 disk file foo.txt로 redirect하는 것임

Standard I/O

  • ANSI C는 프로그래머에게 Unix I/O의 상위 호환으로 Standard I/O라는 고수준의 입출력 함수를 정의했음.
    • open and close files(fopen and fclose)
    • reading and writing bytes(fread and fwrite)
    • reading and writing strings (fgets and fputs)
    • sophisticated formatted I/O (scanf and printf)
  • Standard I/O 라이브러리는 open file을 stream으로 모델링하였음
  • 프로그래머에게 stream은 FILE 구조체에 대한 포인터임
unix > ls > foo.txt