Krafton_Jungle/Study

Krafton_jungle 5기 7주차 WIL - System-Level I/O

전낙타 2024. 5. 8. 21:06

System-Level I/O

Unix I/O 파일은 연속된 m개의 바이트
파일을 열때 응용 프로그램은 커널에 I/O 디바이스를 식별할 수 있는 식별자(descriptor) 라고 하는 비음수를 리요청한다.
이 식별자는 표준입력(0번) 표준출력(1번) 표준에러(2)로 이루어진 기본 식별자를 가지고 있으며 프로그램의 요청에 의해 식별자가 반환된다.
실제 파일의 끝에서 EOF라고 알려진 조건이 발생하면 파일이 종료된다.
파일 디렉토리는 링크들의 배열로 구성된다.
. (점 한개)는 자신의 디렉토리로의 링크이고 ..(점 두개)는 부모 디렉토리로의 링크다.

 

 

RIO 패키지를 이용한 안정적인 읽기와 쓰기

RIO 패키지 짧은 카운트를 자동으로 처리하며 네트워크 프로그램으로 인한 통신에서 자료의 손상이 이뤄지지 않게 안정적으로 효율적인 입출력을 제공한다.
버퍼 없는 출력 함수 버퍼링 없이 직접 데이터를 전송한다. 네트워크에서 바이너리 데이터를 읽고 쓸때 유용함
버퍼를 사용하는 입력함수 버퍼에 캐시되어 있는 파일의 바이너리 데이터를 효율적으로 읽도록 해주며, RIO 함수들은 같은 식별자에서 임의로 중첩될 수 없기 때문에 thread-safe하다. 

 

Rio 버퍼 없는 입력 및 출력 함수

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 함수는 식별자 테이블 엔트리의 이전 내용을 덮어 써서 식별자 테이블 엔트리를 새로운 식별자 테이블 엔트리로 복사한다.
약간 제어의 이동이 생각난다