본문 바로가기

운영체제

운영체제 정리 및 요약 #2


1. 메모리 보호 기법


각각의 프로세스는 독립된 메모리 공간을 가진다. 이를 위해서 특정 프로세스만 접근할 수 있는 합법적인 메모리 주소 영역을 설정하고, 프로세스가 합법적인 영역만을 접근하도록 하는 것이 필요하다. 기준과 상한이라고 불리는 두 개의 레지스터들을 사용하여 이러한 보호 기법을 제공한다. 기준 레지스터는 합법적인 물리 메모리 주소의 값을 저장하고, 상한 레지스터는 주어진 영역의 크기를 저장한다.





2. CPU가 페이징 하드웨어를 이용해 논리주소를 물리 주소로 변환하는 방법


CPU에서 나오는 모든 주소는 페이지 번호(p)와 페이지 변위(d:offset) 두 개의 부분으로 나누어진다. 페이지 번호는 페이지 테이블(page table)을 액세스할 때 사용되며, 페이지 테이블은 주 메모리에 존재하는 페이지의 기준 주소를 갖고 있다. 이 페이지의 주소에 페이지 변위를 더하면 메모리 장치로 전송될 물리 주소가 된다. 






3. Contigous allocation, Page system, Segmented system의 차이점


1) 연속 할당 (Contigous allocation) : 프로세스가 시스템에 들어오면, 일단 입력 큐에 넣는다. 운영체제는 각 프로세스가 메모리를 얼마나 요구하며, 또 사용가능한 메모리 공간이 어디에 얼마나 있는지를 고려하여 공간을 할당한다. 메모리에는 다양한 크기의 자유 공간이 여기저기에 산재하게 된다. 프로세스가 공간을 필요로 할 때 운영체제는 이 자유 공간들의 집합에서 적적한 것을 찾아내야 한다.


- 최초 적합 : 요청을 만족시키는 충분히 큰 첫 번째 사용 가능한 가용 공간을 할당한다. 검색은 집합의 시작에서부터 하거나 지난 번 검색이 끝났던 곳에서 시작될 수 있다. 충분히 큰 가용 공간을 찾았을 때 검색을 끝낼 수 있다. 


- 최적 적합 : 충분히 큰 공간들 중에서 가장 작은 것을 택한다. 리스크가 크기순으로 되어 있지 않다면 리스트 전체를 검색해야만 한다. 이 방법은 아주 작은 잔여 공간을 만들어낸다.


- 최악 적합 : 가장 큰 가용 공간을 택한다. 이 방식에서 할당해 주고 남게 되는 자유 공간은 충분히 커서 다른 프로세스들을 위하여 유용하게 사용될 수 있다. 이때 자유 공간들이 크기 순으로 정렬되어 있지 않으면 리스트 전체를 다 검색해야만 한다.


- 단점 : 외부 단편화(공간 중 일부가 사용 못하게 되는 부분)이 발생하게 된다. 프로세스들이 메모리에 적재되고 제거되는 일이 반복되다보면, 어떤 자유 공간은 너무 작은 조각이 되어 버린다. 외부 단편화는 이처럼 유휴 공간들을 모두 합치면 충분한 공간이 되지만 그것들이 너무 작은 조각들로 여러 곳에 분산되어 있을 때 발생한다. 즉 메모리는 너무 많은 수의 매우 작은 조각들로 단편화되어 있다는 것이다. 이 문제를 해결하기 위해 압축(compaction)을 사용할 수 있다. 이 방법은 모든 내용들을 한군데로 몰고 모든 자유 공간들을 다른 한 군데로 몰아서 큰 블록을 만드는 것이다. 그러나 압축은 프로세스들의 재배치가 실행시간에 동적으로 이루어지는 경우에만 가능하다. 또한 이 방법은 비용이 많이든다.





2) 페이징 (page system) : 물리 메모리는 프레임이라 불리는 고정 크기의 블록으로 나누어져 있고, 논리 메모리는 페이지라 불리는 프레임과 같은 크기의 블록으로 나누어진다. 프로세스가 실행될 때 그 프로세스의 페이지는 파일 시스템 또는 보조 메모리로부터 가용한 주 메모리 프레임으로 적재된다. 보조 메모리는 메모리 프레임과 같은 크기의 블록들로 나누어져 있다. 


- 단점 : 페이징 기법을 사용하면 외부 단편화가 발생되지 않는다. 임의의 가용 프레임이 프로세스에게 할당될 수 있기 때문이다. 그러나 이제는 내부 단편화가 발생된다. 할당은 항상 프레임의 정수 배로 할당되기 때문에 만약 프로세스가 페이지 경계와 일치하지 않는 크기의 메모리를 요구한다면 마지막 페이지 프레임은 전부 사용되지 않으므로 내부 단편화가 발생하게 된다.




