I/O Systems and Operations

공부하자·2022년 11월 24일
0

시스템프로그래밍

목록 보기
9/11

Reminder: A View of OS Services

I/O (Input/Output)

  • The main job of a computer is I/O
    • Its another (major) job, Computing or Processing, is merely secondary
  • The role of OS in computer I/O is to control devices and to manage I/O operations
  • 컴퓨터의 주 업무는 입출력이다.
    • 또 다른 (주요) 작업인 컴퓨팅 또는 프로세싱은 단지 부차적인 것이다.
  • 컴퓨터 I/O에서 OS의 역할은 장치를 제어하고 I/O 작업을 관리한다.

주업무 입출력
I/O에서 OS는 장치를 제어하고 I/O 작업을 관리한다.

The Role of OS: I/O Device Control

  • I/O devices vary so widely in their function and speed
    • -> Varied methods are needed to control them
    • These methods form the “I/O subsystem of the OS kernel”, which separates the rest of the kernel from the complexities of managing I/O devices
  • The basic I/O hardware elements, such as ports, buses, and device controllers, accommodate a wide variety of I/O devices
    • Port: A connection point between a device and a computer (e.g., a serial port)
    • Bus: A common set of wires, shared by devices, and a rigidly defined protocol that specifies a set of messages that can be sent on the wires
  • To encapsulate the details and oddities of different devices, the OS kernel is structured to use device-driver modules
    • Device Driver: A uniform device-access interface to the I/O subsystem,much as system calls provide a standard interface between the application and the OS
  • I/O 장치의 기능과 속도는 매우 다양하다.
    • -> 다양한 방법이 필요하다.
    • 이러한 방법들은 "OS 커널의 I/O 하위 시스템"을 형성하며, 이는 I/O 장치를 관리하는 복잡성으로부터 커널의 나머지 부분을 분리한다.
  • 포트, 버스 및 장치 컨트롤러와 같은 기본 I/O 하드웨어 요소는 다양한 I/O 장치를 수용한다.
    • Port: 장치와 컴퓨터 사이의 연결 지점(예: 직렬 포트)
    • Bus: 장치에서 공유하는 공통 와이어 세트, 와이어에서 전송할 수 있는 메시지 세트를 지정하는 엄격하게 정의된 프로토콜
  • 다양한 장치의 세부 사항과 특이점을 캡슐화하기 위해, OS 커널은 장치 드라이버 모듈을 사용하도록 구조화되어 있다.
    • Device Driver: 시스템 호출이 애플리케이션과 OS 간에 표준 인터페이스를 제공하는 것과 마찬가지로 I/O 하위 시스템에 대한 균일한 장치 액세스 인터페이스

I/O 장치 다양, OS 커널의 I/O subsystem 형성
port, bus, device controller는 다양한 I/O 장치 수용

Port: 장치와 컴퓨터 사이의 연결 지점
Bus: 공통 와이어 세트, 와이어에서 전송할 수 있는 메시지 세트를 정의하는 엄격하게 정의된 프로토콜

다양한 장치의 세부 사항과 특이점을 캡슐화하기위해 OS 커널은 장치 드라이버 모듈 사용
Device Driver: I/O 하위 시스템에 대한 균일한 장치 억세스 인터페이스

A Typical PC Bus Structure

A Kernel I/O Structure

The Role of OS: I/O Operation Management

  • I/O operations or transactions occur when a program receives bytes from a source (e.g., a keyboard, mouse, file, and sensor) or sends bytes to a destination (e.g., a display, file, printer, and actuator)
    -> Most modern OS, including Unix/Linux, use the “stream model” to control I/O
  • I/O 작업 또는 트랜잭션은 프로그램이 소스(예: 키보드, 마우스, 파일, 센서)로부터 바이트를 받거나 대상(예: 디스플레이, 파일, 프린터, 액추에이터)으로 바이트를 보낼 때 발생한다.
    -> Unix/Linux를 포함한 대부분의 최신 OS는 "stream model"을 사용하여 I/O를 제어한다.

