[9. 가상메모리]
[9.1 메모리 크기 한계의 극복과 가상 메모리]
가상 메모리는 하드 디스크를 스왑 디바이스로 사용하여 메모리 용량제한을 극복하는 방법이다. 보통 세그먼트 단위와 페이지 단위로 page-in, page-out을 한다.
이것을 담당하는 주체를 스와퍼라한다. 페이지 단위로 할때는 페이져라고 한다.
[9.2 디멘드 페이징]
현재 실행에 요구 되는 페이지만 메모리에 상주 시키고 아닌것은 디스크로 swap-out 하는 것을 말한다. 실행에 필요한 페이지를 미리 메모리에 적재 하는것이
아니라 실행 시점에 메모리를 검사하고 없으면 디스크에서 swap-in 한다. 이때 메모리가 부족하면 적절한 기준하에 다른 페이지를 swap-out한다.
[9.3 스왑 디바이스의 페이지 저장 방식]
크게 두가지가 있다.
첫째, 일정 크기의 스왑 디바이스를 잡아 사용하는 방법.(스왑 디스크의 크기가 고정되는 문제점이 있지만 연속된 블록으로 할당하여 read-write 속도를 올릴수있다.)
둘째, 파일을 잡아 그 크기를 가변적으로 사용하는 방법.(스왑 디스크의 크기가 고정되지 않아 하드 디스크가 허가 되는한 사용할수 있다.)
보통은 일정크기를 잡아서 사용하다가 용량이 오버되면 두번째 방법을 사용 하는 방식을 많이 사용한다.
스왑할때 코드 영역은 안변하니깐 스왑 아웃할필요 없이 지워버리면 된다. 그리고 스왑인할때는 그냥 원본 프로그램에서 읽으면 된다. 데이터 영역또한 변했으면
스왑 아웃해도 변하지 않았으면 스왑아웃안한다. 이것을 어떻게 아느냐...페이지 테이블을 조사해서 알수있다.
[9.4 페이지 폴트 처리]
[9.4.1 페이지 테이블과 페이티 폴트]
논리적 주소는 다음과같이 구성된다(16bit)
-----------------------------
| p(4bit) | d(12bit) | (p:프레임번호, d:offset)
-----------------------------
페이지 테이블은 다음과 같이 구성된다(16bit)
------------------------------------
| f(4bit) | ?(8) D(1) A(1) W(1) V(1) | (f:프레임번호, D:dirty bit, A:access bit, W:write bit)
------------------------------------
*[9.4.2 페이지 폴트의 처리]
페이지 폴트 처리를 순서대로 나열해 본다....간단히....
1) 어떤 프로세스P가 P의 전역변수 영역 0x6333을 읽을려고 한다.
2) MMU에 의하여 주소 오류 인터럽트가 발생한다.
3) 인터럽트가 발생하여 시스템 모드로 전환하고 해당 인터럽트 처리루틴이 실행된다.
4) 0x6333번지가 P의 정상적인 주소인지 검사한다.
5) 정상적인 주소라면 메모리에서 비어있는 부분을 찾아 (여기선 10번 프레임 0xA000) 그 주소를
P에게 할당한다.
6) 스왑 디바이스에게 6번페이지에 해당하는 부분을 찾아 디스크 제어기에서 0xA000 부분서 부터
채우게 한다.
7) P를 대기상태로 전환하고 다른 프로세스로 문맥교환을 시킨다.
8) P의 6번 페이지가 모두 읽혀졌으면 디스크는 인터럽트를 발생시킨다.
9) 다시 시스템 모드로 전환되고 운영체제의 디스크 인터럽트 처리 루틴이 실행
10) 읽기완료된 페이지는 P의 6번페이지 인지 확인하고 0xA003으로 수정한다.
11) P를 실행가능 상태로 전환한다.
12) P는 차례가 되면 다시 0x6333을 읽을려고 한다.
13) MMU는 논리적 주소 0x6333으로 물리적 주소 0xA003을 변경하여 전송한다.
14) 프로세서는 최종적으로 0xA333번지의 내용을 읽어낸다.
[9.5 디멘드 페이징으로 인한 시스템 성능 저하]
실효 메모리 접근시간(EAT) = (1-p)*(메모리 접근시간)+p*(페이지 폴트 발생 오버헤드 + 한페이지 스왑아웃 시간 + 한 페이지 스왑인 시간 + 프로세스 실행 재개 오버헤드 + 메모리 접근시간)
[9.6 페이지 교체 알고리즘]
페이지 교체: 메모리가 꽉차면 일정부분을 스왑 아웃하고 사용될 부분을 스왑인 해야하는데 이러한것을 페이지 교체라고 한다.
이전에 설명했듯이 스왑인 된것중에 한번도 데이터가 변하지 않은것은 스왑 아웃할 필요가없다. 그런데 이것을 어떻게 아느냐..dirty 비트를 통해 알수있다.
즉 내용이 바뀌지 않았으면 0, 바뀌었으면 1로 셋팅해 놓기 때문이다.
1)FIFO: 가장 단순하게 생각할수있는것으로 처음 스왑인 된거서부터 스왑 아웃되는것이다.
2)LRU(least recently used): 사용된지가 오래된것을 스왑 아웃하는것이다. 이것을 구현 하기위해
서는 페이지 테이블에 메모리 접근시간을 기록하는 부분이필요하다
3)에이징(Aging): LRU를 근사하게 구현한것으로 LRU는 전부다 시간을 기록하는 반면, 에이징은
모든 페이지들을 일정시간후 A비트를 0으로 바꾼후 여기서 1로 바뀌는 부분만 시
간을 업데이트한다.
4)NRU(not recently used): 에이징을 더욱 간단하게 한것으로 이것은 시간을 기록하지 않는다. A
비트만 사용하여 단순하게 최근에 사용한것과 안한것을 양분한다. 이
후 D비트를 추가하여 결정하는데 사용한다.
5)이차기회: 이것은 페이지 교체가 필요한 시점에 A비트를 순차적으로 검사하여 최초로 0값이 검
사되는 페이지를 스왑아웃 한다.
6)워킹 셋: 에이징과 비슷하게 A비트가 1이었던것의 시간을 갱신하지만 차이는 워킹셋은 현재 실
행되고 있는 프로세스에 대해서만 적용시킨다.
7)WSClock:
[9.7 디멘드 페이징에서 고려해야 할 사항들]
1)스왑아웃 대상 페이지 선택 범위: 스왑아웃 대상을 하나의 프로세스를 한 단위로 볼것인지 메모
지 전체를 대상으로 할것인지를 고려해야한다.
2)프로세스 개수: 전체적으로 실행시킬수 있는 프로세스의 갯수에 적절한 제한값을 부여할 필요가
있다.
3)페이지 크기: 페이지 크기가 크면 페이지 테이블이작아지고 페이지 크기가 작으면 내부 단편화
를 막을수 있는등 고려해야 할것이 많다
4)입출력 인터락: 만약 입출력 버퍼를 스왑 아웃시키면 입출력 디바이스는 입출력 작업이 끝날때
까지 그 메모리를 사용하기에 인터락문제가 발생.
해결방안:첫째, 입출력 버퍼는 스왑아웃 대상에서 제외시키는 방법. 둘째, 커널 버퍼영역에서 작
업하도록 한는 방법.
[9.8 디멘드 세그멘테이션]
이것은 디멘드 페이지에서는 페이지 단위로 하듯이 여기서 세그먼트 단위로 한다는 차이점만이 있다.
[10. 파일 시스템과 파일 보호]
[10.1.1 파일과 파일 시스템]
저장 매체인 디스크상에 체계적으로 파일들을 기록하고 관리하는 방식을 총체적으로 지칭하는 것이다.
[10.1.2 파일 속성]
이름, 종류, 보호, 시간, 크기, 블록 위치
[10.1.3 파일 작업]
생성, 삭제, 읽기, 쓰기, 크기 조정, 속성수정, 열기/닫기, 위치이동
[10.1.4 물리적 디스크와 파티션]
하나의파티션은 디렉토리 영역과 데이터 영역으로 나뉘어진다.
[10.2.2 객체별 접근 목록과 도메인별 권한 목록]
파일뿐만 아니라 입출력 장치들이나 논리적인 객체들에대해 접근 행렬로 표시할수 있다.
1)객체별 접근 목록 2)도메인별 접근 목록 으로 나뉘어지고 유닉스는 객체별 접근 목록으로 관리한
다.
자세한 그림은 p242페이지
[10.3.1 파일 제어블록]
파일들의 속성은 파일제어블록(FCB:File Control Block)으로 관리되어진다.
[10.4 디렉토리의 구조]
디렉토리 구조는 평면 구조와 트리 구조가 있다. 보통 트리 구조를 많이 사용한다.
평면 구조는 하나의 파티션에 하나의 디렉토리가 있는 형태로 초기 형태이다. DOS가 이러했다.
트리 구조는 하나의 파티션에 여러개의 디렉토리가 존재하고 이들간에 트리 구조의 상하관계를 가진다.
심볼릭 링크: 심볼릭 링크는 다른 파티션에서도 생성이 가능하다. 이것은 데이터 부분에 원래 파일의 경로를 저장하고 있어 심볼릭 링크로 파일을 열게되면 시스템
은 데이터부분에서 패스를 읽어와 패스를 따라가 원래파일을 이용하여 open 을 한다.
하드 링크: 하나의 동일한 FCB영역내에서 여러개의 파일 경로를 가질수 있도록 해주는 것이다. 다른 파티션내에서는 생성이 불가능하다.
inode: 파일의 고유번호...
[10.5 파일블록의 할당 방식]
1)인덱스 블록 할당: 할당된 블록의 번호를 FCB에 배열형태(인덱스 테이블 형태)로 저장한다.
장점: 임의위치 접근이 빠르다, 블록들의 위치가 FCB에 있음으로 안정적이다.
단점: 파일 사이즈가 제한을 받는다, 디스크 공간의 효율적 사용(임의의 빈 블록을
할당할수 있다)
2)연속된 블록 할당: 블럭의 시작 주소와 크기만을 FCB에 기록한다.
장점: 파일 크기를 크게할수있다, 임의 위치 접근이 빠르다
단점: 반드시 파일 전체를 기록할수 있는 크기여야 한다(디스크 공간의 비효율적 사
용)
3)연결된 블록 할당: FCB에는 시작 주소만 있고 데이터 영역에 4바이트를 할당하여 다음 블럭의
위치를 가르킨다.
장점: 파일 크기에 제한이 없다, 디스크 공간의 효율적 사용(임의의 빈 블록을 할당할수 있다)
단점: 임의 위치접근에 부하가 많이 걸린다(처음 부터 차례차례 검사해야하니깐), 디스크 입출력
속더가 느리다, 파일이 불안정하다(하나의 포인터가 깨지면 전체화일이 깨짐)
[10.6 실제 운영체제의 블록 할당 방식]
UNIX: 인덱스 블록 할당 방식을 사용한다. 이유는 빈번한 파일위치 변경과 임의 접근 때문이다. 여기서 파일 크기의 한계를 극복하기 위해서 다단계 인덱스 블럭을 사용한다.
WINDOWS: 기본적으로 연결된 블록 할당 방식을 사용한다. 단점인 임의 접근 속도를 높이기위해 FAT영역을 두어 블록간의 연결정보를 한꺼번에 저장해둔다.
그리고 시스템 구동시 이것을 메인메모리에 상주시킨다. 빠른 검색을 위하여
[10.7 빈블록들의 관리]
1)연결된 블록 할당: 이전에 연결된 블록 할당 방식으로 빈블록을 기록해 두는것이다. 빈블록은 임
의 접근이 필요 없기에 유용하다 unix에서 사용
2)비트맵 할당: 파티션의 앞부분에 비트맵 부분을 할당하여 여기에 하나의 블럭당 1비트를 할당해
1이면 사용, 0이면 사용안함을 표시한다. linux(ext2)와 MacOs에서 사용
[11. 디스크 입출력 및 스케줄링]
[11.5 디스크 스케줄링]
FCFS: 요청한 순서대로 처리한다.
SSTF: 대기큐에 있는 블록들중 현재 헤드에 가장 가까운 블록부터 처리한다.
문제점: 가까운 것만 처리하다보니 멀리있는 것은 계속 처리가 안될 기아현상이 발생할수 있
다.
SCAN: 헤드가 좌우로 왔다갔다하면서 걸리는것들을 차례로 처리한다.
문제점: 기아 문제는 해결했지만 처리 속도가 상당히 늦게 되고 양단끝이 중간 보다 처리율이
현저히 떨어지게 된다.
LOOK: SCAN을 약간 수정한 것으로 SCAN에서 우측으로 이동중 더이상 우측에서 처리할게 없으면
끝까지 가지 않고 좌측으로 방향을 트는방식
C-SCAN: SCAN 방식은 중간에 위치한것이 좌우 끝에꺼보다 2배가량더많이 처리하게 되는 문제점
을 고친것이다. 즉 단일 방향..즉 우측으로 읽고 다시 좌측으로 갈때는 읽지 않고 그냥 건
너뛴다.
문제점: SCAN의 양끝간 처리율은 해결했지만 너무 느린 처리 속도가 문제가된다.
C-LOOK: C-SCAN에 기존의 LOOK 방식을 적용시킨것. 일반적으로 많이 사용되는 방식
[11.8 디스크 입출력의 성능개선 방안들]
디스크 캐시(Disk Cache):디스크 읽기나 쓰기후 그 내용을 커널의 버퍼에 저장해 놓았다가 동일한 내용의 요청이 오면 버퍼에서 읽어 사용하는 방식.
지연기록(Delayed write):쓰기 작업이 요청되면 그내용을 실제로 디스크에 쓰지 않고 메모리에 써놓았다가 그 내용이 수정되면 메모리의 내용을 고치고 최종적인 값만을 디스크에 기록 디스크 접근 횟수를 줄임으로써 속도는 빨라 질수 있지만 갑작스런 정전에 메모리에 있던 데이터가 날라갈수 있다.
클러스터(Cluster):연속된 블록의 그룹으로 순차 접근이 필요할때 사용된다.
조각모음: 흩어져 있는 블럭들을 하나로 모으는 작업
/*가상 메모리와 디스크 입출력에 대한 내용*/