**가상 기억 접근 방식**(Virtual Storage Access Method, VSAM)은 OS/VS1, OS/VS2 릴리즈 1(SVS), 릴리즈 2(MVS) 운영 체제에 최초로 사용되었고 나중에 다중 가상 스토리지(MVS) 아키텍처를 통해 현재는 z/OS에서 사용되는 IBM 디스크 파일 스토리지 접근 방식이다. VSAM은 KSDS(Key Sequenced Data Set), RRDS(Relative Record Data Set), ESDS(Entry Sequenced Data Set), LDS(Linear Data Set)라는 4가지 데이터 셋이 있다. KSDS, RRDS, ESDS 조직에는 레코드를 포함하고 있지만 LDS 조직(나중에 VSAM에 추가됨)은 단순히 메모리 맵 파일로 사용하기 위해 본질적인 레코드 구조가 없는 일련의 페이지만 포함한다.

IBM은 공식 문서에서 데이터 셋(data set)이라는 용어를 파일(file)로, DASD는 디스크 드라이브와 유의어로 사용하고 있다.

IDCAMS라는 접근 방식 서비스 유틸리티는 VSAM 데이터셋을 조작(삭제 및 정의)하는데 흔히 사용된다.

IMS/DB와 DB2 둘 다 VSAM 상에 구현되어 있으며 기반이 되는 자료 구조를 사용한다.

VSAM 파일
-------

물리적인 VSAM 데이터셋 조직은 다른 접근 방식이 사용하는 조직들에 견주어 상당한 차이점이 있다.

VSAM 데이터셋은 CI(제어 구간: control interval)와 CA(제어 구역: control area)를 이루고 있다. CI와 CA의 크기는 일반적으로 접근 방식에 의해 결정되며 이들이 어떻게 쓰이는지는 사용자에게 보이지 않는다. 각각의 제어 구역(CA)에는 고정된 수의 제어 구간(CI)이 있다.

제어 구간은 일반적으로 여러 레코드를 포함하고 있다. 이 레코드들은 낮은 주소에서부터 위쪽으로 제어 구간 안에 저장된다. 제어 정보는 제어 구간의 반대편 끝에서부터 아래로 저장된다. 레코드와 제어 정보 사이의 공간은 여유 공간이다. 제어 정보는 두 개의 엔트리를 이룬다: 늘 존재하는 CIDF(제어 구간 서술자 필드: control interval descriptor field), 제어 구간에 레코드가 있고 연관 레코드의 길이를 기술할 때 존재하는 RDF(레코드 서술자 필드: record descriptor field). CI 안의 여유 공간은 언제나 순차적이다.

레코드들이 제어 구간에 삽입될 때, 이 레코드들은 다른 레코드들에 상대적으로 정확한 순서에 위치된다. 이 경우 레코드들이 제어 구간을 향해 위쪽으로 이동되어야 한다. 반대로 하나의 레코드가 삭제되면 나중에 레코드들은 아래로 내려감으로써 여유 공간이 순차적으로 남게 된다. 삽입할 레코드에 대한 제어 구간 안에 여유 공간이 충분하지 않으면 제어 구간은 분할된다. 거의 절반의 레코드들이 원래의 제어 구간에 저장되고, 남아있는 레코드들은 새로운 제어 구간으로 이동된다. 새로운 제어 구간은 원래의 제어 구간과 동일한 제어 구간 내의 여유 제어 구간들의 풀에서 가져온다. 해당 제어 구역 안에 남아있는 여유 제어 구간이 없다면 제어 구역은 알아서 분할되며 제어 구간들은 오래된 제어 영역과 새로운 제어 영역 사이에 동등하게 분배된다.

VSAM으로 세 종류의 레코드 지향 파일 조직을 사용할 수 있다(선형 데이터셋/LDS의 내용에는 레코드 구조가 없다):

### 순차 VSAM 조직

 이 부분의 본문은 엔트리 순차 데이터셋입니다.
엔트리 순차 데이터셋(ESDS, Entry Sequenced Data Set)은 대체 색인(Alternate Index)을 정의함으로써, 키를 통한 접근을 활성화하도록 색인을 정의할 수 있다. ESDS 안의 레코드들은 주소 접근을 통해 만들어진 순서대로 저장된다. 레코드들은 자신들의 내용에 상관 없이 로드되며 이들의 바이트 주소는 변경되지 않는다.

### 색인 VSAM 조직

 이 부분의 본문은 키 순차 데이터셋입니다.
키 순차 데이터셋(KSDS, Key Sequenced Data Set)은 두 부분으로 나뉜다: 색인 요소(index component), 데이터 요소(data component) 이들은 각기 다른 디스크 볼륨에 저장된다.

