ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 18. 세그먼테이션 (Segmentation)
    운영체제/운영체제 정리 2020. 1. 27. 01:41

    프로세스를 자르는데 페이징 같은 경우는 일정 크기로 잘랐다. 이번에는 논리적인 구분(= 세그먼트 )으로 잘라서

     

    가변크기로 메모리에 배치한다.  따라서 한 부분의 사이즈는 모두 다를 수 있다.

     

    프로세스라는 것은 세그먼트의 집합으로 볼 수 있다. 프로세스는 기본적으로 코드 데이터 스택 등으로 되어있다고

     

    했다. 따라서 프로세스는 세그먼트의 집합이다. 코드 데이터 스택 영역 등의 길이는 모두 다르므로 사이즈는 모두

     

    다르다. 페이징을 배울 때는 모두 일정한 크기로 잘라 넣었지만 꼭 그럴 필요가 있는가?

     

    의미있는 사이즈로 자른 후에 메모리에 넣는 것이다.

     

     

    이번에는 디스크에 있는 프로그램을 세그먼트 단위로 다르자.  s0 s1 s2 s3로 나눈 후 메인 메모리로 올리고

     

    다음과 같은 상태라고 두자. 

     

    이제 CPU를 속여야 한다. CPu 입장에서는 프로세스가 연속된 메모리 공간에 위치하도록 해줘야 한다고 했다.

     

    마찬가지로 mmu를 두어서 페이지 테이블을 두었듯이 세그먼트 테이블을 만들자.

     

    s0는 메모리에 3500번지에 s1는 0번지 s2는 500번지 s3는 3000번지에 있으니 다음과 같이 만든다.

     

     

     

    CPU가 내는 주소는 페이징을 할 적에는 p ( 페이지 테이블 번호) d ( 변위 )로 나타냈었다

     

    따라서 세그먼트로 나눌적에 CPU에 주소는 s (세그먼트 테이블 번호)와 d로 나타내자.

     

    예를 들어 s가 0이고 d가 0이라면 페이징때와 마찬가지로 실제로 물리 메모리는 3500 + 0으로 3500번지로 가게 된다.

     

     

    페이징 때는 페이지 테이블의 값이 프레임 번호를 나타냈다면 세그먼테이션에 경우 세그먼트 테이블의

     

    값은 번지를 가리킨다. 그리고 이 부분을 base라고 한다.

     

     

    또 하나의 예를 들어보자 s = 2 d = 800

     

    s는 2  d는 800으로 두자.  500 + 800 = 1300번지인데 실제로 1300번지는 전혀 엉뚱한 곳을 가리키게 된다.

     

    따라서 사실 세그먼트 테이블에는 limit가 추가돼야 한다. 이 limit 값에는 메모리 크기들을 넣어준다.

     

     

    따라서 s = 2 d = 800은 limit의 범위를 벗어나게 되고 ( 800 > 400 ) 세그먼트 테이블에서 CPU로 interrupt 신호가

     

    가게 된다. CPU는 인터럽트 신호를 받으면 OS 영역에서 프로세스를 강제 종료시키게 된다.

     

    이런 식으로 CPU가 내는 주소가 엉뚱한 곳으로 가지 않도록 해줄 수 있다.

     

     

    보호측면에서는 논리적으로 의미가 있는 구분으로 자른 세그먼테이션이 페이징보다 우월하다.

     

    페이징 같은경우 예를들어 코드와 데이터 부분이 같은 페이지 안에 있을 수 있고 따라서 코드 측면을 보호하려고

     

    한다면 설정하기가 까다로운 점이있다.

     

    공유측면에서 역시 같은 맥락에서 페이징 보다 우월하다. 

     

     

     

    세그먼테이션의 단점은?

     

     

    p1의 코드 부분을 잘라서 넣고 p2 역시 잘라서 넣었다고 가정하자.

     

    이제 p3를 넣으려고 하는데 페이징이 아니니 메인 메모리는 프레임 단위로 나눠지지 않았고

     

    그 결과 다시 크기가 다른 여러개의 홀이 생기게 된다. 또 논리적 단위로 다르다보니 홀들을 합치면

     

    들어갈 수 있지만 각각의 홀은 크기가 부족한 경우가 생기게 된다.

     

    즉 외부단편화의 문제가 다시 생기는 것

     

    앞 서 말했듯 외부단편화는 메모리 손실이 내부단편화 와는 달리 많다고 했다.

     

    우리가 프로세스를 잘라서 메모리에 넣는 가장 큰 이유는 외부단편화를 없에기 위해서 였는데

     

    세그먼트 방식은 외부 단편화를 해결할 수 없는 것. 현실적으로 불가능한 방법이다.

     

     

    세그먼트 방식은 보호와 공유 측면에서 좋고 페이징은 외부 단편화가 없어지니 이 두개를

     

    합친다면 어떨까?

     

     

    따라서 세그먼트를 페이징해보자

     

    보통 하나의 프로세스는 의미있는 단위로 코드 데이터 스택으로 나눌 수 있다. 일단 세그먼트 단위로

     

    자르자.  즉 코드부분 데이터부분 스택 부분을 일정 크기로 자르는 것.

     

    1. 처음에는 세그먼트로 자르고

     

    2. 각 세그먼트를 페이지로 자르고

     

     

     

    이렇다 보니 CPU에서 논리적 주소를 물리적 주소로 변환 할때 세그먼트 테이블과 페이지 테이블을

     

    모두 거치게 된다. 따라서 주소 변환에 시간적으로 부담이 더 많아질 수 있고 속도가 줄어 들 수 있다.

     

     

     

     

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

    20. 페이지 교체  (1) 2020.02.02
    19. 가상 메모리  (0) 2020.01.30
    17. 내부 단편화와 페이지 테이블  (0) 2020.01.20
    16. 외부 단편화와 페이징  (0) 2020.01.10
    15. 메모리 낭비 방지  (0) 2020.01.05
Designed by Tistory.