개발자_이훈규
천천히, 빠르게. 개발자의 Repository
개발자_이훈규
전체 방문자
오늘
어제
  • 분류 전체보기 (473)
    • 티스토리 (4)
    • 개발자 뉴스 (2)
    • 소프트웨어 (203)
      • C (7)
      • c++ (25)
      • Objective-C (3)
      • Do it! 반응형 웹디자인 (4)
      • openGL (8)
      • Java (24)
      • Jni (3)
      • Android (9)
      • Wordpress (2)
      • 버그 만난 후 느낀점 (2)
      • Git (3)
      • node js (2)
      • window tablet (1)
      • HTML (3)
      • javascript (3)
      • perl (1)
      • AngularJS (0)
      • JSON (0)
      • Docker (3)
      • python (5)
      • jQuery (1)
      • MFC (4)
      • cocos studio (6)
      • Golang (1)
      • SQLite3 (0)
      • Spring Boot (8)
      • thymeleaf (0)
      • Django (0)
      • iOS (3)
      • skia (0)
      • VBA (0)
      • PHP (2)
      • Oracle (1)
      • JSP (0)
      • R (0)
    • TCP IP (2)
    • 금융 (0)
      • 금융 Study (0)
      • 금융 Archive (0)
      • 금융 Article (0)
    • 개인 프로젝트 (7)
      • gif 홈페이지 만들기 (0)
      • study app만들기 (0)
      • 크롤러 만들기 (1)
      • 카툰 홈페이지 만들기 (1)
      • 외주 홈페이지 만들기 (3)
      • 웹 홈페이지 만들기 (0)
      • 미디어 서버 만들기 (0)
      • 소개팅 어플 만들기 (0)
      • 인스타그램 풀스택 클론 코딩(인강 노트) (0)
      • 주식 모의거래 만들기 (1)
    • html php mysql (0)
    • node.Js (2)
    • 일상 (2)
    • 빈공간 uml 공부 (0)
    • Ubuntu(linux) (12)
    • 맥OS (10)
      • android 설치하기 (2)
    • Programming quizzes (0)
    • IoT (구 유비쿼터스) (16)
      • 라즈베리 파이 (11)
      • 아두이노 (5)
    • 하드웨어 (5)
      • 아수스 비보탭 노트8 asus vivotap no.. (2)
      • 크레마 카르타 (3)
    • 분석할 문장, 구문, 코드 (0)
    • 키보드 (1)
      • 해피해킹 (1)
    • 코드 라이언 (0)
    • 전자기기 (4)
    • Ted (0)
    • NAS (0)
    • 알고리즘 (0)
    • 연합인포맥스 (0)
    • 이벤트 응모함 (4)

블로그 메뉴

  • 홈
  • 태그
  • 미디어로그
  • 위치로그
  • 방명록

공지사항

인기 글

태그

  • 방법
  • 설치
  • 개발
  • 코드
  • CODE
  • install
  • Java
  • 에러
  • Example
  • Python
  • 예제
  • error
  • 우분투
  • 설명
  • 소스
  • 라즈베리 파이
  • GIT
  • ubuntu
  • C++
  • C

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
개발자_이훈규

천천히, 빠르게. 개발자의 Repository

소프트웨어

[linux] 파일 디스크립터 테이블

2014. 2. 7. 17:16
리눅스는 다양한 파일시스템을 지원하며, 그 파일시스템 위의 파일이 동일하게 보이게 하기 위하여 VFS(Virtual File System)을 사용한다. 사용자 프로세스는 커널을 통하여 디스크의 파일에 접근한다. Process-FDT(File Descriptor Table)-FT(File Table)-VFSIT(VFS inode Table)-FS(File System)으로 이어지는 전송과정을 거친다. 밑줄 친 부분에 대해 자세히 알아보자
 
* VFS inode Table
리눅스에서는 하나의 파일이 파일데이터와 그 데이터에 관련된 inode(속성정보)로 구성된다. inode 테이블은 현재 시스템 상에 존재하는 프로세스들이 열어서 사용하고 있는 파일들의 inode정보를 갖는 테이블이다. 프로세스가 파일을 열면 커널은 inode 테이블에 빈 엔트리를 할당하고 디스크로부터 그 파일의 속성정보를 가져와 저장한다. 하나의 파일에 대해서 하나의 inode 테이블 엔트리만 존재할 수 있기 때문에 하나의 파일을 두번 이상 동시에 열 때에는 이미 할당된 inode 엔트리를 공유한다. inode 정보에는 다음과 같은 것들이 있다.
 
장치 번호 - 이 파일이 있는 디스크의 장치번호
inode번호 - inode를 식별하기 위한 번호로 한 디스크내의 모든 inode들의 번호는 고유하다.
모드 - 파일종류(파일,디렉토리등)과 접근권한(rwx)
uid, gid - 소유자와 그룹의 id
실제 장치 번호 - 파일 종류가 장치파일인 경우 실제 장치 번호
파일 크기 - 파일에 저장된 데이터의 바이트
파일 접근 시간- 최종접근, 데이터변경, 속성변경시간
i_count(참조 카운터) - 이 inode를 가리키는 파일 테이블 엔트리의 수.