I/O operations+transactios: source로 부터 byte를 받거나, destination으로byte를 보낼 때 발생
-> stream model로 I/O 제어

Stream Model

  • Any input or output transaction can be viewed as a flow of bytes(=stream) from a source to a destination
  • The operating system creates and manages streams based upon the function calls made by the program
    • An I/O stream connection can be established using the fopen() function, and broken using the fclose() function
  • 모든 입력 또는 출력 트랜잭션은 소스에서 대상으로의 바이트 흐름(=스트림)으로 볼 수 있다.
  • 운영 체제는 프로그램에 의해 만들어진 함수 호출을 기반으로 스트림을 생성하고 관리한다.
    • fopen() 함수를 사용하여 I/O 스트림 연결을 설정하고 flose() 함수를 사용하여 중단할 수 있다.

flow of byte = stream
함수 호출을 기반으로 stream 생성하고 관리. fopen() + fclose()

The Steps in Creating, Using, and Closing a Stream

  • When a stream is created, one can think of it as having an address from which bytes are sent and an address at which bytes are received.
    • Each address is at a memory location controlled by the OS
  • 스트림이 생성될 때, 바이트가 전송되는 주소와 바이트가 수신되는 주소를 갖는 것으로 생각할 수 있다.
    • 각 주소는 OS에 의해 제어되는 메모리 위치에 있다.

stream이 생성될 때 주소를 갖는다.

fopen: Stream connection is established
fprintf: Bytes are passed along the stream
fclose: Stream connection is broken

Transporting Bytes on Streams

  • There are several functions that can be used to transport bytes on streams:
    • These include the familiar fprintf() and fscanf() functions, which are specialized to work only with ASCII formatted text data
    • The generic functions for this purpose are fread() and fwrite()
      • -> At the heart of both fprintf() and fscanf() functions are calls to fread() and fwrite() to actually move the bytes after the desired byte manipulations have been completed
    • There are a number of other functions as well, such as fgetc(), fputc(), gets(), and puts()
  • 스트림에서 바이트를 전송하는 데 사용할 수 있는 기능은 다음과 같다.
    • 여기에는 ASCII 형식의 텍스트 데이터에서만 작동하도록 특수화된 익숙한 fprintf()fscanf() 함수가 포함된다.
    • 이 목적을 위한 일반 함수는 fread()fwrite()이다.
      • -> fprintf()와 fscanf() 함수의 중심에는 원하는 바이트 조작이 완료된 후 실제로 바이트를 이동하기 위한 fread()와 fwrite() 호출이 있다.
    • fgetc(), fputc(), get(), puts()와 같은 많은 다른 함수들도 있다.

fprintf, fscanf : ASCII 형식의 텍스트 데이터에서만 작동

fprintf()

  • Bytes are being sent down a stream using the fprintf() function
  • fprintf() 함수를 사용하여 스트림 아래로 바이트를 보내고 있다.

memory에서 file로 출력

fscanf()

  • Bytes are being transported on a stream using the fscanf() function

  • fscanf() 함수를 사용하여 스트림에서 바이트를 전송하고 있다.


  • fscanf() and fprintf() functions perform byte manipulations besides the byte transfers.
  • fscanf() 및 fprintf() 함수는 바이트 전송 외에도 바이트 조작을 수행한다.

