1. file Descriptors
- non negative integer
- 파일에 할당된 고유번호
- 0 -> standard input
- 1 -> standard output
- 2 -> standard error
- 파일을 여는 POSIX 함수
- READ_ONLY, WRITE_ONLY , BOTH OF THEM 가능
- O_DSYNC : 하드웨어 I/O 종료시 까지 대기 하지만 file attribute가 업데이트되게까지 기다리지는 않는다. (데이터 동기화)
- O_RSYNC : 다른 프로세서나 파일에 연관된 write가 종료될때까지 read function을 대기시킨다.( 읽기 동기화)
- O_SYNC : O_DSYNC와 동일하며 file attribute까지 업데이트시킨다.
- 파일을 생성하고 open 할 수 있는 POSIX 함수
- open한 파일을 닫아주는 함수
5. lseek
10. dup and dup2
- 해당 파일의 특정지점으로 이동시켜주는 Posix function
- lseek (filedes, offset , whence)
- whence
- SEEK_SET : offset 참고
- SEEK_CUR : 현재 위치 + offset
- SEEK_END : 마지막 위치 + offset
6. read / write
- open 된 파일을 읽거나 쓰는 function
- standard I/O , unbuffered I/O
7. I/O Efficiency
- 데이터를 하나씩 가져오는 것보다 버퍼를 이용하여 I/O를 블럭단위로 가져오는 것이 더 효율적이다.
- buffered I/O가 더 효율적인 형태임.
8. File Sharing
- 각 프로세는 process table 을 가지고 있으며, 테이블 안에는 file descriptor flag, A pointer to a file table entry를 가지고 있다.
- process table
- file descriptor flag : 다방면의 file descriptor를 저장하는 공간
- A pointer to a file table entry: 파일테이블을 가리키는 포인터
- file table
- file status flag : I/O 방식을 제어 ex) non-blocking, sync etc....
- current file offset : 파일의 위치
- poiter to the v-node/i-node table entry for the file : 물리적인 파일의 위치정보를 가진 노드에 대한 포인터
9. Atomic operation
- 두개의 프로세스가 하나의 function에 접근할때 레이스컨디션이 발생하지 않는 최소한의 연산.
- Atomic 하게 함수를 작성하는 방법
- Atomic operation 제공하는 함수들을 사용
- 이 연산이 발생되는 동안 인터럽트가 발생되지 않는다.
- 현재 파일의 offset 이 업데이트 되지 않는다.
- 존재와 생성을 조합하는 경우
- open 함수를 통해 존재여부를 묻고 생성을 조합하는 경우 atomic 보장된다.
- 두개의 프로세스가 인터럽트인해 open함수를 동시에 통과한다고 해도 하나의 프로세스가 error를 보내주어야만 create 함수를 호출하게 하는 조합형식이다. 즉 최악의 경우는 두개 프로세스가 open하지 못하거나 적어도 두 프로세스 중 하나가 파일을 만들어서 열게된다.
- 현존하는 파일디스크립터를 복사하는 함수
- 파일테이블 자체를 복사하는 것이 아닌 파일테이블 포인터 참조를 가져오는 형태
- dup(filedes)
- dup2(filedes1 , filedes2 )
- dup2 는 atomic 함수
- 기존의 파일디스크립터를 닫고 새로 연결해주는 함수를 요청하기 떄문에 그 두연산중 인터럽트가 발생하는 것을 막기위해 atomic 함수로 작성한것으로 판단
11. sync, fsync, fdataSync
- I/O 다수 발생하면 write를 다수 발생시키기 보다는 메모리 버퍼에 유지하고 필요부분만 쓰는것이 더 효율적이다. 이러한 방식을 캐싱이라고 하는데, 나중에 쓰여진 데이터가 하드디스크에 실질적으로 써지는 것을 DELAYED WRITE라고 한다.
- delayed write 3가지 방식이 존재
- sync : 30초 마다 주기적으로 업데이트하여 모든 I/0를 하드디스크로 쓴다. 실질적으로 데이터가 다 쓰기까지 기다리지 않는다.
- fsync: 특정 하나의 파일이 다 쓸떄까지 기다린다.
- fdataSync : 특정 하나의 파일의 부분이 다 쓸떄까지 기다린다. 파일속성을 sync대상으로 여기지 않는다.
12. functl
13. ioctl
14. /dev/fd
- 이미 열려잇는 파일속성을 제어하는 함수.
- int fcntl(filedes, cmd, argvs)
- 5가지의 일을 한다. (cmd 속성)
- 1. 존재하는 filedes 를 복사한다.(==dup , dup2)
- 약간의 차이점은 존재한다.
- 2. descriptor flag의 getter /setter
- 0 (don't close-on-exec)
- 1 (close-on-exex)
- exec family 함수 성공하면 filedes가 자동으로 close된다.
- exec family function 이란 프로세스 이미지가 새로운 프로세스이미지로 바뀌는 것을 말한다.
- 3. getter/setter of file status flag
- 파일테이블의 status flag를 바꾸어 파일제어를 담당한다.
- 4. getter/setter of ownership
- SIGIO를 받는 프로세스 아이디와 그룹아이디를 가져오거나 할당한다.
- SIGIO란 해당 파일디스크립터가 읽고 쓰기에 준비가 되었을때 보내는 시그널이다.
- 5. getter/ setter of record locks
13. ioctl
- i/o 함수의 모든것을 망라하는 함수이다.
- 터미널이라 디스크, 소켓, 마그넷테이프등 디바이스를 제어하는 함수.
14. /dev/fd
- 실직적인 file descriptor 위치는 /dev/fd로 맵핑되어있다. 예를들어 stanadard 1번 은 /dev/1 로 맵핑되어 있다.
댓글 없음:
댓글 쓰기