2015년 10월 28일 수요일

Operating System : 3 . File I/O (UnBuffered I/O)


1. file Descriptors
  •  non negative integer
  •  파일에 할당된 고유번호 
  • 0 -> standard input 
  • 1 -> standard output
  • 2 -> standard error
2. open
  • 파일을 여는 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까지 업데이트시킨다.
3. create
  • 파일을 생성하고 open 할 수 있는 POSIX 함수
4.  close
  • open한 파일을 닫아주는 함수
5. lseek 

  • 해당 파일의 특정지점으로 이동시켜주는 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 : 물리적인 파일의 위치정보를 가진 노드에 대한 포인터
[file Sharing]

9. Atomic operation
  • 두개의 프로세스가 하나의 function에 접근할때 레이스컨디션이 발생하지 않는 최소한의 연산.
  • Atomic 하게 함수를 작성하는 방법
    • Atomic operation 제공하는 함수들을 사용 
      • 이 연산이 발생되는 동안 인터럽트가 발생되지 않는다.
      •  현재 파일의 offset 이 업데이트 되지 않는다.
    • 존재와 생성을 조합하는 경우
      • open 함수를 통해 존재여부를 묻고 생성을 조합하는 경우 atomic 보장된다. 
      • 두개의 프로세스가 인터럽트인해 open함수를 동시에 통과한다고 해도 하나의 프로세스가 error를 보내주어야만 create 함수를 호출하게 하는 조합형식이다. 즉 최악의 경우는 두개 프로세스가 open하지 못하거나 적어도 두 프로세스 중 하나가 파일을 만들어서 열게된다.

10. dup and dup2

  •  현존하는 파일디스크립터를 복사하는 함수
    • 파일테이블 자체를 복사하는 것이 아닌 파일테이블 포인터 참조를 가져오는 형태
  • 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 

  • 이미 열려잇는 파일속성을 제어하는 함수.
  • 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 로 맵핑되어 있다. 

댓글 없음:

댓글 쓰기