fread() & fwrite()

  • Synopsis
    • size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
    • size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
  • Description
    • The function fread() reads nmemb elements of data, each size bytes long, from the stream pointed to by stream, storing them at the location given by ptr.
    • The function fwrite() writes nmemb elements of data, each size bytes long, to the stream pointed to by stream, obtaining them from the location given by ptr.
  • Return value
    • On success, fread() and fwrite() return the number of items read or written
      • -> An indicator of the number of bytes actually moved along the stream
    • If an error occurs, the return value is a short item count (or zero).
  • 시놉시스
    • size_t fread(void *ptr, size_t size, size_tnmemb, FILE *stream);
    • size_t fwrite(const void *ptr, size_t size, size_tnmemb, FILE *stream);
  • 설명
    • fread() 함수는 스트림이 가리키는 스트림에서 각 크기 바이트 길이의 데이터의 nmemb 요소를 읽어 ptr이 지정한 위치에 저장한다.
    • fwrite() 함수는 nmemb 요소의 각 크기 바이트를 스트림으로 가리키는 스트림에 기록하여 ptr이 지정한 위치에서 가져온다.
  • return value
    • 성공하면 fread()fwrite()가 읽거나 쓴 항목 수를 반환한다.
      • -> 스트림을 따라 실제로 이동한 바이트 수를 나타내는 표시기
    • 오류가 발생하면 반환 값은 짧은 항목 수(또는 0)이다.

fread()

  • Bytes are read from a source into the program regardless of what the bytes represent.
  • 바이트는 바이트가 무엇을 나타내는지에 관계없이 소스에서 프로그램으로 읽힌다.

fwrite()

  • Bytes are moved from the program into a destination
    • The parameters of the fwrite() are identical to those in the fread() function
  • 프로그램에서 대상으로 바이트 이동
    • fwrite()의 매개 변수는 fread() 함수의 매개 변수와 동일하다.

  • Executing this code will produce a file data2.txt including “Fortytwo 42 …”
  • Note that this example uses the strlen() function to determine the number of cells in the array to send on the stream, which in this case is 40.
  • 이 코드를 실행하면 "Fortytow 42…"를 포함하여 파일 데이터2.txt가 성성된다.
  • 이 예에서는 strlen() 함수를 사용하여 스트림에 보낼 셀의 수를 결정한다.

Short Question...

  • What would you expect here?
  • 여기서 뭘 기대하나요?

System I/O Functions

  • Another set of functions that can be used for I/O
    • These functions include open(), close(), read(), and write()
    • They look very similar to the f-versions of the I/O functions, i.e., fopen(), fclose(), fread(), and fwrite() functions, which are standardized in the C library and therefore expected to behave similarly regardless of the underlying operating system
  • The non-f I/O functions are “system calls”
    • Depending on which OS they are called from, they may behave differently
    • A general rule of thumbs is that the non-f versions are NOT buffered, while the f-versions are buffered
  • I/O에 사용할 수 있는 다른 기능 세트
    • 이러한 기능에는 open(), close(), read() 및 write()가 포함된다.
  • 이들은 f/O 함수의 f-버전, 즉 fopen(), fclose(), fread(), fwrite() 함수와 매우 유사하게 보이는데, 이 함수들은 C 라이브러리에서 표준화되어 있으므로 기본 운영 체제에 관계없이 유사하게 동작할 것으로 예상된다.
  • non-f I/O 기능은 "시스템 호출"이다.
    • 호출되는 OS에 따라 다르게 작동할 수 있다.
    • 일반적인 엄지손가락 규칙은 non-f versions는 버퍼링되지 않는 반면 f-versions는 버퍼링되지 않는다는 것이다.

Standard Streams

  • Most programs get user input from a keyboard and display text output to a screen. Therefore, every time a program is started, the OS automatically creates three streams:
    • Standard in (stdin): It connects keyboard to program
    • Standard out (stdout): It connects program to display
    • Standard error (stderr)
      • It connects program to a secondary display that is intended only for displaying errors
      • stderr stream is intended as a backup output stream for programs
  • The standard streams are most commonly used by calling the scanf() and printf() functions
    • While fscanf() can receive bytes from any stream, scanf() is “hardwired” to the stdin stream. The same is true with regards to printf() and fprintf()
  • 대부분의 프로그램은 키보드에서 사용자 입력을 받고 화면에 텍스트 출력을 표시한다. 따라서 프로그램이 시작될 때마다 OS는 자동으로 세 가지 스트림을 생성한다.
    • 표준 위치(stdin): 키보드를 프로그램에 연결한다.
    • 표준화(stdout): 프로그램과 디스플레이를 연결한다.
    • 표준 오차(stderr)
      • 오류를 표시하기 위한 보조 디스플레이에 프로그램을 연결한다.
      • stderr stream은 프로그램의 백업 출력 스트림으로 사용된다.
  • 표준 스트림은 scanf()printf() 함수를 호출하여 가장 일반적으로 사용된다.
    • fscanf()가 모든 스트림으로부터 바이트를 수신할 수 있는 반면, scanf()는 stdin 스트림에 "hardwired"된다. printf()와 fprintf()에 관해서도 마찬가지이다.

