System-Level I/O
Unix I/O | 파일은 연속된 m개의 바이트 파일을 열때 응용 프로그램은 커널에 I/O 디바이스를 식별할 수 있는 식별자(descriptor) 라고 하는 비음수를 리요청한다. 이 식별자는 표준입력(0번) 표준출력(1번) 표준에러(2)로 이루어진 기본 식별자를 가지고 있으며 프로그램의 요청에 의해 식별자가 반환된다. 실제 파일의 끝에서 EOF라고 알려진 조건이 발생하면 파일이 종료된다. |
파일 | 디렉토리는 링크들의 배열로 구성된다. . (점 한개)는 자신의 디렉토리로의 링크이고 ..(점 두개)는 부모 디렉토리로의 링크다. |
RIO 패키지를 이용한 안정적인 읽기와 쓰기
RIO 패키지 | 짧은 카운트를 자동으로 처리하며 네트워크 프로그램으로 인한 통신에서 자료의 손상이 이뤄지지 않게 안정적으로 효율적인 입출력을 제공한다. |
버퍼 없는 출력 함수 | 버퍼링 없이 직접 데이터를 전송한다. 네트워크에서 바이너리 데이터를 읽고 쓸때 유용함 |
버퍼를 사용하는 입력함수 | 버퍼에 캐시되어 있는 파일의 바이너리 데이터를 효율적으로 읽도록 해주며, RIO 함수들은 같은 식별자에서 임의로 중첩될 수 없기 때문에 thread-safe하다. |
Rio 버퍼 없는 입력 및 출력 함수 | rio_readn 함수는 식별자 fd의 현재 파일 위치에서 메모리 위치 usrbuf로 최대 n바이트를 전송한다. rio_readn 함수는 EOF를 만나면 짧은 카운트만을 리턴하지만 rio_writen 함수는 절대로 짧은 카운트를 리턴하지 않는다. 이 함수들은 같은 식별자에 대해서 임의로 중첩될 수 있다. |
Rio 버퍼를 통한 입력 함수 | 버퍼 없이 입출력하는 함수는 문제가 한줄한줄을 읽어올 때마다 커널에 트랩을 요청해야 한다는 단점이 있음. 이를 보완하기 위해 텍스트 라인 전체를 내부 읽기 버퍼에 복사하는 래퍼함수를 사용해 한번의 요청으로 보다 많은 텍스트를 전송할 수 있음. rio 타입의 읽기 버퍼에 값을 담아놓고 한줄한줄 usrbuf에 담아주는 방식. 코드를 보면 반복문을 사용해 한번에 여러줄의 data를 받아오고 이를 버퍼에 담아주는 것을 확인할 수 있다. |
파일공유
식별자 테이블 | 각 프로세스는 자신만의 별도의 식별자 테이블을 가지고 있다. 이 테이블의 엔트리는 요청해서 받아온 fd로 진입하며 식별자 테이블 엔트리와 파일 테이블 엔트리를 이어주는 역할을 함 |
파일 테이블 | 파일 테이블은 포든 프로세스들이 공우하는 한개의 파일 테이블을 가르키는데, 각 파일의 위치, 현재 가르키고 있는 식별자 엔트리들의 참조 횟수, V-node 테이블의 엔트리 포인터로 구송된다. 식별자를 닫으면 관련 파일 테이블 엔트리에서 참조 횟수를 감소시키고, 참조 횟수가 0이 되면 파일 식별자 테이블에서 내린다. |
V-node 테이블 | 파일 테이블처럼 v노드 테이블은 모든 프로세스들이 공유한다. 각 엔트리는 파일 구조 내의 대부분의 정보를 가지고 있다. |
I/O 재지정
dup2 함수 | 웹에서 CGI 프로그램을 클라이언트 대신 돌릴때, 웹 서버는 fd의 제어를 담당해야 한다. dup2 함수는 식별자 테이블 엔트리의 이전 내용을 덮어 써서 식별자 테이블 엔트리를 새로운 식별자 테이블 엔트리로 복사한다. 약간 제어의 이동이 생각난다 |
'Krafton_Jungle > Study' 카테고리의 다른 글
Krafton_jungle 5기 7주차 WIL - Network Programming (0) | 2024.05.08 |
---|---|
Krafton_jungle 5기 7주차 WIL - Tiny web server (0) | 2024.05.06 |
Krafton_jungle 5기 7주차 WIL - OSI 7계층 (2) | 2024.05.02 |
Krafton_jungle 5기 6주차 WIL - Exceptional Control Flow (0) | 2024.05.01 |
Krafton_jungle 5기 6주차 WIL - The Memory Hierarchy (3) | 2024.04.30 |