티스토리 뷰

9.7.1 Basic Mechanism

파일 메모리 맵핑은 디스크 블락을 메모리의 페이지에 매핑시킨다. 파일에 대한 read write는 일반적인 메모리 접근과 같이 다뤄지기 때문에 파일 접근과 사용을 간략화시킬 수 있다. 파일 업데이트는 modify되었는지 체크하여 os가 주기적으로 점검할 수 있다.

여러 프로세스에서 같은 파일을 접근한다면 data sharing이 가능하며 각 페이지가 frame에 연결 될 수 있다. 만약 수정이 일어나면 cow 메커니즘이 적용되어서 새로운 프레임을 할당받는다.

Memory mapping file을 공유하는 것은 공유 메모리와 비슷하지만 다른 시스템콜과 같은것을 사용한다. 하지만 어떤 os에서는 shared memory memory mapping file로 구현된다.(ex> win32api)

 

9.7.2 Shared Memory in the Win32 API

 

9.7.3 Memory-Mappeed I/O

  I/O controller는 커맨드와 데이터를 가지는 레지스터들을 가지고 있다. 그리고 CPU와 데이터 교환이 일어나는데 좀더 편리하게 하기 위해 memory mapped I/O를 이용한다. 이 경우에 메모리의 일정부분이 따로 디바이스 레지스터를 위해 할당되고 디바이스 레지스터와의 교환이 일어나게 된다. Memory-mapped I/O는 연결하기 위해 사용되는 직렬/병렬 포트와 같은 디바이스에게 편리하다. 긴 스트링을 전달하기 위해 cpu는 데이터 레지스터에 1 데이터 바이트를 보내고 바이트가 이용 가능하다는 의미로 컨트롤 레지스터를 세팅한다. 그리고 CPU는 다음 바이트를 전송한다. CPU control bit를 주기적으로 확인하는 것을 programmed I/O라 하고 인터럽트를 이용하는 것을 interrupt driven이라 한다.

 

 

9.8 Allocating Kernel Memory

커널 메모리는 일반적인 user-mode 프로세스를 위해 사용되는 리스트와 다른 free-memory pool에서 할당된다.

2가지 이유가 있다.

1. 커널은 다양한 크기의 메모리를 요구하고 어떤 것들은 페이지보다 크기가 작다. 그래서 커널은 메모리를 보존적으로 사용해야 하고 fragmentation때문에 낭비를 최소화하려고 시도해야 한다. 많은 os는 커널 코드와 데이터를 paging 시스템을 통해서 관리하지 않으므로 매우 중요하다.

2. user mode프로세스 할당되는 페이지는 연속적인 물리메모리일 필요는 없지만 특정 하드웨어 장치들은 physical 메모리와 직접 접근하고 연속적인 피지컬 메모리가 필요하다.

 

9.8.1 Buddy System

버디 시스템의 2의 제곱수로 된 크기의 사이즈로 세그먼트를 할당한다. 필요한 크기가 생기면 특정 사이즈를 2개의 버디로 나누고 또 나누고 하는 식으로 적절한 크기가 될 때까지 반복한다.

만약 메모리를 해제하면 coalescing 과정을 거쳐서 인접한 버디들을 하나의 큰 세그먼트로 합친다. 이것의 단점은 fragmentation이 매우 커질 수 잇다는 것이다.(2의 제곱수니까)

 

9.8.2 Slab allocation

slab 1개 이상의 물리적으로 연속된 페이지이고 cache 1개 이상의 슬랩들이다. 각각의 캐시는 각각의 커널 자료구조를 표현한다.(ex>세마포어, 파일 디스크립터) 각 캐시는 오브젝트들로 붐비게 된다. 오브젝트는 캐시의 인스턴스이다.

이 알고리즘은 커널 오브젝트를 저장하는 데 캐시를 사용한다. 캐시가 생성되면 free로 체크되고 캐시로 할당된다.

slab의 세 상태를 띈다.

1. Full : 슬랩의 모든 오브젝트는 used로 마크되어 있다.

2. Empty : 슬랩의 모든 오브젝트는 free로 마크되어 있다.

3. partial : 슬랩은 두 종류의 오브젝트를 모두 가진다.

우선 partial 슬랩에 자리가 있는 지 본 후 없으면 empty슬랩을 이용한다.

이 방법은 두가지 장점이 있다.

1. fragmentation때문에 메모리는 낭비되지 않는다. 각 오브젝트의 사이즈로 슬랩의 크기가 나눠지기 때문이다.

2. 메모리 요청은 빠르게 만족된다. 이 알고리즘은 오브젝트가 빨리 할당되고 해제될때 유용하다.

 

9.9 Other Considerations

9.9.1 Prepaging