3) 세그멘테이션 Segmented system) : 세그멘테이션은 메모리를 바라보는 사용자 관점을 그대로 지원하는 메모리 관리 기법이다. 사용자는 프로그램을 메서드, 프로시저, 함수의 집합을 갖는 메인 프로그램으로 생각 한다. 논리 구조 공간을 세그먼트들의 집합으로 정의 한다. 각 세그먼트에게 각각 이름과 길이를 가진다. 논리 주소는 세그먼트 이름과 세그먼트 내에서의 변위를 표시한다. 따라서 사용자는 주소를 2개의 값으로 지정한다. 구현을 쉽게 하기 위해 세그먼트 이름 대신에 세그먼트 번호가 시스템에 의해 매겨지고,시스템 내부에서 세그먼트는 번호로 참조된다. 따라서 논리 주소는 <세그먼트 번호, 오프셋>으로 구성된다.

C컴파일러는 프로그램이 컴파일 되면 '코드, 전역 변수, 메모리 할당을 위한 힙, 각각의 스레드를 위한 스택, 표준 씨 라이브러리'와 같은 세그먼트들을 만들어낼 것이다.




4. 가상 메모리


1) 가상메모리란 : 프로세스 전체가 메모리에 올라오지 않더라도 실행이 가능하도록 하는 기법이다. 물리 메모리로부터 사용자 관점의 논리 메모리를 분리시켜 메인 메모리를 균일한 크기의 저장 공간으로 구성된 엄청나게 큰 배열로 추상화 시켜준다.


2) 주요 장점 :

 - 사용자 프로그램이 물리 메모리 보다 커도 된다.

 - 작은 메모리를 가지고 큰 가상 주소 공간을 프로그래머에게 제공할 수 있다.

 - 프로세스 생성을 효율적으로 처리할 수 있는 메커니즘도 제공한다.

 - 페이지 공유를 통해 파일이나 메모리가 둘 또는 그 이상의 프로세스들에 의해 공유되는 것을 가능하게 한다. 


3) 요구 페이징 :

프로그램 시작 시 실행 프로그램 전체를 디스크에서 메모리로 올리면 메모리가 낭비된다. 초기에는 프로그램 전체가 메모리에 있을 필요가 없을 수 있다. 따라서 초기에 필요한 것들만 적재하는 전략을 사용한다. 요구 페이징을 사용하는 가상 메모리에서는 페이지들이 실행과정에서 실제로 필요해질 때 적재된다. 즉, 한번도 접근되지 않는 페이지는 물리 메모리에 전혀 적재되지 않는다. 

가상 메모리는 대개 요구 페이징 방식으로 구현되며 세그멘테이션 시스템도 있으나 대개는 하나의 세그먼트가 다시 여러 페이지로 나뉘는 페이지된 세그멘테이션 기법을 사용한다.


4) 페이지 부재를 처리하는 과정



 (1) 프로세스에 대한 내부 테이블(일반적으로 프로세스 제어블록PCB 과 함께 유지)을 검사해서 그 메모리 참조가 유효, 무효인지를 알아낸다.


 (2) 만약 무효한 페이지에 대한 (invalid) 참조라면 그 프로세스는 중단된다. 만약 유효한 참조인데 페이지가 아직 메모리에 올라오지 않았다면, 그것을 디스크로부터 가져와야 한다.


 (3) 빈 공간 자유 프레임(free frame)을 찾는다. (페이지 프레임 리스트에서 하나를 가져옴)


 (4) 디스크에 새로이 할당된 프레임으로 해당 페이지를 읽어 들이도록 요청한다. 


 (5) 디스크 읽기가 끝나면 이 페이지가 이제 메모리에 있다는 것을 알리기 위해 페이지 테이블을 갱신하며, 프로세스 유지되고 있는 내부 테이블을 수정한다.


 (6) 트랩에 의해 중단되엇던 명령어를 다시 실행한다. 이제 프로세스는 마치 그 페이지가 항상 메모리에 있었던 것처럼 해당 페이지에 접근할 수 있다. 


5) 페이지 교체


 (1) FIFO 페이지 교체 : 각 페이지마다 메모리에 적재된 시간을 기억한다. FIFO 교체 알고리즘은 어떤 페이지를 교체해야 할 때 메모리에 올라온 기간이 가장 오래된 페이지를 내쫒는다. 시간을 기억할 필요는 없고 올라온 순서로 큐를 만들어 유지하고 있어도 된다.


 - 단점 : 1,2,3,4,1,2,5,1,2,3,4,5 와 같은 참조열이 있을 때 프레임이 3개 할당했을 때는 페이지 부재가 9번 일어나는데 4개 할당했을 때는 페이지 부재가 10번 일어나게 된다. 이런 현상을 Belady 모순이라고 부른다. 