Example

  • In the following example, the pair of scanf() & fscanf() and printf() & fprintf() function calls perform the exact same operation;
    • The definitions for the standard streams can be found in the include file stdio.h
  • 다음 예제에서는 scanf() & fscanf() 및 printf() 함수 호출 쌍이 정확히 동일한 작업을 수행한다.
    • 표준 스트림에 대한 정의는 포함 파일 stdio.h에서 확인할 수 있다.

Buffering

  • A buffer is a temporary storage or the “middlemen” between sender and receiver of bytes on a stream (i.e., between two devices or between a device and an application)
    • An additional piece of memory that is used to moderate the flow of bytes from the source to the destination
  • Buffering is done for 3 reasons:
    • To cope with device speed mismatch
      • What if the sender puts bytes into the stream faster than the receiver can handle?
      • What if a program is in the middle of a calculation and is not prepared to receive any bytes?
    • To cope with device data-transfer size mismatch
      • Common in computer networking, where buffers are used widely for fragmentation and reassembly of messages
    • To support “copy semantics” for application I/O
  • 버퍼(buffer)는 스트림에서 바이트의 송신자와 수신자(즉, 두 장치 간 또는 장치와 응용 프로그램 간) 사이의 임시 저장소 또는 "중간자"이다.
    • 원본에서 대상으로의 바이트 흐름을 조절하는 데 사용되는 추가 메모리 조각
  • 버퍼링은 세 가지 이유로 수행됩니다.
    • 장치 속도 불일치에 대처하기 위해
      • 만약 송신자가 수신자가 처리할 수 있는 것보다 더 빨리 바이트를 스트림에 넣으면 어떨까?
      • 프로그램이 계산 중이고 바이트를 수신할 준비가 되지 않은 경우 어떻게 되는가?
    • 장치 데이터 전송 크기 불일치를 해결하기 위해
      • 버퍼가 메시지 조각화 및 재구성에 널리 사용되는 컴퓨터 네트워킹에서 일반적이다.
      • 응용 프로그램 I/O에 대해 "복사 의미론"을 지원하기 위해

Three Types of Buffering

  • Based on how the temporary storage is “flushed”
    • Block buffering
      • The buffer is flushed when it receives a certain amount of data (e.g. 1KB, 16KB, 64KB, etc…)
      • Commonly used for large data transfers, such as file I/O
    • Line buffering
      • The buffer is flushed when it receives a newline character(‘\n’)
      • Typically used for text-based I/O, such as when interacting with a user
    • Unbuffered
      • The buffer doesn’t act as a buffer and is flushed every bytes
      • Buffering may be completely turned off when responsiveness is critical
  • The type of buffering on an existing stream can be changed by the setvbuf() or setbuf() function
  • 임시 스토리지가 "flused"되는 방식을 기반으로 함
    • 블록 버퍼링
      • 버퍼는 일정량의 데이터(예: 1KB, 16KB, 64KB 등)를 수신할 때 플러시된다.
      • 파일 I/O와 같은 대규모 데이터 전송에 일반적으로 사용된다.
    • 라인 버퍼링
      • 버퍼가 새 줄 문자('\n')를 수신하면 플러시된다.
      • 일반적으로 사용자와 상호 작용하는 경우와 같이 텍스트 기반 I/O에 사용된다.
    • 버퍼링되지 않음
      • 버퍼가 버퍼 역할을 하지 않으며 모든 바이트가 플러시된다.
      • 응답성이 중요한 경우 버퍼링이 완전히 꺼질 수 있다.
  • 기존 스트림의 버퍼링 유형은 setvbuf() 또는 setbuf() 함수를 통해 변경할 수 있다.

