나누고 싶은 개발 이야기

Data Engineer로서 기록하고 공유하고 싶은 기술들. 책과 함께 이야기합니다.

Linux

I/O의 동작방식 이해

devidea 2020. 2. 13. 10:42

운영하고 있는 시스템에서 사용한 zero copy 개념을 습득하기에 앞서 I/O에 대한 동작 방식을 이해하기 위해 정리한 글이다.

How Java I/O Works Internally at Lower Level?의 내용을 요약한 수준이며 추가로 이해가 필요한 개념들을 다른 문서에서 발췌해서 정리했다.

 

 

I/O의 기본적인 동작방식

input/output는 버퍼로부터 데이터를 넣고 빼는 것을 의미한다.

 

Process 내부 메모리로 디스크에 저장된 데이터를 가져오는 첫 단계로 read() 시스템 콜을 한다.

그럼 커널은 디스트로부터 데이터를 커널 영역의 버퍼에 넣고 캐싱을 한다. 커널 영역에 있는 데이터를 다시 process가 요청했을 때는 버퍼에 있는 데이터를 전달한다.

 

 

Virtual Memory

Virtual Memory(가상 메모리)는 실제 물리 메모리 주소 대신 임시, 가상의 존재로 주소를 사용함을 의미한다. 2가지의 장점이 있다.

  1. 하나 이상의 가상 메모리는 동일한 물리 메모리 위치를 나타낼 수 있다.
  2. 가상 메모리 공간은 실제 사용 가능한 물리 메모리보다 클 수 있다.

 

disk controller가 user space buffer로 바로 데이터를 보내지 않는 주요한 이유는 1번 때문이다.

 

Memory Paging

Page Table로 가상 메모리가 실제 어떤 물리 메모리 주소를 가리키는지 관리한다.

Memory Management Unit (MMU)는 CPU가 알고 있는 가상 메모리 주소를 물리 메모리 주소로 바꾸어 준다.

 

가상 메모리의 Page와 물리 메모리의 Frame은 같은 크기로 나뉜다.

 

File/Block Oriented I/O

File I/O는 file system (파일 시스템) 내에서 일어난다. 파일 시스템은 disk(디스크)와는 다르다.

디스크는 sector(512 bytes)로 나눠서 데이터를 물리적으로 저장하는 것인데 파일 시스템은 디스크에 어떤 데이터가 있는지 해석하는 추상적인 개념이다.

 

파일 시스템도 Page의 개념을 가지고 있는데 Page는 Memory Page와 동일 사이즈이거나 여러 개를 합친 사이즈를 가진다.

전통적으로 파일 시스템의 사이즈는 2048 ~ 8192 bytes이다.

 

파일 시스템 I/O의 논리적 단계

  1. 요청이 어떤 파일 시스템 페이지 인지 확인한다. 여러 파일 시스템 페이지에 분산될 수 있으며 연속적이지 않을 수 있다.
  2. 식별된 파일 시스템 페이지를 보유하기에 충분한 커널 메모리 공간을 할당한다.
  3. 해당 메모리 페이지와 파일 시스템 페이지를 매핑을 설정한다. (물리 메모리에 해당 영역이 할당된 상태는 아니다)
  4. 페이지 폴트(Page Fault)를 발생시킨다.
  5. 가상 메모리 시스템은 Page Fault 포착하고 가상 메모리 공간에 물리 메모리를 할당한다.

파일 시스템은 요청 받은 파일에서 데이터를 혹은 설정 정보를 가져온다.

주목할 점은 파일 시스템은 물리 메모리에 데이터를 캐시해 둔다. 그래서 물리 메모리에 데이터가 존재한다면 디스크로부터 다시 데이터를 읽어오지 않는다.

 

 

Memory Commit

프로세스는 자신만의 작업 공간이 필요하고 그 공간은 메모리에 존재한다. 프로세스가 커널에 필요한 만큼의 메모리를 요청하면 커널은 프로세스에 사용 가능한 메모리 영역을 주고 실제로 할당은 하지 않지만 해당 영역을 프로세스에 주었다는 것을 저장해 둔다. 이 일련의 과정을 Memory Commit이라고 부른다. (리눅스 커널 이야기 발췌)

 

 

참고문서

 

반응형

'Linux' 카테고리의 다른 글

Keepalive 정리  (0) 2019.02.13