본문 바로가기

Dev.Basic/운영체제

[OS] 8-5. Memory Management V

Chapter 8-5. Memory Management V

Segmentation

프로그램의 주소 공간을 의미있는 단위로 자르는 것을 말한다.

process가 code, data, stack으로 나뉘는 부분을

code segment, data segment, stack segment로 나눈다.

물론 이것보다 더 작은 단위로 분할할 수도 있다.

작게는 프로그램을 구성하는 함수 하나, 하나를 세그먼트로 지정할 수도 있고,

크게는 프로그램 전체를 하나의 세그먼트로 정의할 수도 있다.

Segmentation기법은 분할된 조각들의 크기가 균일하지 않기 때문에 연속할당 시 발생했던 문제들이 그대로 발생할 가능성이 있다.

 

Segment에는 local address가 지정되는데,

logical  address는 <segment number, offset>으로 구성된다.

이를 Segment table이라고 한다.

세그먼트 각각의 길이가 동일하지 않을 수 있기 때문에 table에는 offset이란 개념으로 table의 length를 포함한다.

페이징 기법에서는 페이지의 크기가 균일하기 때문에 offset값이 결국 페이지 크기였지만,

세그먼트 기법은 offset이 결정되어야 한다는 단점이 존재한다.


그리고 Paging 기법에서와 마찬가지로 레지스터 두 가지와 함께 작동한다.

Segment-table base register(STBR)

Segment-table length register(STLR)


하지만 의미 단위로 나눔으로써 발생하는 장점도 존재한다.

각 Segment별로 Protection bit이 존재하여,

code, data, stack 별로 접근 권한을 설정할 수 있다.

그리고 장점이라고 할 수는 없지만 하나의 특징으로는

Segment는 page처럼 무수히 많이 존재하는 것이 아니기 때문에, table크기가 작다.



그래서 Paging 기법과 Segmentation 기법의 장점을 혼합하여 하나의 방식을 고안해낸 것이다.

Paged Sementation(Segmentation with paging)

세그먼트가 페이지로 잘리게 된다.

선 Segmentation 후 Paging 인 것이다.

메모리에 적재될 때는 Page 단위로 적재를 하고, (allocation 시 hole 발생문제 해결)

공유, 보안, 접근 권한에 대한 문제는 Segment 단위에서 수행한다.




<<*용어정리*>>

Dynamic Loading(동적 로딩)

필요할 때마다 필요한 부분을 메모리에 올리는 것을 말한다.

프로세스 전체를 메모리에 미리 다 올리는 것이 아니라 해당 루틴이 불려질 때, 메모리에 load한다.

이렇게 하면 memory utilization이 향상된다.

가끔식 사용되지만 코드 양이 많은 경우에 이 방법을 적용하게 되면 유용하다.(예 : 오류처리루틴)

운영체제의 특별한 지원 없이 프로그램 자체에서 구현이 가능하다.

프로그래머는 운영체제로부터 제공되는 라이브러리로 다이나믹 로딩을 구현하게 된다.

(Paging 기법은 하드웨어에서 처리되는 level이다.)



Overlays

프로세스 중 실제 필요한 부분만 메모리에 올리는 것을 말한다.

프로세스의 크기가 메모리보다 클 때 유용하다.

운영체제의 지원없이 오로지 사용자에 의해 구현되므로 프로그래밍이 매우 복잡하다.

(다이나믹 로딩은 운영체제로부터 지원되는 라이브러리를 이용하지만 Overlays는 그렇지 않다.)

작은 공간의 메모리를 사용하던 초창기 시스템에 적용했던 방법이다.



Swapping

메모리에 너무 많은 프로그램(프로세스)이 적재되어 있어서,

어느 프로세스를 일시적으로 메모리에서 backing store로 쫓아내는 것을 말한다.

Backing store(swap area)란, 디스크에 위치하는 공간이며, 사용자의 프로세스 이미지를 담을 만큼 충분히 빠르고 큰 저장공간을 말한다.


Swap In / Swap out

일반적으로 중기 스케줄러(swapper)에 의해 swap out 될 프로세스를 결정한다.

priority-based CPU scheduling algorithm을 통해,

priority가 낮은 프로세스 전체를 swapped out시키고 priority가 높은 프로세스를 메모리에 적재한다.

(*최근에는, 프로세스의 일부만 메모리에서 내쫓는 것도 swapped out되었다고 표현한다.)


backing store로 내려놓았던 프로세스를 다시 메모리에 올려놓을 때, 다시 바인딩을 해줘야 하는데,

이 부분에 있어서,

주소 바인딩이 Compile time binding 혹은 Load time binding 으로 시행되었다면,

swapped out되기 전의 주소로 , 즉 원래 메모리의 위치로 swap in 되어야 한다.

그래서 위 두 방법으로 바인딩을 했을 경우, swap in/out이 복잡해진다.

하지만, Execution time binding의 경우에는 다시 swap in 과정에서 메모리 영역에 다시 재바인딩해주면 되기 때문에,

그런 문제가 발생하지 않는다.

그래서, Swapping이 좀 더 효율적으로 이루어지기 위해서는 Execution time binding 방법이 필요하다.



Dynamic Linking

Linking을 실행시간( execution time )까지 미루는 방법을 말한다.

(<-> Static Linking )

반대되는 개념으로 Static Linking은 라이브러리가 프로그램의 실행 파일 코드에 포함되며, 이로 인해 실행 파일의 크기가 커진다.

동일한 라이브러리를 각각의 프로세스가 메모리에 올리므로 메모리가 낭비되는 문제가 발생한다.

이 문제를 해결한 것이 Dynamic Linking이다.

라이브러리가 실행 될 때, link(연결)되는 것이다.

라이브러리 호출 부분에, 라이브러리 루틴의 위치를 찾기 위한 stub이라는 작은 코드를 생성해둔다.

라이브러리가 이미 메모리에 있으면 그 루틴의 주소로 이동하여 라이브러리를 참조하면 되고,

없으면 디스크로 접근해서 읽어오면 되는 것이다.


<<*용어정리 끝*>>




Chapter 8-5. 끝

이 포스팅은 이화여대 반효경 교수님 강의를 듣고 요약한 내용을 담고 있습니다.



'Dev.Basic > 운영체제' 카테고리의 다른 글

[OS] 9-2. Virtual Memory II  (0) 2016.06.13
[OS] 9-1. Virtual Memory I  (3) 2016.06.07
[OS] 8-4. Memory Management IV  (1) 2016.06.05
[OS] 8-3. Memory Management III  (0) 2016.06.05
[OS] 8-2. Memory Management II  (0) 2016.06.05