[운영체제/OS] 기억 장치
기억 장치
기억 장치 계층 구조
기억 장치의 사용 용도
가상 기억 장치(Virtual Memory)
프로그램 전체가 주기억 장치에 상주하면서 실행되는 것보다는 느리겠지만 주기억 장치를 효과적으로 사용할 수 있다는 측면에서는 최고의 기술이며 현재 대부분 이러한 방식을 채택하고 있다
가상 디스크(Virual Disk)
보조 기억 장치인 디스크 기술이 발전되기 전에는 주기억 장치의 일부를 디스크 드라이브로 분리하여 디스크처럼 사용했던 기술로, MS-DOS에서는 주기억 장치에 가상 디스크를 만들어 하드 디스크처럼 활용할 수 있게 하는 장치 제어기로 RAMDRIVE.SYS를 사용하며 지금은 보통 고장한 하드 디스크를 복구할 때 주로 사용
인터리빙(Interleaving)
주기억 장치의 액세스 속도를 빠르게 하기 위한 기술로 기억 장치의 연속된 위치를 서로 다른 뱅크로 구성하여 하나의 주소로 여러 개의 위치에 해당하는 기억 장치를 접근할 수 있도록 하는 방법
하나의 장치가 독립적인 기능을 하는 다른 장치의 상태를 검사할 수 있도록 허가하는 기법을 Polling이라 한다
DMA(Direct Memory Access)
사이클 스틸링(Cycle Stealing) 기법을 사용하여 중앙 처리 장치를 거치지 않고 직접 주기억 장치와 주변 장치 사이에서 데이터를 주고받는 입출력 제어기로 입출력에 대한 CPU의 부담을 줄이는 동시에 액세스 속도를 향상시킨다
사이클 스틸링 : 중앙 처리 장치와 입출력 장치가 동시에 주기억 장치에 접근하려고 하는 경우, 입출력 장치에 우선순위를 부여하는 것으로 적은 양의 사이클을 필요로 하는 채널에 우선순위를 높여주면 입출력 장비의 효율이 높아진다.
기억 장치의 관리 기법
주기억 장치의 다중 프로그래밍 사용 방식
제한된 주기억 장치 크기에서 다중 프로그래밍을 원만히 수행하기 위해서는 크게 두 가지 전제 조건이 있어야 한다. 하나는 주기억 장치를 여러 개의 독립적인 프로그램으로 분리해서 사용할 수 있도록 주기억 장치를 분할해야 한다는 것과 프로그램의 크기를 분할된 최대 크기보다 작거나 같도록 해야 한다는 것이다.
프로그램의 크기가 제한이 없어진 것은 가상 기억 장치를 사용하면서부터였고 주기억 장치만을 사용하는 시기에는 크기에 제한을 두었다.
고정(정적) 분할
주기억 장치의 크기를 다르게 분할하되 항상 고정된 크기를 갖는 형태로 분할하는 방식. 대부분 프로그램들의 크기가 다르기 때문에 분할된 영역의 크기는 항상 고정시키되 분할 크기를 다르게 하는 것이 유리하다.
문제는 프로그램들의 크기와 분할된 주기억 장치의 크기가 항상 같을 수는 없다는 것인데, 이런 크기 차이로 남거나 부족한 현상을 단편화(Fragmentation)라고 하며 이렇게 단편화된 주기억 장치의 영역은 통합과 집약을 통해서 재사용되어야 한다
-
내부(Internal) 단편화
정해진 크기에 프로그램을 할당하고 남은 기억 공간으로 사용되지 못하는 공간 -
외부(Eternal) 단편화
정해진 크기는 아니지만, 프로그램의 크기가 커서 기억할 수 없게 된 공간
가변(동적) 분할
고정 분할의 문제점을 보완한 방법으로 프로그램의 크기에 따라 주기억 장치 분할 크기를 동적으로 분할하는 방식.
내부 단편화 현상은 발생하지 않지만 외부 단편화는 계속 발생하며 차폐 레지스터의 값을 매번 변경해야 하기 때문에 고정 분할 방식보다 복잡하다.
-
베이스 레지스터(Base Register)
주기억 장치가 분할된 영역으로 나뉘어 관리될 때, 프로그램이 한 영역에서 다른 영역으로 옮겨지더라도 명령의 주소 부분을 바꾸지 않고 정상적으로 수행될 수 있도록 하기 위한 레지스터 -
차폐 레지스터(Fence Register)
주기억 장치가 분할된 영역으로 나뉘어 관리될 때, 분할된 영역을 다른 프로그램이 사용하지 못하도록 분할 영역의 위치를 기억하고 있어야 한다. 이를 차폐 레지스터라고 하며 고정 분할일 경우에는 차폐 레지스터에 기억된 값이 변하지 않지만 가변 분할 방식에서는 동적으로 변하게 된다 -
경계 레지스터(Boundary Register)
주기억 장치가 분할된 영역으로 나뉘어 관리될 때, 주기억 장치 내에 존재하는 프로그램은 크게 운영체제와 사용자 영역에 존재하는 프로그램으로 나뉜다. 이 때 사용자 영역에 존재하는 프로그램이 운영체제 영역을 침범하지 못하도록 하는 것이 경계 레지스터의 역할이다 -
기억 장치 보호 키(Storage Protection Key)
기억 장치 관리 기법 중 세그먼트 기법에서 사용하는 기억 장치 보호 방법이다. 주기억 장치 내에 하나의 프로그램이 여러 개의 분할된 프로그램 조각들로 분리되어 사용할 때 여러 개의 분할된 프로그램 조각들은 같은 종류의 프로그램이라는 것을 표시해야만 한다. 이러한 구분 표시는 다른 프로그램과 섞이지 않고 보호하게 된다
주기억 장치 재사용 기술
-
통합(Coalescing)
인접한 공백들을 더 큰 하나의 공백으로 만드는 과정으로 차폐 레지스터의 값을 변경하여 분할 영역의 크기를 변경하게 된다 -
집약(압축, Compaction)
서로 떨어져 있는 여러 개의 낭비 공간을 모아서 하나의 큰 기억 공간을 만드는 과정으로 사용되지 않은 기억 장치를 주기억 장치의 한 쪽 끝으로 옮기는 것이다. 압축 후에는 하나의 커다란 공백이 생기게 된다. 디스크에서의 집약은 보통 Garbage-Collection이라고 한다
가상 기억 장치의 사용 방식
보조 기억 장치를 주기억 장치처럼 사용하는 것으로, 주기억 장치보다 용량이 큰 프로그램도 처리가 가능하다. 프로그램을 여러 개의 작은 블록 단위로 나누어서 가상 기억 장치에 보관해 놓고 프로그램 실행 시 요구되는 블록만 주기억 장치에 불연속적으로 할당하여 처리한다
기억장치의 이용률과 다중 프로그래밍의 효율을 높일 수 있으며 프로그램 크기를 줄이지 않고 순차적으로 수행하는 기법인 오버레이 문제는 자동적으로 해결되나 프로그램 실행 시 주소 변환 작업이 필요하기 때문에 설계가 복잡하다
가상 기억 장치를 이용하게 되는 것은 여러 개의 프로그램이 동시에 처리되는 다중 프로그래밍 방식에서 대부분 사용하므로 단일 프로그래밍에서 사용하는 방식은 무의미하다
가상 기억 장치의 다중 프로그래밍 사용 방식
고정 분할(Paging)
디스크에 존재하는 같은 크기로 분할된 프로그램, 즉 페이지와 주기억 장치에 분할된 영역과 페이지가 교체되면서 프로그램이 실행되는데 이러한 기술을 보통 페이지 기법 혹은 페이징이라 한다.
페이지 기법의 기본적인 이점으로는 프로그램 크기에 제한이 없으며 주기억 장치를 효율적으로 사용할 수 있다는 것이다.
외부 단편화는 존재하지 않지만 내부 단편화는 발생한다
- 페이지 크기가 작을 수록
- 많은 페이지 사상 테이블 필요
- 내부 단편화는 줄어든다
- 자주 사용하는 페이지의 집합을 효율적으로 운영할 수 있다
- 특정한 참조 구역성만을 포함하기 때문에 기억 장치 효율이 높을 수 있다
- 총 입출력 시간 증가
- 페이지 크기가 클 수록
- 페이지 테이블의 크기가 작아지므로 주기억 장치의 공간이 절약
- 참조되는 정보와는 무관한 많은 양의 정보가 주기억 장치에 남는다
- 페이지 테이블이 복잡하지 않으므로 관리가 용이
- 디스크로부터 입출력 전송에 소모되는 시간은 커진다
동적 분할(Segmentation)
프로그램을 여러 개의 다른 크기로 분할하고 주기억 장치에서는 분할된 크기에 맞게 동적으로 분할하여 적재시키는 방법
크기가 다른 모듈을 고정된 길이를 갖는 페이지로 구분하여 사용할 경우, 고정된 페이지의 크기보다 작거나 큰 모듈은 주기억 장치에서 사용하지 않는 부분이 많이 발생될 것이다. 이로 인해 메모리 효율과 전체적인 성능은 낮아진다
세그먼트 사상 테이블과 기억 장치 보호 키가 필요하며 외부 단편화만 발생한다. 세그먼트 기법에서 빈 공간이 생기는 현상을 체커 보딩(Checker-boarding)이라 한다
각 프로그램은 분할된 자신만의 영역이 없으므로 다른 프로그램의 세그먼트들은 같은 기억 공간을 공유한다
가상 기억 장치 주요 기술
오버레이(Overlay)
단일 사용자 시스템에서 프로그램의 크기가 주기억 장치의 용량보다 클 수 없다. 하지만 더 이상 사용하지 않는 프로그램을 보조 기억 장치로 옮긴 후 그 기억 공간을 다른 프로그램이 사용하게 하면 실제 영역보다 더 큰 프로그램을 실행할 수 있다. 오버레이는 분할된 프로그램들을 순차적으로 적재하여 실행한다.
스와핑(Swapping)
실행되어야 할 작업의 크기가 커서 사용자 기억 공간에 수용될 수 없을 때 작업의 모든 부분들이 동시에 주기억 장치에 상주해 있을 필요가 없다. 이 때 작업을 분할하여 필요한 부분만 교체하여 실행할 수 있다
페이지 부재(Page Fault)
가상 기억 장치 시스템에서 가상 페이지 주소를 사용하여 데이터를 접근하는 프로그램이 실행될 때, 프로그램에서 접근하려고 하는 페이지가 주기억 장치에 있지 않은 경우 발생하는 현상
- 실행하고자 하는 페이지가 주기억 장치 내에 존재하지 않는 경우 운영체제에게 트랩(Trap)을 요청
- 운영체제는 현재 진행 중인 사용자 레지스트라와 프로그램 상태를 저장
- 현재 사용 가능한 페이지를 페이지 사상 테이블에서 검색
- 가상 기억 장치에 존재하는 해당 페이지를 주기억 장치로 가져온다
- 페이지 사상 테이블을 조정
- 프로그램 실행을 계속
스레싱(Thrashing)
다중 프로그래밍 시스템 또는 가상 기억 장치를 사용하는 시스템에서 하나의 프로세스가 작업 수행 과정 중 지나치게 페이지 부재가 발생함으로 인하여 전체 시스템의 성능이 저하되는 현상
구역성(Locality)
프로그램이 실행할 때 기억 장치 내의 모든 정보를 균일하게 참조하는 것이 아니라 어느 한 순간에 특정 부문을 집중적으로 참조하는 프로그램의 순차적인 성질.
디스크로부터 주기억 장치에 읽어들일 수 있는 블록의 크기로 여러 개의 페이지를 주기억 장치에 가져올 수 있다. 그중에 한 개의 페이지만이 필요하다면 이왕이면 앞으로 사용할 가능성이 높은 페이지들을 같이 읽어들이는 것이 좋다는 의미
- 시간(Temporal) 구역성
- 최근에 참조된 기억 장소가 가까운 장래에도 계속 참조될 가능성이 높음을 의미
- 반복, 부 프로그램, 스택, 집계 시 사용되는 변수들
- 공간(Spatial) 구역성
- 하나의 기억 장소가 참조되면 그 근처의 기억 장소가 계속 참조될 가능성이 높음을 의미
- 배열 순회, 프로그램의 순차적 코드 실행, 프로그램에서 관련된 변수들을 서로 근처에 선언하는 경우
작업 집합(Working Set)
프로세스를 효과적으로 실행하기 위해서는 주기억 장치에 유지되어야 하는 페이지들의 집합을 의미한다. 자주 참조되는 페이지의 집합은 주기억 장치에 미리 적재해두면 페이지 폴트를 최소화할 수 있고 효율적인 실행이 가능
댓글남기기