* 파일 테이블
현재 열려있는 파일의 읽기/쓰기 동작을 지원하기 위한 자료구조. open()이나 creat()시스템 콜에 의해 파일이 열릴 때마다 하나씩 할당되고 close()시스템 콜에 의해 닫을 때 해제된다. 따라서 하나의 파일에 대해 동시의 여러개의 파일테이블 엔트리가 존재할 수 있다. 테이블 엔트리에는 다음과 같은 정보가 들어간다
 
열기모드 - 읽기전용(O_RDONLY), 읽기/쓰기(O_RDWR), 쓰기전용(O_WROnLY)등의 모드
플래그 - 부가적 특성(O_ASYNC, O_NONBLOCK 등)
읽기/쓰기 위치(f_pos) - 현재 읽기/쓰기 위치
f_count(참조 카운터) - 이 엔트리를 가리키는 파일 디스크립터 테이블 엔트리의 수
 
* 파일 디스크립터 테이블
이 테이블은 프로세스마다 하나씩 가지는 것으로 프로세스가 사용중인 파일을 관리하기 위한 테이블이다. 크기가 256이고 파일 테이블에 대한 포인터를 저장하는 배열이다. 프로세스가 open(), creat(), dup() 등의 시스템 호출을 할 때마다 하나의 빈 엔트리가 할당되고 해당하는 파일테이블에 대한 포인터가 들어간다. open(), creat(). dup()에 의해 반환되는 파일 디스크립터는 이 배열의 인덱스이다. close() 시스템 콜에 의해 엔트리가 제거된다
 

* 예를 들어 "file1"이라는 파일을 열기위한 fd1=open("file1", O_RDONLY) 시스템 콜은 커널 내에서 다음과 같은 일을 한다.
 
1. 디스크에서 파일(file1)을 찾아 그 inode 정보를 가져와 inode 테이블의 빈 엔트리를 채우고 참조 카운터(i_count)를 1로 한다. 그 파일의 inode 정보가 이미 테이블에 있으면 새로운 엔트리를 할당하지 않고 참조 카운터만 증가시킨다.
2. inode에 있는 접근 권한이 열기 모드를 허용하는지 조사한다.
3. 파일테이블 엔트리를 할당하고 읽기/쓰기위치(f_pos)를 0으로 한다. (만약 열기모드에 O_APPEND가 있으면 f_pos를 파일 크기와 같게 한다.) 그리고 참조 카운터(f_count)를 1로 한다.
4. fd 테이블을 처음부터 탐색해서 사용되지 않는 영역에 파일 테이블 엔트리의 포인터를 기록하고, 그 인덱스를 반환한다.

응용 프로세스가 파일을 열거나 생성하게 되면 정수로 된 파일 디스크립터를 얻게 되는데 이 파일 디스크립터는 이후에 일어나는 모든 파일 동작 즉, 읽기(read()), 쓰기(write()). 파일 동작제어(fcntl()), 파일 닫기(close())등의 동작에서 그 파일을 가리키는데 사용된다. 대부분의 리눅스 프로세스에서 파일디스크립터 0은 표준입력, 1은 표준출력, 2는 표준 오류장치를 나타내도록 미리 열려 있다. 이중 표준 입력 장치는 키보드, 표준 출력/오류장치는 모니터를 나타낸다
 
파일 테이블 엔트리는 파일을 열 때마다 새로 할당되고 파일 디스크립터 테이블의 엔트리는 파일 디스크립터가 새로 생성될 때마다 새로 할당된다. 한편 파일 닫기 동작 close()는 open()의 반대 과정을 수행한다. 먼저 디스크립터 테이블에서 해당 포인터를 지우고 파일테이블의 f_count를 감소시킨다. f_count가 0이 되면 이 엔트리를 해제하고 다시 inode 테이블의 i)count를 감소시킨다. inode테이블의 i_count가 0이되면 이 엔트리를 해제한다


http://frontjang.info/132

저작자표시 비영리 (새창열림)

'소프트웨어' 카테고리의 다른 글

[c++] 상속이란 무엇인지는 아는데, 어떻게 쓰는 것인가?  (0) 2014.02.13
[c언어] thread의 상태를 확인해보자  (0) 2014.02.11
setting up NFS HOW TO  (0) 2014.02.07
minicom에 대해서  (0) 2014.02.07
[git] 이전에 commit한 소스 가지고 오기  (0) 2014.02.06
    '소프트웨어' 카테고리의 다른 글
    • [c++] 상속이란 무엇인지는 아는데, 어떻게 쓰는 것인가?
    • [c언어] thread의 상태를 확인해보자
    • setting up NFS HOW TO
    • minicom에 대해서
    개발자_이훈규
    개발자_이훈규
    혼자 꽁양꽁양 개발하면서 놀아요~ - 노트같은 블로그

    티스토리툴바