(Belady 모순 : 프로세스에게 프레임을 더 주었는데도 오히려 페이지 부재율이 더 증가하는 현상을 일컫는다.)


 (2) 최적 페이지 교체 (Optimal Page Replacement) : 이 알고리즘은 모든 알고리즘보다 낮은 페이지 부재율을 보이며 Belady의 모순이 발생하지 않는다. 이 알고리즘은 앞으로 가장 오랫동안 사용되지 않을 페이지를 찾아 교체하는 방법이다. 


 - 단점 : 이 알고리즘의 구현은 어렵다. 그 이유는 이 방식은 프로세스가 앞으로 메모리를 어떻게 참조할 것인지를 미리 알아야 하기 때문이다. 


 (3) LRU 페이지 교체 (Least Recently Used Page Replacement) : 최근의 과거를 가까운 미래의 근사치로 보면 가장 오랜 기간 동안 사용되지 않은 페이지 교체할 수 있다. LRU 알고리즘은 각 페이지마다 마지막 사용 시간을 유지한다. 페이지 교체 시에 LRU는 가장 오래동안 사용되지 않은 페이지를 선택한다. 구현을 위해서는 TLB 레지스터 이상의 하드웨어 지원이 필요하다. 계수기 값과 스택을 갱신한는 작업을 메모리 참조 때마다 실행해야 한다.


 - 구현 방법 1 : 가장 간단한 방법으로, 각 페이지 항목마다 사용 시간 필드를 넣고 CPU에 논리적인 시계나 계수기를 추가한다. 매 메모리 접근마다 시간은 증가 한다. 이 기법에서는 LRU 페이지를 찾기 위해 페이지 테이블을 탐색해야하며, 매 메모리 참조마다 시간 필드를 갱신하기 위해 메모리 쓰기 작업을 필요로 한다.


 - 구현 방법 2 : 페이지 번호의 스택을 유지하는 방법이다. 페이지가 참조될 때마다 페이지 번호는 스택 중간에서 제거되어 스택 꼭대기에 놓이게 된다. 이러면 스택 꼭대기는 항상 가장 최근에 사용된 페이지고, 바닥은 가장 오랫동안 이용되지 않은 페이지이다. 이 방식은 소프트웨어나 마이크로코드 구현에 적합하다. 스택 알고리즘은 Belady의 모순현상을 야기하지 않는다.


 (4) LRU 근사 페이지 교체 (LRU Approximation Page Replacement) : 진정한 LRU 페이지 교체를 지원하는 하드웨어는 거의 없다. 하지만 많은 시스템이 참조비트의 형태로 어느 정도의 지원은 하고 있다. 페이지 참조가 있을 때마다하드웨어가 그 페이지에 대한 참조 비트를 설정한다. 참조 비트는 페이지 테이블에 있는 각 항목마다 연관된다. 


 - 부가적 참조 비트 알고리즘 : 일정하 주기로 참조 비트들을 기록함으로써 추가적인 선후 관계 정보를 얻을 수 있다. 각 페이지에 대해 8비트(1바이트)를 할당한다. 일정한 시간 간격마다 타이머인터럽트를 걸어서 오른쪽으로 쉬프트 연산한다. 이 정보를 통해 가장 오랫동안 쓰이지 않는 페이지를 교체한다. 


 - 2차 기회 알고리즘 : 2차 기회 알고리즘의 기본은 FIFO 교체 알고리즘이다. 페이지가 선택될 때마다 참조비트를 확인하여 참조비트가 0이면 페이지를 교체하고 1이면 다시 한번 기회를 준다음 다음 FIFO 페이지를 선택하기 위해 이동한다. 한 번 기회를 받게 되면 참조비트는 해제되고 도착 시간이 현재 시간으로 재설정된다. 순환 큐를 이용해 프레임이 필요해지면 참조 비트가 0인 페이지를 발견할 때까지 포인터를 전진시킨다. 그 포인터가 전진하면서 참조 비트를 0으로 바꾼다. 희생될 페이지가 발견되면 그 페이지는 교체되고 새로운 페이지가 순환 큐의 해당 위치에 삽입된다. 모든 비트가 1이면 포인터는 큐를 완전히 한 바퀴 순회하면서 참조 비트를 0으로 만들어 모든 페이지에게 2차 기회를 준다. 

 

 - 개선된 2차 기회 알고리즘 : 변경비트란 CPU가 페이지를 한번이라도 쓰게 되면 설정하는 비트이다. 필요이유는 만약 이 비트가 없으면 페이지가 교체될 때 그 교체될 페이지를 다시 보조메모리에 쓰기 작업을 해야하기 때문이다. 이는 새로운 프레임을 읽고, 오래된 페이지를 쓰는 2중 접근이 필요하게 된다. 하지만 변경비트가 있으면 쓰기 작업을 한 페이지만 보조메모리에 다시 작성하면 된다. 개선된 2차 기회 알고리즘은 참조비트와 변경비트를 순서쌍으로 생각하여 사용하여 더 개선하는 방법이다. (참조비트, 변경비트)

