Reminder: A View of OS Services
- 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()
- 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
- 스트림
- 모든 입력 또는 출력 트랜잭션은 바이트 흐름으로 볼 수 있다.
- 버퍼
- 파이프
- 파일
- 장치