temperary storage "flused"
block buffering
line buffering
unbuffered

Example Code

line buffer : \n 수신하면 flush
forced to flush : fflsuh();

Pipes

  • The term “PIPE”
    • Used in contexts where streams are reconnected to alternate sources or destinations
    • The process of connecting and reconnecting streams is referred to as piping, or pipelining
    • An example of piping is to reconnect the standard out stream so that it simultaneously sends the same bytes to a file and a display
    • pipe() and dup() are the file I/O functions (i.e., system calls) that can be used to manipulate stream connections
  • "PIPE"라는 용어
    • 스트림이 대체 소스 또는 대상에 다시 연결되는 컨텍스트에서 사용된다.
    • stream을 연결하고 재연결하는 과정을 piping 또는 pipelining이라고 한다.
    • 파이프의 예는 표준 출력 스트림을 다시 연결하여 파일과 디스플레이에 동일한 바이트를 동시에 전송하는 것이다.
    • pipe()dup()은 스트림 연결을 조작하는 데 사용할 수 있는 파일 I/O 함수(즉, 시스템 호출)이다.

piping : stream 연결, 재연결
예시) 파일과 디바이스에 동일한 바이트 동시 전송
pipe(), dup()

Piping symbols

  • 3 pipelining symbols
    • OS automatically creates three streams for every running program.
    • Most shells provide the ability to redirect those streams at startup
  • 파이프라인 기호 3개
    • OS는 실행 중인 모든 프로그램에 대해 자동으로 세 개의 스트림을 생성한다.
    • 대부분의 셸은 시작 시 이러한 스트림을 리디렉션하는 기능을 제공한다.

자동으로 세 개의 스트림 생성

Piping Example



확인하기

Pipe chaining

  • Pipeline chaining
    • Multiple piping redirections can be done simultaneously
  • Example
    • Both the stdin and stdout of the summer are being redirected
    • bingo also has its stdout stream redirected to a file
  • 파이프라인 체인
    • 여러 배관 리다이렉트를 동시에 수행할 수 있다.
    • 여름의 stdin과 stdout 둘 다 방향을 바꾸고 있다.
    • 빙고는 또한 그것의 stdout stream을 파일로 리디렉션한다.

Files

  • What is it?
    • Contiguous logical address space
    • An image, movie, or database can be stored as a one-dimensional array of bytes by writing all the elements out in a long list
  • 무엇인가?
    • 연속 논리 주소 공간
    • 이미지, 동영상 또는 데이터베이스는 모든 요소를 긴 목록에 기록하여 1차원 바이트 배열로 저장할 수 있다.

파일은 연속 논리 주소 공간. 1차원 바이트 배열로 저장 가능.

File Pointer

  • A marker used to keep track of the location for reading or writing on a stream.
  • When opening a file, the file pointer points to the 1st byte in the file. Each time a byte is read, the file pointer automatically advances to the next byte.
    • When reading multiple bytes, the file pointer advances beyond all the read bytes
  • Functions for manipulating the file pointer:
    • fseek(): moves it to a new value without reading or writing any data on the stream
    • ftell(): obtain its current value
  • 스트림에서 읽거나 쓰기 위한 위치를 추적하는 데 사용되는 마커이다.
  • 파일을 열면 파일 포인터가 파일의 첫 번째 바이트를 가리킨다. 바이트를 읽을 때마다 파일 포인터가 자동으로 다음 바이트로 이동한다.
    • 여러 바이트를 읽을 때 파일 포인터가 모든 읽기 바이트를 초과한다.
  • 파일 포인터를 조작하는 기능:
    • fseek(): 스트림에서 데이터를 읽거나 쓰지 않고 새 값으로 이동한다.
    • ftell(): 현재 값을 가져온다.