프로세스가 시작할때 많은 양의 페이지 폴트가 발생한다. swap out 프로세스가 재시작할 때도 발생한다. prepaging은 이 초기 페이징을 막기위한 시도이다. 어떠한 os들은 작은 파일들에 대해 페이지 프레임들을 프리페이지 한다. 프로세스가 제시작 할때 이전의 워킹 셋을 전부 가지고 온다. 어느 경우에는 좋고 어느 경우에는 좋지 않은데 그것은 페이지 폴트 처리 비용과 프리페이징의 비용에 의해 결정된다. 프리페이징 시 실제로 사용되는 페이지의 비율이 1에 가까우면 프리페이징이 좋고 0에 가까우면 좋지 않다.

 

9.9.2 Page Size

internal fragmentation이나 locality에 있어서는 small page가 좋고, table크기나 I/O time에 있어서는 large page가 좋다.

 

9.9.3 TLB Reach

hit ratio에 관련된 것으로 TLB reach TLB에서 접근 가능한 메모리의 양을 의미하며 페이지 크기의 배수이다. 첫째로 TLB 엔트리의 수를 증가시키면 TLB reach가 늘어날 것이다 둘째로 페이지 사이즈를 증가시키면 TLB reach가 늘어날 것이다. 그래서 최근의 운영체제는 os TLB를 소프트웨어 적으로 관리하고 페이지 사이즈를 동적으로 조절한다.

 

9.9.4 Inverted Page Tables

 

 

Chapter 10 File System

10.1.1 File Attributes

-Name : 인간이 읽을수 있는 유일한 형태

-Identifier : file system에서 파일을 식별하는 유일한 tag

-Type

-Location : 디바이스와 위치에 대한 포인터

-Size : 현재 크기, 최대 크기

-Protection : 퍼미션

-Time, date, user identification

디렉토리는 파일의 이름과 identifier를 가진다.

 

10.1.2 File Operations

파일은 abstract data type이다. 그래서 operation이 필요하다.

-Create a file : 파일 시스템의 공간을 찾고 파일을 할당한다.

-Write a file : 파일의 이름과 파일 정보를 명시한 시스템 콜이 필요하다. 파일의 이름으로 파일의 위치를 찾고 write 한다.

-Read a file : 읽기 쓰기를 할 때 current operation current file position pointer로 나타낸다.

-Repositioning within a file : 디렉토리는 적절한 위치를 찾고 주어진 값으로 current file position pointer로 변경한다.

-Deleting a file : 파일을 찾고 공간을 release한다.

-Truncating a file : 데이터는 지우고 속성값만 남겨 놓는다.

위의 operation이 최소의 것들이고 더 추가될 수도 있다.

operation directory에서 파일 search를 필요로 한다. search의 반복을 피하기 위해 open 시스템 콜을 사용한다. os open-file table을 관리하며 모든 open file들이 담겨 있다. 파일 사용하기 전에 open하면 더이상 search 안해도 되고, 사용이 끝나면 close 한다. open 시스템 콜은 open-file table의 포인터를 리턴하며 이 포인터는 모든 I/O operation에 사용 된다.

멀티 프로세싱 환경에서는 open-file table을 관리하기가 힘들기 때문에 os는 두 단계의 테이블을 관리한다. internal은 프로세스 별 이고 external system-wide이다. system-wide 오픈 테이블은 open count를 관리한다.

다음과 같은 open file information이 필요하다.

-File pointer : 현재 읽고 쓰는 파일의 위치

-File open count

-Disk location of the file

-Access rights : 접근 권한이 없으면 I/O를 거부할 수 있다.

어떠한 시스템에서는 열린 파일에 대해 락을 걸고 다른 파일이 접근하지 못하도록 할 수 있다.

shared lock read lock과 유사하고 exclusive lock writer lock과 유사하다.

또한 madatory/advisory lock 메커니즘을 제공하는데 madatory는 무조건 lock해야 하는 것이다.

파일 락은 프로세스 동기화와 유사하다.

 

10.1.3 File Types

파일 타입과 동작을 나태나는 가장 쉬운 방법은 이름으로 표현하는 것이고 확장자로 표현한다. 이것은 사용자에게 어플리케이션에 대한 히트를 주기 때문에 어떤 os에서는 사용되지 않는다. 유닉스는 magic number를 가지고 있다. 확장자가 있긴 하지만 절대적인 것이 아니다.

 

10.1.4 File Structure

파일 타입은 내부 구조를 나타내는 데에도 사용될 수 있다. 파일 내부 구조를 통일함으로써 사용되는 방식을 정의할 수 있다. 한가지 단점은 os가 여러 파일 구조를 사용할 때이다. os는 각각의 파일 구조를 서포트하는 정보를 가지고 있어야 한다. 그래서 어떤 os는 파일 스트럭쳐의 최소 수를 정한다.MAC의 경우에는 두 가지 구조만을 지니며 resource fork data fork이다.

 

10.1.5 Internal File Structure

파일의 위치를 포인팅하는 것은 만약 파일의 크기가 블락(최소단위)의 크기를 넘는다면 문제가 될 수 있다. logical record의 수를 packing하는 것이 한가지 해결책이다.

블락별로 할당되기 때문에 internal fragmentation이 발생할 수 있다.

댓글