(0,0) : 최근에 사용되지도 않고 변경되지도 않은 경우 (1순위 교체)

(0,1) : 최근에 사용되지는 않았지만 변경된 경우 (2순위 교체)

(1,0) 최근에 사용은 되었으나 변경은 되지 않은 경우 (2,3 순위 교체)

(1,1) 최근에 사용되었고 변경된 경우 : (4순위 교체)


 (5) 계수 기반 페이지 교체 : 각 페이지를 참조할 때마다 참조횟수를 기록하면 다음과 같은 두가지 기법을 고안할 수 있다. 알고리즘을 구현하는데에 상당히 비용이 많이 들고 최적 페이지 교체 정책을 제대로 근사하지 못하기 때문에 일반적으로는 잘 쓰이지 않는다. 


 - LFU 알고리즘 (Least Frequently Used) : 알고리즘은 참조 회수가 가장 작은 페이지를 교체하는 방법이다. 하지만 초기 단계에 많이 사용되고 나중에 안 쓰이는 경우 판단이 빗나갈 수 있으므로 해결책이 필요하다. 시간이 자날 때마다 오른쪽으로 쉬프트해서 지수적으로 그 영향력을 감소시키는 방법이있다.)


 - MFU 알고리즘 (Most Frequently Used) : 가장 작은 참조 회수를 가진 페이지가 가장 최근에 메모리로 적재되었고 앞으로 계속 사용될 것이라는 판단에 근거한다. 


6) 쓰레싱 : 만약 낮은 우선순위를 가진 프로세스에게 할당된 프레임 수가 컴퓨터 구조가 요구하는 최소한의 수보다 적게 되면 , 프로세스는 실행을 한 동안 보류 해야 한다. 충분한 프레임을 할당받지 못한 임의의 프로세스는 페이지 교체가 필요하지만 이미 활발하게 사용되는 페이지들만 이루어져있으몰 어떤 페이지가 교체되든 반드시 다시 필요해진다. 결국 과도한 페이징 작업이 필요되고 이를 쓰레싱이라 부른다. 어떤 프로세스가 실행보다 더 많은 시간을 페이징에 사용하고 있을 경우 쓰레싱이 발생했다고 한다. 

 

 - 발생원인 : CPU의 이용율이 낮으면 새로운 프로세스를 추가하여 다중 프로그래밍 정도를 높이게 되는데 쓰레싱이 일어나게 되면 CPU 이용율이계속  떨어지게 되고 계속 다중 프로그래밍 정도를 증가시킨다. 



5. 디렉토리와 디스크 구조


1) 트리구조


 - 트리구조는 하나의 루트 디렉토리를 가지며, 시스템의 모든 파일은 고유한 경로 이름을 가진다. 디렉토리는 파일과 서브 디렉토리의 집합을 포함한다. 디렉토리는 단순히 또 다른 파일이지만 특별하게 취급된다. 이는 한 비트를 사용해 일반 파일인지 디렉토리인지 구별하게 된다. 


 - 통산적으로 각 프로세스는 현재 디렉토리를 가지고 있다. 파일을 참조하면 현재 디렉토리를 먼저 검색하게 되는데 현재 디렉토리에 없는 파일을 참조해야하는 경우 경로 이름을 지정하거나 현재 디렉토리를 다른 디렉토리로 바꿔야만한다.


 - 경로명에는 절대 경로명과 상대 경로명 두 가지가 있다. 절대 경로명이란 루트에서부터 지정된 파일까지의 경로가 명시된 것을 말한다. 상대경로명이란 현재 디렉토리를 기준으로 목적하는 파일까지의 경로를 지정하는 것이다.


 - 트리 구조 디렉토리 시스템에서는 사용자 자신의 파일 뿐만 아니라 다른 사용자의 파일에도 접근할 수 있다. 이를 위해 그 파일의 경로를 지정하거나 현재 디렉토리를 변경해야 한다.



2) 비순환 그래프 구조 (Acyclic-Graph)


 - 트리구조는 파일 또는 디렉토리의 공유를 허용하지 않는다. 비순환 그래프(사이클이 없는 그래프) 디렉토리들이 서브디렉토리들과 파일들을 공유하게 허용한다. 공유파일은 여러가지 방법으로 구현가능한데 보편적인 방법은 링크라 불리는 새로운 디렉토리 항목을 만드는 것이다. 


 - 이구조는 트리 구조보다는 융통성이 있는 대신 더 복잡하다. 이 구조에서는 여러 개의 절대 경로명을 가질 수 있다. 만일 백업을 위해 파일 시스템 전체를 순회하면 공유 파일 디렉토리를 2번이상접근하게 될 것이다. 또 다른 문제는 삭제문제이다. 이럴 경우 공유 파일을 가리키는 포인터를 두고, 포인터가 0이 될 때만 삭제한다. 이럴 때 심볼릭 링크를 사용할 수 있는데 이 것은 단순히 절대경로를 포함하는 것이고 포인터와는 아무런 상관이없다. 다만 이 파일은 원본 파일이 삭제되었을 때 알지 못한다.



