21.세그멘트 테이블, 주소변환

내부단편화, 페이지 테이블

파워를 키면 OS가 메인 메모리로 올라간다. 프로세스들이 메모리에 연속으로 들어가게되면외부단편화 문제가 발생
그래서 메모리에 프로그램을 프레임 단위로 나눠 흩어져서 들어가게 했다.
하지만 CPU는 페이지 테이블로 인해 연속적으로 위치한다고 생각하게 된다.
페이지를 이용해서 내부단편화가 발생하지만 이는 미미한 정도이다!! 페이지 테이블은 고속의 SRAM으로 만드는데 이를 TLB (Translation Look-aside Buffer)라 한다.

페이지 테이블에서 물리주소를 찾을 수 있을 때 히트했다고 한다.

보호

모든 주소는 페이지 테이블을 경유한다. 그러므로 페이지테이블 엔트리(페이지 테이블의 끝쪽)마다 R,W,X 비트를 두어 접근 제어를 한다.

공유

문서편집기를 세개 띄웠다고 가정하자. 각 프로그램마다 코드, 데이터, 스택이 따로 할당되면 메모리의 낭비이다. 코드는 공유가능하므로 하나만 만든다. 즉 페이지들이 코드영역은 셋다 똑같은 부분의 프레임을 가르키게 된다.
코드가 공유되려면 코드의 내용이 실행중에 변경되면 안된다, 이를 non-self- modifying code = reentrant code = pure code 라고 한다.
프로세스의 페이지 테이블 코드 영역이 같은 곳을 가리키게

세그멘테이션 Segmentation

페이지는 일정크기로 잘랐다.
세그멘테이션은 프로세스를 논리적 내용(=세그멘트)으로 잘라서 메모리에 배치!
코끼리를 자를때 페이지는 같은 크기로 자르지만 세그멘테이션은 논리적 크기(얼굴,몸통,꼬리)로 자른다.

프로세스는 세그멘테이션의 집합니다!. 프로세스는 코드 데이터 스택 세개의 뭉치가 존재한다. 하나의 프로세스는 세개의 프로세스의 집합이다! 일반적으로 세그먼트들의 크기는 다르다.

백킹스터어에 프로세스가 있을 때 메인메모리에 올리기 위해 세그먼트로 나누고 메모리로 올린다.(역시나 비연속적)
CPU를 속이기 위해 역시나 세그먼트 테이블을 만든다. 그리고 CPU가 낸 세그먼트 번호, 변위이고 세그먼트 테이블의 인덱스에 속한값+변위로 실제 주소를 알 수 있다. 또한 세그먼트 테이블에는 1차원 배열형태인 페이지 테이블과 다르게 base, limit로 즉 2차원배열형태로 구성된다. 만약 CPU가 낸 d의 값이 limit보다 클 경우 CPU로 인터럽트를 보내게 된다.

논리주소 (Logical address)

CPU 가 내는 주소는 segment 번호(s) + 변위(d)

주소변환: 논리주소 → 물리주소 (Physical address)

세그멘트 테이블 내용: base 그리고 limit
세그멘트 번호(s)는 세그멘트 테이블 인덱스 값
s 에 해당되는 테이블 내용으로 시작 위치 및 한계값 파악
한계(limit)를 넘어서면 segment violation 예외 상황 처리
물리주소 = base[s] + d


예제

Limit / Base
1000 / 1400
400 / 6300
400 / 4300
1100 / 3200
1100 / 3200
1000 / 4700

  1. 논리주소 (2,100) 는 물리주소 무엇인가? 4400
  2. 논리주소 (1, 500) 은 물리주소? 6800이라하면 틀렸다!!! 해당주소 없음!!(limit를 넘는다)

정리

운영체제를 처음배울땐 프로세스들이 순차적으로 들어가는지 알았다. 그러다 보니 메모리 낭비가 심해서 자르기로 함.
그래서 일정크기로 자르는 페이징 기법이 나왔고 논리적 크기로 자르는 세그멘테이션이 나왔다.
페이징을 사용하는 방법이 더 일반적이다.

세그멘테이션은 보호와 공유측면에서 페이징보다 낫다.
왜 그럴까? : 모든 주소는 세그멘트 테이블을 경유하므로, 세그멘트 테이블 엔트리마다 r, w, x 비트 두어 해당 세그멘트에 대한 접근 제어 가능
뭐야 페이지 뭐가다른데? : 페이지 단위로 자르면 일정한 크기이기 때문에 코드,데이터가 섞이는 부분이 생길 수 있다. 즉 안심,등심이 섞인 부분이 생겨 r로만 줄지 rw로 줄지 논란이 생길 수 있다.

그러나 대부분의 운영체제는 페이징을 쓴다

왜? 그건 다음포스팅에서..

Share