Example

  • Consider the following data in a file: abcdef
  • 파일의 다음 데이터를 고려해 보십시오: abcdef

fseek()

  • Synopsis
    • int fseek(FILE *stream, long offset, int whence);
  • Description
    • The fseek() function sets the file position indicator for the stream pointed to by stream
    • The new position, measured in bytes, is obtained by adding offset bytes to the position specified by whence
    • If whence is set to SEEK_SET, SEEK_CUR, or SEEK_END, the offset is relative to the start of the file, the current position indicator, or end-of-file, respectively
  • Return value
    • Upon successful completion, fseek() returns 0
    • If an error occurs, the return value is -1
  • 시놉시스
    • intfseek(FILE *stream, long offset, intce);
  • 설명
    • fseek() 함수는 stream이 가리키는 스트림의 파일 위치 표시기를 설정한다.
    • 바이트 단위로 측정되는 새 위치는 wherece로 지정된 위치에 오프셋 바이트를 추가하여 얻는다.
    • whence가 SEKE_SET, SEKE_CUR 또는 SEKE_END로 설정된 경우 오프셋은 각각 파일의 시작, 현재 위치 표시기 또는 파일의 끝에 상대적이다.
  • 반환값
    • 완료되면 fseek()가 0을 반환한다.
    • 오류가 발생하면 반환 값은 -1이다.

Example: fileseek.c

File Attributes

  • They are metadata associated with computer files
    • Name, size, date, time, and file system permissions, …
  • 컴퓨터 파일과 관련된 메타데이터이다.
    • 이름, 크기, 날짜, 시간 및 파일 시스템 권한 등
  • Permission indicates who is allowed to access the file, and what types of access are allowed
    • r: read, w:write, x:excute, -: permission denied
    • On a UNIX system, it can be changed using the “chmod” system program
  • 권한은 파일에 액세스할 수 있는 사용자와 허용되는 액세스 유형을 나타낸다.
    • r: 읽기, w: 쓰기, x: 실행, -: 권한 거부
    • UNIX 시스템에서는 chmod 시스템 프로그램을 사용하여 변경할 수 있다.

stat()

  • Synopsis
    • int stat(const char *pathname, struct stat *buf);
  • Description
    • It returns information about a file, in the buffer pointed to by buf
    • No permissions are required on the file itself, but—in the case of stat() — execute (search) permission is required on all of the directories in pathname that lead to the file
  • Return value
    • On success, zero(0) is returned
    • If an error occurs, the return value is -1
  • 시놉시스
    • int stat(const char *pathname, struct stat *buf);
  • 설명
    • 파일에 대한 정보를 buff가 가리키는 버퍼로 반환한다.
    • 파일 자체에 대한 사용 권한은 필요하지 않지만 stat()의 경우 파일로 이어지는 경로 이름의 모든 디렉토리에 대한 실행(검색) 권한이 필요하다.
  • 반환값
    • 성공 시 0이 반환된다.
    • 오류가 발생하면 반환 값은 -1이다.

stat data structure

stat example code

Directory

  • Directory
    • A directory is an organizational tool for files
    • List of filenames and auxiliary information for each file
    • OS manages directories in much the same manner as it manages files
  • These tables can be accessed using the opendir(), readdir(), and closedir() functions
  • 디렉토리
    • 디렉토리는 파일에 대한 조직 도구이다.
    • 각 파일에 대한 파일 이름 및 보조 정보 목록
    • OS는 파일을 관리하는 것과 거의 동일한 방식으로 디렉토리를 관리한다.
  • 이러한 테이블은 opendir(), readdir() 및 closedir() 함수를 사용하여 액세스할 수 있다.

Example of diretory code