3) 일반 그래프 디렉토리


 - 비순환 그래프 구조에서 중요한 문제는 순환이 발생하지 않도록 하는 것이다. 기본 트리 구조 디렉토리에 새로운 링크를 추가하면 트리 구조는 붕괴되고 일반적인 그래프 구조가 된다. 이는 순환이 생길 수 있기 때문에 가비지 컬렉션과 같은 방법으로 2차 접근을 방지하게 되는데 이 방법은 오버헤드가 발생된다.



6. 파일 시스템


1) 디렉토리 구현


디렉토리 할당과 디렉토리 관리 알고리즘의 선택은 파일 시스템의 호율, 성능 및 신뢰성에 매우 큰 영향을 미친다.


 (1) 선형 리스트 : 새로운 파일 생성을 위해 먼저 디렉토리를 탐색하여 중복 여부를 검사하고 새로운 항목을 첨가한다. 가장 큰 단점은 파일을 찾기 위해 선형 탐색을 해야만 한다. 이는 정렬을 통해 빠르게 찾을 수 있으나 정렬에 대한 오버헤드가 존재한다.보다 정교한 B-Tree를 사용하여 별도의 정렬없이 정렬된 디렉토리 목록을 만들 수 있다.


 (2) 해쉬 테이블 : 해쉬 테이블로 관리. 충돌날 수 있음. 빠름.(Pass)


2) 할당 방법


 (1) 연속할당 : 연속 할당 방식은 각 파일이 디스크 내에서 반드시 연속적인 공간을 차지하도록 할당한다. 이는 파일이 연속적이므로 헤더의 움직임이 매우 적다. 또한 파일에 대한 접근이 쉽다. 블록 b에서 시작하는 i번째 블록에 직접 접근을 하기 위해선 b+i로 즉시 접근할 수 있다. 문제점으로는 새로운 파일을 위한 가용 공간을 찾는 일이다. 최초 적합과 최적적합이 일반적인 전략인데 속도면에서 느리다. 또한 파일이 할당되고 반납됨에 따라 가용 디스크 공간이 조그만 조각으로 나누어진다. (외부 단편화) 이를 해결하기 위해 압축을 사용할 수 있는데 압축은 장시간에 걸쳐 행해져야 하므로 심각한 비용을 지불해야 한다. 다른 문제점으로는 파일을 위해 얼마나 많은 공간을 할당해야할지를 결정하는 것이다. 


 (2) 연결 할당 : 연결 할당은 연속 할당의 모든 문제를 해결한다. 디렉토리는 파일의 첫번째와 마지막 블록을 가리키는 포인터를 가지고 있다. 9(11) -> 11(23) -> 23(4) -> 4(-1). 단점으로는 순차 접근 파일에만 효과적이라는 것이다. i 번째 블록을 찾기 위해선 파일의 첨부터 시작해서 i번째 블록에 도달할 때까지 포인터를 따라가야한다. 또 다른 단점으로는 포인터들을 위한 공간이 필요하다는 것이다.(FAT) 이를 위해 4블록 정도를 하나의 클러스터로 구성하여 포인터의 양을 줄일 수 있는데 이 방법은 내부 단편화가 발생할 수 있다. 또한 포인터가 망가지면 파일에 대한 연결 리스트가 끊어 지게 된다. 


 (3) 색인 할당 : 연결 할당은 연속 할당의 외부 단편화 문제와 파일 크기 선언 문제를 해결했으나 FAT가 없으면 직 접 접근을 효율적으로 지원할 수 없었다. 색인할당은 색인 블록을 지정해 하나의 블록 내에 모든 포인터를 저장하는 방법이다. i번째 블록을 읽기 위해선 색인 블록 항목에 있는 i번째 항목에서만 포인터를 얻으면 된다. 하지만 이 방법의 문제는 공간의 낭비가 발생하게 된다. 색인 블록의 포인터 오버헤드는 연결 할당의 포인터 오버헤드보다 크다. 



7. 디스크 스케줄링


실린더 요청 순서 : 98, 183, 37, 122, 14, 124, 65, 67


초기 헤드 위치 : 53


1) 선입 선처리(FCFS) : 요청 순서에 따라 실린더를 접근한다.


 - 53->98->183->37->122->14->124->65->67


2) 최소 탐색시간 우선 스케줄링(Shortest-Seek-Time-First) : 헤드가 다른 곳으로 이동하기 전에 근처에 있는 요구를 먼저 처리한다. 즉 현재 위치로부터 가까운 요청을 우선 선정하고 그에 따라 움직인다.


 - 53->65->67->37->14->98->122->124->183


