운영체제 페이징, 세그먼트 차이

Kangho LEE·2021년 4월 5일
1

오늘은 변명부터 해보려 합니다.. 과제를 얕본 저의 잘못도 있겠지만 운영체제 과목의 과제는 항상 어려운 것 같습니다. 어제는 하루종일 네트워크와 운영체제 과제를 하느라 저의 공부를 따로 하지 못해 오늘 따로 어제 했던 과제들의 내용과 오늘 공부한 내용을 바탕으로 작성해 보려고 합니다.

요즘 느끼는 것이지만 취준은 참 어려운 것 같습니다. 제가 원하는 기업을 가고 싶어서 열심히 하고 있지만 속해있는 곳도 없이 무엇인가 준비한다는 것은 어렵고 마음에 짐이 되는 일인 것 같습니다. 비록 저는 아직 막학기 학생이지만 제 주위 친구들이 취업하는 것을 보면 가끔은 더 불안해 지는 것 같습니다. 나중에 저도 졸업을 했는데 취직을 하지 못했다면 어떻게 하지? 원하는 곳에 취업을 할 수 있을까에 대한 고민이 많은 것 같습니다.
그래도 이런 어려움을 겪고 나면 항상 성장한다고 생각합니다. 그런 점에서 언젠가 이 기록들과 저의 생각들이 더 큰 성장에 밑거름이 되도록 영양분을 꽉 채워 보려고 합니다.

운영체제

프로세스가 실행되기 위해서는 메모리에 올라가야 합니다. 하지만 메모리에 효율적으로 프로세스를 올리기란 쉽지 않습니다. 프로세스 가상 메모리 전체를 실제 메모리에 올릴 수도 있겠지만 프로세스에서 쓰이지 않는 공간이 너무 크게 올라가거나 큰 프로세스 덩어리들만 있게되어 작은 쓰이지 못하는 조각들이 많이 발생하게 됩니다. (externmal fragment)

우리는 그래서 조금 더 효율적으로 프로세스의 가상 메모리를 실제 메모리에 올리기 위해 두 가지 방법을 쓰려고 합니다. 두 방식의 공통점은 통으로 올리지 않고 가상 메모리를 의미상이나 일정한 크기로 나누어 관리하고 올리는 방법을 사용합니다. 아무래도 큰 덩어리들을 잘게 썰면 더욱 쉽게 이동하고 많은 공간들이 낭비되지 않겠죠.

두 가지 방법 중 의미 단위로 나누는 방법은 segement 방법과 일정한 크기로 물리 메모리와 가상 메모리를 나누는 page 방법이 있습니다. 이 두가지 방법은 각각 장단점이 있습니다.

먼저 segment단위로 나누는 장점은 다음과 같습니다.
먼저 테이블 용량이 적습니다. 이게 무슨말이냐 하면 아무래도 의미단위로 나눈다는 것은 코드 , 스택, 힙, 데이터 4 부분으로 나눌 수 있는데 프로세스마다 테이블을 저장하고 있고 실제 물리 메모리 어디에 위치해 있는지를 기록해두는 곳을 세그먼트 테이블이라고 합니다. 테이블에 정보라고 해봤자 프로세스 마다 몇개 되지 않기 때문에 많은 크기를 차지 하지 않습니다.

두번 째 의미 단위로 물리 메로리를 저장하고 있기 때문에 관리가 수월합니다. 공유와 보안에 있어서paging 기법보다 효과적이다는 장점이 있습니다. 특히 데이터 부분에 많은 공유데이터가 있다면 세그먼트 단위로 저장되는 것이 효과적일 것입니다.

단점으로는 external fragment가 발생합니다. 아무래도 paging보다는 큰 덩어리로 자르고 일정한 크기가 아니다 보니 메모리를 효율적으로 사용하기가 좀 더 어렵습니다. 이를 해결하기 위해 3가지 알고리즘이 있는데 first fit(빠르다), best fit(느리지만 효과적이다), worst fit(다음 프로세스를 위해 일부러 큰 덩이리 fragment를 만든다)를 이용해 물리 메모리에 올리게 됩니다. 하지만 알고리즘을 적용해도 여전히 fragment들은 남을 수 밖에 없습니다.