Devices

  • One of the neat aspects of UNIX is that any peripheral, device, or piece of hardware connected to the computing system can be accessed as if it was a file
  • This concept is often referred to as “file-based I/O”
    • An I/O transaction with a device is handled similarly to an I/O transaction with a file. They both make use of streams and buffers, and use the same I/O functions
  • UNIX의 깔끔한 측면 중 하나는 컴퓨팅 시스템에 연결된 모든 주변 장치, 장치 또는 하드웨어 조각을 파일처럼 액세스할 수 있다는 것이다.
  • 이 개념은 종종 "파일 기반 I/O"라고 불린다.
    • 장치와의 I/O 트랜잭션은 파일의 I/O 트랜잭션과 유사하게 처리된다. 둘 다 스트림과 버퍼를 사용하며 동일한 I/O 기능을 사용한다.

Device Driver

  • A device driver is a set of functions used to access a device
    • open(), close(), read(), write(), lseek(), dup(), …
  • The functions associated with a particular device are executed when the device is accessed through its device filename
  • A device driver layer within a kernel I/O structure
    • Making the kernel I/O subsystem independent of the hardware
      • -> simplify the job of the OS developer
  • 장치 드라이버는 장치에 액세스하는 데 사용되는 기능의 집합이다.
    • 열기, 닫기, 읽기, 쓰기, 찾기, 사기 …
  • 특정 장치와 관련된 기능은 장치 파일 이름을 통해 장치에 액세스할 때 실행된다.
    • 커널 I/O 구조 내의 디바이스 드라이버 계층
    • 커널 I/O 하위 시스템을 하드웨어와 독립적으로 만들기
    • -> OS 개발자의 작업 단순화

  • Most operating systems have an escape (or back door) that transparently passes arbitrary commands from an application to a device driver
    • In UNIX, this system call is ioctl(), which enables an application to access any functionality that can be implemented by any device driver, without the need to invent a new system call
  • 대부분의 운영 체제에는 응용 프로그램에서 장치 드라이버로 임의 명령을 투명하게 전달하는 이스케이프(또는 백도어)가 있다.
    • 유닉스에서 이 시스템 호출은 ioctl()로, 응용 프로그램이 새로운 시스템 호출을 발명할 필요 없이 모든 장치 드라이버에 의해 구현될 수 있는 모든 기능에 접근할 수 있게 한다.

ioctl()

  • Synopsis
    • #include <sys/ioctl.h>
      • int ioctl(int fd, unsigned long request, …);
  • Description
    • The ioctl() system call manipulates the underlying device parameters of special files. In particular, many operating characteristics of character special files (e.g., terminals) may be controlled with ioctl() requests
    • The 1st argument fd must be an open file descriptor (= a device identifier that connects the application to the driver)
    • The 2nd argument is a device-dependent request code (= an integer that selects one of the commands implemented in the driver)
    • The 3rd argument is a pointer to an arbitrary data structure in memory that enables the application and driver to communicate any necessary control information or data
  • 시놉시스
    • #sys<sys/ioctl.h>h>
      • int ioctl(intfd, unsigned long request, ...);
  • 설명
    • ioctl() 시스템 호출은 특수 파일의 기본 장치 매개 변수를 조작한다. 특히, 문자 특수 파일(예: 단말)의 많은 작동 특성은 ioctl() 요청으로 제어될 수 있다.
    • 첫 번째 인수 fd는 open file descripter여야 한다(= 응용 프로그램을 드라이버에 연결하는 장치 식별자).
    • 두 번째 인수는 device-dependent request code(= 드라이버에 구현된 명령 중 하나를 선택하는 정수)이다.
    • 세 번째 인수는 응용 프로그램과 드라이버가 필요한 제어 정보 또는 데이터를 통신할 수 있도록 하는 메모리의 임의 데이터 구조에 대한 포인터이다.

