* Free List 는 해당 세그먼트가 다시 사용할 수 있는 block에 관한 list 이다. Free Block이 추가될 때는 Free List의 Head 에 덧붙여진다. 예를 들면 Block B5 가 Free List FL 에 있고 다른 B6 block이 FL에 덧붙여질 때 FL : B6 -> B5 즉, B6 가 free block으로 먼저 쓰여진다. % 앞으로 사용할 약어 : V1(V6.0 ~ V6.0.34) V2(V.6.0.35 ~ V7)
* Free List 에는 다음과 같은 것들이 있다. * Txfl(Transaction Free List) : 모든 트랜잭션에 할당되는 Free List이다. 한 세그먼트에는 최소 16 Txfl 이 있고 이는 블럭이 꽉 찰 때 까지 필요한 만큼 증가한다. 모든 프로세스는 해당 인스턴스에 주어진 Txfl에 접근 할 수 있다. * Prfl(Process Free List) : 하나의 프로세스에 할당되는 Free List 이다. 하나의 프로세스는 다른 프로세스에 할당 되어진 Prfl 을 사용하지 않는다. * Sgfl(Segment Free List) : Prfl과 같다. * Msfl(Master Free List) : 모든 프로세스가 사용 할 수 있도록 미리 할당되어진 Prfl이다. V1 에서의 Segment Header의 Block Format * 세그먼트는 연속된 블럭의 모음인 익스텐트로 구성 되어 있다. 세그먼트가 생성될 때 첫번째 익스텐트의 첫번째 블럭을 Segment Header 라고 한다. Segment Header는 Extent Control, Extent Map Table, Segment Header, Segment Free Space, Transaction Free Space로 이루어져 있다. Extent Control 과 Extent Map Table은 세그먼트에 할당된 익스텐트에 관한 정보를 준다. Segment Header Control은 Transaction Free List 정보와 세그먼트가 생성 될 때 명시된 Instance List(nfb)와 Process Free List(nfl)의 갯수를 가지고 있다. * Instance Free List(infl) 갯수는 디폴트가 1 이며 1보다 클 경우 Prfl 의 갯수는 Prfl/Sgfl = nfb * nfl 이다. nfb 는 init<SID>.ora 의 free_list_inst, nfl 은 free_list_proc 에서 지정된다.
V1 과 V2 에서의 Block Format 차이점 * V6.0.35 에서는 기존의 Block Type 5에 Block Type 12가 추가됨으로써 Segment Header는 Type 5 또는 12가 가능하다. 이의 구별은 명시된 Free Group의 갯수에 의해 결정된다. 즉, Free Group의 갯수가 1보다 크면 Segment Header의 block Type은 12로 설정된다. * V6.0.35 이상에서는 Free Lists 의 관련 정보를 Storage 항에서 표시할 수 있다.
....storage (freelists n freelist groups m) * 장점은 데이타 딕셔너리에 Free List의 정보가 저장 되어진다는 것이다. 즉 V1에서 처럼 Free Lists 를 바꾸기 위해 데이타베이스를 Restartup 할 필요가 없다. * V1 에서는 Freelists를 위해 Segment Header인 한 블럭이 할당된다. 그러나 V2 에서는 각 Free List Group 에 한개의 Free List Block 이 존재한다. 예를 들어, M=2 이면 Segment Header와 다음 2 block 이 할당 되어지는데 각 블럭은 Free List Group을 위한 것이다. ( 여기서 M 은 Free Group 이다).
Mapping Function 과 Free Space 검색 알고리즘 (Mapping Function) * Mapping Function은 단순히 Thread Number % Freelist Groups 와 Process Number % Process Freelists이다. 예를 들어 M=3,N=5는 3개의 Free List Groups 와 각각은 5개의 Process Free List 를 가짐을 의미한다. 1(1 2 3 4 5) 2(1 2 3 4 5) 3(1 2 3 4 5) * 임의의 프로세스가 인스턴스 2 에 접속되어 있고 Thread Number는 10 이고 Process Number는 26 이라고 가정하면 어떤 Freelist 가 할당되어질까? 이런 경우에는 10 % 3 = 1 26 % 5 = 1 즉, 첫번째 그룹의 첫번째 Prfl 을 선택하게 된다.
* 만약 인스턴스를 특정한 Freelist Block 에 할당하고자 할 때는 init<SID>.ora Parameter 인 Instance_number를 이용한다.
(검색 알고리즘) * V6.04 이하에서는 다음 순서를 따른다. 1. 자신의 Transaction Free List에서 Free List를 찾는다. 찾으면 #7, 아니면 #2로 간다. 2. Process Freelist 의 Free Space 를 찾는다. 찾으면 #7, 아니면 #3 으로 간다. 3. Commit된 Txfls를 찾는다. 만일 Commit되지 않은 Txfl Space를 발견하면 #4로 가고 아니면 각 Commit된 Txfl Space 를 한 Prfl에 할당한다. 만약 Prfl > Trfl 이면 어떤 Prfl는 Space를 얻지 못하고 Prfl < Trfl 이면 어떤 Prfl은 보다 많은 Space를 얻으며 #2 로 간다. 4. High Water Mark를 Bump Up할 수 없으면 #5로 가고 가능하면 원래대로 Space를 Prfl에 복사한 후 #2로 간다. 5. 데이타 딕셔너리에서 fet$를 검색하고 익스텐트를 세그먼트에 할당하고 #4로 간다. 만일 fet$ 에 Space 가 없으면 #6로 간다. 6. 에러발생. 테이블스페이스에 더이상 Space 가 없다. 7. Space 를 사용한다. * V6.0.35 이상에서는 다음 순서에 의한다. 1. 자신의 Transaction Free List에서 Free List를 찾는다. 찾으면 #8, 아니면 #2 로 간다. 2. Process Freelist 의 Free Space 를 찾는다. 찾으면 #8, 아니면 #3 으로 간다. 3. Master Freelist를 검색한다. 만일 Space를 찾으면 Prfl에 Space의 조각을 복사하고 #2, 아니면 4로 간다. 4. Commit된 Txfls를 찾는다. 만일 Commit되지 않은 Txfl Space를 발견하면 #5, 아니면 각 Commit된 Txfl Space 를 Master Freelist 에 복사하고 #3으로 간다. 5. High Water Mark 를 Bump Up할 수 없으면 #6으로 가고 가능하면 Bump Up하고 Space를 Prfl 에 복사한 후 #2로 간다. 6. 데이타 딕셔너리에서 fet$를 검색하고 익스텐트를 세그먼트에 할당하고 #4로 간다. 만일 fet$ 에 Space 가 없으면 #7로 간다. 7. 에러 발생 테이블스페이스에 더 이상 Space 가 없다. 8. Space 를 사용한다. |