3) SCAN 스케줄링 : 디스크 암이 디스크 한  끝에서 시작하여 다른 끝으로 이동하며 가는 길에 있는 요청을 모두 처리한다. 다른 끝에 도달하면 역방향으로 이동하면서 오는 길에 있는 요청을 처리한다. 


 - 53->37->14->0->65->67->98->122->124->183


4) C-SCAN 스케줄링 : 한쪽 끝에 다다르면 반대 방향으로 헤드를 이동하며 서비스하는 것이 아니라 처음 시작했던 자리로 다시 되돌아가서 서비스를 시작한다. 


 - 53->65->67->98->122->124->183->199->0->14->37


5) LOOK 스케줄링 : 각 방향으로 가다가 그 방향에 기다리는 요청이 없으면 즉시 반대로 바꾼다. 


 - 53->37->14->65->67->98->122->124->183


6) C-LOOK 스케줄링 : 각 방향으로 가다가 그 방향에 기다리는 요청이 없으면 즉시 앞으로 되돌아간다.


 - 53->65->67->98->122->124->183->14->37



8. RAID


표현 방법 : (저장용 디스크, 복구용 디스크)


1) 레이드 0 : 중복 없이 모든 디스크를 사용한다. (4,0)


2) 레이드 1 : 중복된 디스크를 두는 미러링 기법을 사용한다. (4,4)


3) 레이드 2 : 오류 정정 코드(ECC)를 이용해 손상된 디스크를 복구한다. (4,3)


4) 레이드 3 : 하드웨어를 이용해 바이트 레벨의 비트 인터리브 패티리를 사용하여 손상된 디스크를 탐지한다.(바이트 단위로  병목현상이 발생할 수 있다. 임의 쓰기는 성능이 나쁘고 읽기 성능은 좋다. 동일한 위치가 오류나면 복구가 불가능하다. (4,1)


5) 레이드 4 : 레이드 3과 동일하나 여기선 모든 파일이 블록단위로 쪼개진다. 블록 인터리브 패리티를 사용하여 손상된 디스크를 탐지하고 복구한다. 대규모쓰기는 빠르나 작은 쓰기는 효율적이지 못하다. 패리티 블록이 업데이트되어야 하기 때문에 패리티 디스크에도 접근을 해야 한다. (4,1)


6) 레이드 5 : 레이드4에서의 하나의 패리티 디스크로 집중되는 문제를 해결하기 위해 블록 인터리브 패리티를 분산시킨다. 레이드4와 같이 하나의 디스크에 패리티를 저장하는 방법과 달리 패리티 블록을 분산하여 저장한다. 이는 레이드4의 하나의 패리티 디스크에에 대한 과도한 집중을 막을 수 있다.(5,분산)

 


9. Protection


1) 객체 (Object) : 컴퓨터 시스템은 프로세스들과 객체들의 집합이다. 객체는 하드웨어 객체(CPU, 메모리 세그먼트, 프린터, 디스크 및 테이프 드라이브 등)와 소프트웨어 객체(파일, 프로그램, 세마포어) 둘 모두를 의미한다. 각 객체는 시스템의 다른 모든 객체들과 구분할 수 있는 유일한 이름을 가지며, 각각은 잘 정의되고 의미 있는 연산을 통해서만 접근될 수 있다. 객체는 본질적으로 추상 데이터 타입이다. 


2) need-to-know : 프로세스는 자기가 접근을 인가 받은 자원들만을 접근할 수 있어야 한다. 또한 어느 때든 프로세스는 자신의 일을 완료하기 위하여 현재 필요로 하는 자원들만 접근할 수 있어야 한다. 이러한 요구는 통상 need-to-know(알 필요가 있는) 원칙이라 불리며, 이는 시스템에서 잘못된 프로세스가 유발할 수 있는 피해의 양을 제한하는데 유용하다.


3) 도메인 (영역) : 한 프로세스는 그 프로세스가 접근할 수 있는 자원들을 명시하고 있는 하나의 보호 도메인 내에서 동작한다. 각 영역은 객체들의 집합과 그 객체에서 취할 수 있는 조작의 형태를 정의한다. 각 도메인은 객체의 집합과 각 객체에 대해 호출될 수 있는 연산의 타입을 정의한다. 객체에 대해 연산을 실행할 수 있는 권한을 접근 권한이라 한다. 하나의 도메인은 접근 권한의 집합이고 각 권한은 <객체-이름, 권한-집합>의 순서쌍으로 되어 있다. 


4) 도메인 사용 특성 : 프로세스와 도메인간의 연관은 정적(한 프로세스가 이용 가능한 자원들의 집합이 영역의 일생동안 고정된 경우) 이거나 동적이다. 