Major/minor number

  • The device identifier in UNIX/Linux is a tuple of “major and minor” device numbers
    • Major number is the device type, and it is used by the OS to route I/O requests to the appropriate device driver
    • Minor number is the instance of that device, and it is used to provide a unique ID for multiple device filenames that use the same device driver functions.
  • UNIX/리눅스의 장치 식별자는 "major and minor" 장치 번호의 튜플입니다.
    • Major number는 장치 유형으로, OS에서 I/O 요청을 적절한 장치 드라이버로 라우팅하는 데 사용된다.
    • Minor number는 해당 장치의 인스턴스이며, 동일한 장치 드라이버 기능을 사용하는 여러 장치 파일 이름에 대한 고유 ID를 제공하는 데 사용된다.

The Overall Structure of Device-Driver System

  • Linux splits all devices into three classes:
    • Block devices
    • Character devices
    • Network devices
  • 리눅스는 모든 장치를 세 개의 클래스로 나눈다.
    • Block devices
    • Character devices
    • Network devices

Block and Character Devices

  • Block device
    • Include a disk driver
    • Transfer a block of bytes as a unit
    • Expected to understand commands such as read(), write(), seek()
  • 블록 장치
    • 디스크 드라이버 포함
    • 바이트 블록을 단위로 전송
    • read(), write(), seek()와 같은 명령을 이해해야 함
  • Character-stream device
    • Include a keyboard, mouse, serial port, printer, audio board
    • Transfer bytes one by one
    • Commands include get(), put()
    • Libraries layered on top allow line-at-a-time access, with buffering and editing services (e.g., when a user types a backspace, the preceding character is removed from the input stream)
  • 문자 스트림 장치
    • 키보드, 마우스, 직렬 포트, 프린터, 오디오 보드 포함
    • 바이트를 하나씩 전송
    • 명령에는 get(), put()이 포함된다.
    • 맨 위에 계층화된 라이브러리는 버퍼링 및 편집 서비스(예: 사용자가 백스페이스를 입력할 때 이전 문자가 입력 스트림에서 제거됨)를 통해 한 번에 라인 액세스를 허용한다.

Network Devices

  • Because the performance and addressing characteristics of network I/O differ significantly from those of disk I/O, most OS provide a network I/O interface that is different from the read()-write()-seek() interface used for disks
    • One interface available in many OSs, including UNIX/Linux and Windows, is the network socket interface
  • Just like a wall socket for electricity (-> any electrical appliance can be plugged in), the system calls in the socket interface enable an application to
    • create a socket,
    • connect a local socket to a remote address,
    • listen for any remote application to plug into the local socket,
    • send and receive packets over the connection
  • 네트워크 I/O의 성능과 주소 지정 특성이 디스크 I/O와 크게 다르기 때문에 대부분의 OS는 디스크에 사용되는 read()-write()-seek() 인터페이스와 다른 네트워크 I/O 인터페이스를 제공한다.
    • UNIX/리눅스 및 Windows를 포함한 많은 OS에서 사용할 수 있는 인터페이스 중 하나가 네트워크 socket 인터페이스이다.
  • wall socket for electricity(-> 모든 전기 기기를 꽂을 수 있음)과 마찬가지로 소켓 인터페이스의 시스템 호출은 애플리케이션이
    • 소켓을 생성한다.
    • 로컬 소켓을 원격 주소에 연결한다.
    • 로컬 소켓에 연결할 원격 응용 프로그램을 수신한다.
    • 연결을 통해 패킷 송수신

Summary

  • Streams
    • Any input or output transaction can be viewed as a flow of bytes
  • Buffers
    • It is a temporary storage between the sender and receiver
  • Pipes
    • The process of connecting and reconnecting streams
  • Files
    • Files stored as a one-dimensional array of bytes
  • Devices
    • Devices can be accessed as though it were a file
  • 스트림
    • 모든 입력 또는 출력 트랜잭션은 바이트 흐름으로 볼 수 있다.
  • 버퍼
    • 송신자와 수신자 사이의 임시 저장소이다.
  • 파이프
    • 스트림 연결 및 재연결 프로세스
  • 파일
    • 1차원 바이트 배열로 저장된 파일
  • 장치
    • 장치는 파일처럼 액세스 가능
profile
아주대학교 수업 기록

0개의 댓글