기본 KSDS가 하나의 기본 키만을 갖고 있지만 대체 지수를 정의하여 추가 필드를 보조 키로 사용할 수 있게 허용시킬 수 있다. 대체 색인 (AIX)은 그 자체가 KSDS이다.

KSDS가 사용하는 데이터 구조는 오늘날 B+ 트리로 알려져 있다.

### 상대적 VSAM 조직

 이 부분의 본문은 상대적 레코드 데이터셋입니다.
상대적 레코드 데이터셋(RRDS, Relative Record Data Set)은 대체 색인(Alternate Index)을 정의함으로써, 키를 통한 접근을 활성화하도록 색인을 정의할 수 있다.

### 선형 VSAM 조직

선형 데이터셋(LDS, Linear Data Set)은 여러 4K의 제어 구간 크기가 있는, 구조화되지 않은 VSAM 데이터셋이다. 특정한 시스템 서비스에 사용된다.

VSAM 데이터 접근 기술
--------------

VSAM 데이터의 접근 기술에는 3가지 종류가 있다.

* LSR (Local Shared Resources, 지역 공유 자원)
* GSR (Global Shared Resources, 전역 공유 자원)
* NSR (Non-Shared Resources, 비공유 자원)

이들은 각기 다른 접근 패턴에 최적화되어 있다. 이를테면 LSR은 임의 또는 직접 접근 방식에 최적화되어 있는 반면 NSR은 순차 접근에 최적화되어 있다.

이 밖에도 특정한 실행 및 프로그래밍 환경에서 일부 접근 기술들을 더 이용할 수 있다는 점이 다르다. 이를테면 LSR 접근은 CICS로부터의 보관(아카이브)이 쉬운 반면 NSR 접근은 역사적으로 LSR에 비해 배치 프로그램을 사용하기 더 쉽다.

VSAM 데이터 공유
-----------

CICS 구역(region) 간에 VSAM 데이터를 공유하는 일은 VSAM RLS(Record-Level Sharing, 레코드 수준 공유)가 처리한다. 레코드 캐시 기능과 레코드 잠금 기능을 추가한다. 로그 및 커밋 처리는 CICS가 떠맡음으로써 CICS 환경 밖의 VSAM 데이터 공유는 엄격하게 제한된다.

CICS 구역과 배치 잡 사이에 공유할 때에는 DFSMStvs라는 트랜잭셔널 VSAM을 요구한다.

이는 기반이 되는 z/OS 시스템 서비스를 이용하여 로그 기능 및 2PC 커밋을 추가함으로써 VSAM RLS 상에 빌드하는 선택적 프로그램이다. 이를 통해 VSAM 데이터의 일반화된 공유를 가능케 한다.

역사
--

VSAM은 성능 및 장치 의존성 문제를 극복하고 쉽게 사용할 수 있게 할 목적으로 구형 접근 방식을 대체하고 새로운 기능을 추가하기 위해 도입되었다. VSAM은 IBM이 새로운 시스템/370 시리즈를 위한 DOS/VS, OS/VS1, OS/VS2라는 가상 스토리지 운영 체제를 발표한 1970년대에 모습을 드러냈다. 하위 호환성을 유지하였으나 구형 접근 방식들은 가상 기억장치에 필요한 주소 변환으로 인해 성능 문제를 일으켰다.

KSDS 조직은 ISAM(색인 순차 접근 방식)을 대체하기 위해 설계되었다. 디스크 기술 변화로 말미암아 ISAM 데이터셋의 데이터를 검색하는 일은 매우 비효율적인 일이 되었다. ISAM 데이터셋을 이동하는 것도 어려운 일이었는데, 데이터가 이동되면 유효하지 않게 되는 물리적 디스크 위치를 가리키는 포인터들이 생기기 때문이다.

RRDS 조직은 BDAM(기본 직접 접근 방식)을 대체하기 위해 설계되었다. 어떠한 경우에 BDAM 데이터셋은 데이터셋 이동을 방지하는 포인터를 포함했다. 그러나 대부분의 BDAM 데이터셋은 이러한 포인터들을 포함하지 않았으며, BDAM을 VSAM RRDS로 이동하는 일은 ISAM을 VSAM KSDS로 이동하는 일 보다 덜 매력적이었다.

이후에 선형 데이터셋, VSAM RLS, 트랜잭셔널 VSAM이 뒤이어 추가되었다.

참고 문헌
-----

* **(영어)** VSAM Demystified
* **(영어)** DFSMStvs Overview and Planning Guide

| * v
* t
* e
OS/360 입출력 접근 방식 |
| --- |
| 저급 | 
* EXCP
* EXCPVR
* STARTIO

 |
| 스토리지 | 
* XDAP
* BDAM
* BSAM
* QSAM
* BPAM
* ISAM
* VSAM
* OAM

 |
| 네트워크 | 
* BTAM
* QTAM
* TCAM
* VTAM

 |