-정적인 경우 : 만일 프로세스와 도메인간의 연관이 정적이고, 우리가 need-to-know 원칙을 고수하고 싶다면, 영역의 내용을 변경할 수 있는 기법이 있어야 한다. 프로세스는 두 개의 서로 다른 단계로 실행될 수 있다. 한 단계가 읽기 접근, 다른 단계에서는 쓰기 접근이 필요할 경우 그 도메인이 읽기와 쓰기 접근을 모두 포함하도록 정의해야한다. 하지만 이 방법은 읽기 필요한 단계에 쓰기 접근을 갖게 되고, 쓰기 단계가 필요한 단계에 읽기 접근을 갖게 되므로 요구되는 것보다 많은 권한을 제공한다. 이는 need-to-know 원칙에 위배된다. 반드시 도메인의 내용이 변경 가능하도록 해서 도메인이 항상 필요한 최소의 접근 권한을 반영하도록 해야 한다.


-동적인 경우 : 프로세스와 도메인간의 연관이 동적이라면, 프로세스로 하여금 한 도메인에서 다른 도메인으로 전환하게 하는 기법(도메인 스위칭)이 존재한다. 만약 도메인의 내용을 변경할 수 없다면, 변경된 내용을 갖는 새로운 도메인을 만든 다음 도메인의 내용을 변경하기 원할 때 새로운 도메인으로 전환함으로써 같은 효과를 낼 수 있다.


5) 유닉스, 리눅스에서의 도메인 : 도메인은 사용자와 연관되어 있다. 도메인을 전환하는 것은 사용자의 신원을 일시적으로 변경하는 것과 같다. 이 변경은 파일 시스템을 통하여 setuid 비트라 알려진 도메인 비트를 이용해 도메인을 정의 한다. 


6) 접근 매트릭스 : 접근 보안 정책 특정 도메인의 주체에 대응하는 행과 객체에 대응하는 열을 포함하는 행렬로서 표현되며, 각 행렬의 엔트리는 주체가 대응하는 객체에 대하여 실행할 수 있는 접근 허가(권한 또는 특권)을 나타낸다. 접근 행렬은 프로세스와 도메인간의 정적, 동적 연관을 위한 엄격한 제어를 정의하고 구현하는 적절한 기법을 제공한다. 


- 전환 : 프로세스를 한 도메인에서 다른 도메인으로 전환할 때, 도메인을 접근 행렬의 한 객체로 취급함으로써 영역 전환을 제어할 수 있다. (D1은 D2로 전환 가능)






- 내용 변경 : 접근 행렬의 내용을 변화시킨다는 것은 접근 행렬이라는 객체에 대한 연산을 실행하는 것이다. 접근 행렬 자체를 하나의 객체로 포함시킴으로써 이러한 변화를 제어할 수 있다. 접근 행렬 항들의 내용에 대한 통제된 변경을 허용하기 위해서는 세 가지 연산(복사, 소유자, 제어)가 추가적으로 필요하다.


    - 복사 : 접근 행렬의 한 도메인(행)으로 부터 다른 도메인으로 접근권한을 복사할 수 있는 권한은 접근 권한에 *를 덧붙여 나타낸다.  ex) access(D3,F2) 에서 access(D4, F2)로 권한을 복사 (복사, 이동, 제한 복사 등 별개의 권한을 지정함으로써 세 가지 모두를 제공할 수 있음)





   - 소유자 : 새로운 권한을 추가하고 몇몇 권한들을 제거하도록 허용하는 기법을 필요로 한다. 소유자 권한이 권한을 추가하거나 제거하는 연산을 제어한다. 도메인이 어느 파일에 대한 소유자권한이 있으면 그 파일에 관해 다른 권한을 추가하거나 제거할 수 있다. ex) access(D2, F1)이 access(D4,F1)에 대해 읽기/쓰기 권한을 제거함 (F1열의 모든 권한을 제어할 수 있음)



   - 제어 : 복사와 소유자 권한은 프로세스로 하여금 한 열의 항을 변경할 수 있도록 허용한다. 한 행의 항을 변경하기 위한 기법이 필요하다. 제어 권한은 단지 영역 객체에 대해서만 적용 가능하다. ex) access(D2,D4)가 access(D4, F1)의 읽기/쓰기 권한을 제거함(D4 행의 모든 접근을 제어할 수 있음)




7) 접근 매트릭스 구현


- 전역 테이블 (Global Table) : 3개의 순서쌍 <영역, 객체, 권한 집합>들의 집합으로 구성. 이 방법의 단점은 테이블이 매우 크기 때문에 기억 공간을 낭비하고 보조기억장치에 저장할 경우 추가적인 입출력이 필요하다. 또한 어떤 객체 또는 영역을 특별한 그룹으로 분류하여 이용하기가 어렵다.


 