paging 기법, 물리 메모리와 가상 메모리를 같은 크기로 나누어 블록을 넣듯이 채우는 기법입니다.
같은 크기로 나누어진 하나의 물리 메모리 저장 공간을 프레임이라고 하고 나누어진 가상 메모리 하나는
페이지라고 부릅니다.

장점으로는 효과적으로 메모리를 사용할 수 있다는 것입니다. 필요없는 페이지 부분을 실제 메모리에 올리지 않아도 되고. 적당한 크기로 자르게 된다면 fragment도 거의 생기지 않기 때문에 현대의 운영체제에서도 대부분 paging 기법을 이용하고 있습니다. (너무 크게 자른다면 internal fragment가 생기고 너무 작게 자른다면 메모리를 너무 자주 찾기 때문에 오버헤드가 발생하게 됩니다.)

단점으로는 큰 페이지 테이블 크기입니다. 세그먼트와 다르게 작은 단위로 잘랐기 때문에 각자 다른 물리주소에 위치하고 있어 그 위치 정보를 담은 테이블이 필요하게 됩니다. 이 테이블의 크기가 작지가 않기 때문에 따로 메모리에 저장을 해두고 접근해야 한다는 단점이 있습니다. 심지어 메모리에 2번을 접근해야 원하는 주소를 알 수 있게 된것이죠.

이제 이 두 개를 개선한 방법으로 hybrid paging과 multilevel paging이 있습니다.
간단하게만 설명 드리면 hybrid는 segment 테이블과 page 테이블을 동시에 사용하는 것입니다. 세그먼트 테이블은 용량이 적으니 이것을 인덱스 처럼 활용해 세그먼트 단위로 잘라진 page테이블 주소를 가지고 있습니다. 그럼 우리는 세그먼트 테이블 인덱스 + 페이지 테이블 인덱스 를 통해 빠르고 용량도 아낄 수 있는 방법으로 메모리를 관리 할 수 있는 것이죠.

multilevel paging도 위 hybrid와 비슷합니다. 다만 여기는 page테이블 주소를 세그먼트 테이블이 아닌 또 다른 페이지 테이블에 연결시켜 페이지 테이블 용량을 줄이는 것입니다. 다른 페이지 테이블로 연결하는 테이블을 페이지 디렉토리 테이블이라 하겠습니다. 페이지 디렉토리 테이블에 쓰이지 않는 주소는 valid bit(테이블 옵션이라고 생각하면 편함)을 0으로 두어 실제 물리 메모리에 올리지 않고도 인덱스 별로 해결 할 수 있게 됩니다.

실제 인텔이 이 방법을 사용해 4 level multilevel 페이징을 하고 있고 위에도 말씀드렸다 싶이 메모리에 5번 접근하긴 해야되지만 메모리를 쉽고 효율적으로 사용할 수 있다는 장점이 크게 작용하여 사용하는 것 같습니다.
요새는 이렇게 5번 접근 하는 것 보다 해시를 이용해 빠르게 접근 하는 방법도 있다고 합니다.

네트워크

네트워크는 정말 간단히만 정리하겠습니다.
우선 현재 아날로그 신호를 디지털 신호로 바꾸어 송신하는 것, 디지털 신호를 디지털 신호로 송신하는 방법에 대해 공부하고 있습니다.

아날로그 신호를 디지털 신호로 바꾸기 위해서는 PCM (Pulse code modulation)방법과 DM(delta modulation) 방법이 있습니다.

PCM 방법은 sampling, quantization, encoding세 단계로 나누어져 있습니다.
DM은 이거보다 간단한 방법으로 전 신호와 비교해 변화가 생긴다면 이것을 + 나 -로 기록해 놓는 방법입니다.

디지털 신호를 디지털 신호로 보낼 때에 문제가 생기는 것은 주로
base line wandering - 간단히 말하면 받는 쪽에서 볼트를 헷갈려 분명 + 볼트인데 볼트가 약하다고 생각해 -나 0으로 받는 문제
dc component - 동일한 신호 0이 계속해서 가게 된다면 주파수가 낮아져 전송이 안되어 버리는 문제
synchronization - 엇박으로 비트를 받기 시작하면 데이터 전체가 다른 결과 값을 낼 수 도 있는 문제

이 세가지 문제를 해결하기 위한 방안으로
line coding, block coding, scrambling이 있습니다.

profile
우유와 누텔라

0개의 댓글