- 객체를 위한 접근 리스트 (Access Lists for Objects) : 접근 제어 리스트는 객체에 접근할 수 있는 모든 영역을 포함하는 각 객체 리스트로 구성되어 있으며, 각 영역은 <사용자명, 사용자 그룹명>의 쌍으로 지정된다. 자원 보호를 위하여 시스템의 각 자원마다 해당 자원을 사용할 수 있는 사용자의 리스트를 유지하여 사용자들의 자원 접근을 제한하는 방법이다. 각 객체에 대한 리스트는 <영역, 권한집합>의 순서쌍으로 구성한다. 리스트와 접근 권한 집합의 결합으로 확장할 수 있다. 효율의 향상을 위하여 기본 권한 집합을 먼저 검사한 후 나중에 접근 리스트를 검색하기도 한다. 단점으로는 접근 제어 리스트의 변경이 현재 객체를 사용하고 있는 어떤 사용자에게도 영향을 미치지 못하는 점이 있다.





- 도메인을 위한 권한 리스트 (Capability Lists for Domains) : 권한 도메인에 대한 권한 리스트는 객체와 그 객체에 허용된 조작 리스트이며, 다른 권한 리스트와 서로 포인터로 연결되어 있다. 권한을 소유한다는 것은 접근을 허용 받음을 의미한다. 권한 리스트는 보호 도메인과 결합되어 있으나 해당 도메인에서 수행중인 프로세스가 직접 액세스할 수 없다. 사용자에 의해서 간접적으로만 접근이 가능한 보호된 객체이다. 권한 리스트는 운영체제가 관리한다.




10. 보안 위반


1) 기밀성 침해 : 이런 종류의 위반은 인증받지 않고 자료를 읽는 것을 포함한다. 전형적으로 기밀성의 침해는 침입자의 목표이다. 시스템에서 비밀 데이터나 신용 카드 정보, 신원 정보 등의 일련의 데이터들을 획득하면 침입자는 직접적으로 경제적인 이익을 취할 수 있다.


2) 무결성 침해 : 이 위반은 인증받지 않은 자료를 수정하는 것을 포함한다. 예를들어 그러한 공격은 자료 제공자를 신뢰하는 측에서는 예상치 못한 잘못된 정보의 제공으로 이어질 수도 있고, 중요한 상업용 어플리케이션의 소스 코드가 변경되는 일이 발생될 수 있다.


3) 가용성 침해 : 이 위반은 인증받지 않고 자료를 파괴하는 것을 포함한다. 어떤 크래커들은 경제적 이익을 얻기 보다는 시스템을 망가뜨리고 권한을 얻거나 그것을 과시한다. 웹사이트를 나쁜 모습으로 바꾸어 버리는 것이 이런 종류의 공격의 일반적인 예이다.


4) 서비스 가로채기 : 이 위반은 인증받지 않고 자료를 사용하는 것을 포함한다. 예를 들어 침입자는 파일 서버로 동작하는 데몬을 시스템에 설치할 수도 있다.


5) 서비스 거부 : 이 위반은 시스템의 적법한 사용을 막는 것을 포함한다. 



11. 시스템 위협


1) 가장(masquerading) : 통신상에 있어서 다른 참여자인 것처럼 가장하는 것이다. 가장에 의해 공격자는 신원 확인의 정확성을 보장하는 인증 과정을 침해함으로써 정상적으로는 허락되지 않는 권한을 얻거나 자신의 권한을 높인다. 이 권한은 보통 때에는 획득할 수 없는 특권한을 말한다.


1) 중간자 공격(Man-in-middle) : 이 공격에서 공격자는 통신상의 데이터 흐름 중앙에 자리 잡고 수신자에게 송신자인 것처럼 가장하고, 송신자에게는 수신자인 것처럼 가장한다. 중간자 공격은 활성화된 통신 세션을 가로채는 세션 하이재킹이 선행된다. 


2) 세션 가로채기(Session-Hijacking) : 두 컴퓨터간의 연결이 활성화되면 그 활성화된 상태를 공격자가 가로채어 모든 작업을 감시하거나 제어할 수 있게 된다. 

 - TCP 세션 하이재킹 : 서버와 클라이언트 통신 시 TCP의 시퀀스 넘버를 제어하는 데 발생하는 문제 공격이다. 서버와 클라이언트가 TCP를 이용해 통신하고 있을 때 RST 패킷을 보내 일시적으로 TCP 세션을 끊고 시퀀스 넘버를 새로 생성하여 세션을 빼앗고 인증을 회피한다.


3) 재전송 공격(Replay attack) : 주고받는 데이터를 가로채서 다시보내는 것이다. 정상적인 데이터를 악의적인 의도나 부정한 방식으로 다시 보내는 행위들로 구성된다. 때론 단순히 되풀이하는 것이 공격이 되기도 한다. 예를 들면 돈을 전송해 달라는 요청을 반복하는 경우가 이에 해당한다. 그러나 보통은 메시지 변경을 수반하여 역시 권한을 올리기 위함이 목적이다. 




'운영체제' 카테고리의 다른 글

운영체제 정리 및 요약 #1  (0) 2015.08.19