본문 바로가기

Computer Science/OS

중첩, 연속/불연속 메모리 할당(내부/외부 단편화), 고정분할(같은크기, 다른크기), 가변분할(최적, 최악, 최적적합), 페이징의 개념

동적적재 vs 정적적재

동적적재는 메모리를 항상 사용하지 않기 때문에 동적적재가 메모리 효율이 좋습니다.

 

 

 

중첩 overlay

프로세스가 필요한 프로그램을 잘게 쪼개서

초기에는 조금씩 메모리를 사용하고 다음 부분을 사용하기 위해 처음에 올린 것을 버립니다.

이 기술은 오래된 기술입니다.

 

예시입니다.

기본(심벌 테이블, 공통 루틴, 중첩 구동기)은 그대로 두고

돌려야 할 패스들을 돌립니다.

 

스와핑(=프로세스 교체)

중단 상태 - 준비, 대기 상태가 하드디스크로 쫓겨날 수 있습니다.

이때 중기 스케줄러가 일을 하는데 이런 일을 스와핑이라고 합니다.

 

 

연속/분연속 메모리 할당

이런 식으로 메모리공간에 같은 프로세스가 쪼개져서 들어가는 것을 불연속 메모리 할당이라고 합니다.

 

 

MMU가 주소변환, 메모리 보호

상한 값이 넘는가? - 다른 프로세스 메모리 주소 침범하는가?

프로세스의 기본 주소에 어떤 값을 + 해서 주소를 얻습니다.

 

연속 메모리 할당 vs 불연속 메모리 할당

둘의 차이입니다.

 

고정 분할 - 운영체제가 메모리에 금을 그어놓는 것입니다.

 

가변 분할

처음에는 금이 없다가 점점 생기는 것입니다.

 

연속적으로 할당하든 불연속 적으로 할당하든 고정, 가변 분할할 수 있습니다.

불연속 메모리 할당에서 고정 분할을 페이징이라고 하고

가변 분할을 세그먼테이션이라고 합니다.

 

8M로 금이 그어져 있었을 때 내가 6M를 넣으면 

2M가 남습니다.

 

내부 fragmentation - 메모리에 남는 공간

외부 fragementation - 누구에게 할당된 바 없지만 너무 작아서 쓰지를 못합니다.

 

연속 메모리 할당에서 고정 분할을 했을 때 외부 프레그먼트가 있나요?

없습니다.
미리 정해진 선을 넘을 수 없습니다.

 

processs4가 빈자리에 막 들어옵니다.

그러면 작은 조각이 여러 개 남게 됩니다.

extra fragmentation - 누구에게 할당된 바 없지만 너무 작아서 쓰지를 못합니다.

중요한 건 "프로세스가 차지하지 않은 것입니다."

 

내부 프레그먼트는 프로세스가 차지한 것입니다.

 

 

3번입니다.

 

2번 설명 -  미리 금 그어놓으면 내부 프로그 먼트는 생길 수 있습니다.

 

 

 

단일 프로그래밍 환경에서 연속 메모리 할당

 

다중 프로그래밍 환경에서 연속 메모리 할당

고정 분할, 가변 분할이 있습니다.

가변 분할 - 프로세스가 달라고 할 때마다 메모리를 주는 것입니다.

 

  • 최초 적합 
  • 최적 적합 - 최고로 적합
  • 최악 적합 - 제일 큰 방을 줍니다. 

이 것을 메모리 정책 중 

  • 정책 정책
  • 배치 정책
  • 교체 정책

중 뭘까요?

배치 정책입니다.

 

고정/가변 분할 비교입니다.

OS의 입장에서 미리 금 그어놓는 게 좋습니다.

미리 금 그어놓으면 내부 단편화는 무조건 발생합니다.

 

미리 금을 그어놓지 않는 가변 분할 예시

 

 

내부 단편화란?

P2가 요청한 부분보다 더 큰 부분을 할당받을 수 있습니다.

 

크기가 같게 금이 그어져 있습니다.(=고정 분할)

 

2byte 내부 단편화가 생깁니다.

 

고정 분할 사이즈가 2^12 Byte입니다.

 

프로세스 테이블 - 프로세스가 메모리의 어떤 부분을 가지고 있는지 확인하는 부분입니다.

 

포인터에 필요한 비트는?

고정 분할 영역이 몇 개인가 생각해야 합니다.
2^32개 있는데 
2^12개씩 조각조각 내놓은 것입니다.

즉, 2^20개만큼의 조각이 있습니다.
그러면 2^20개를 구분하려면 20bit가 필요합니다.

 

다른 크기로 고정 분할하면?

10, 4, ,4 ,4로 쪼갤 수 있습니다.

 

왜 내부 단편화라고 부를까요?

요청된 크기가 가지고 있는 메모리 크기보다 작아서!

내가 차지해서 못쓰는 것 = 내부 단편화입니다.

 

 

내가 만약 300050을 넣으면 작업 2에서 발견할 수 없으니 오류를 냅니다

 

그러면 logical address는 무엇이 발생되어야 하나요

10을 넣어서 300040에 10을 더해서 300050을 만들어 줘서 메모리 주소를 만들어 냅니다.

 

왜 이게 메모리를 보호하는 과정일까요?

addressing error를 발생시키지 않고 다른 프로세스가 차지하고 있는 메모리를 침범하지 않습니다.

 

그런데 800000을 넣으면 작업 2 범위 밖에 있으니 addressing error를 발행합니다.

 

 

고정 분할 - 분할 영역별 대기 큐

큐 끼리 이동을 못하기 때문에 

12KB가 비어있어도 전용 큐가 있으니 다른 큐는 들어갈 수가 없습니다.

  • 5KB, 2KB 프로세스가 종료되더라도 3KB가 들어가기 때문에
  • 7KB 프로세스가 대기
  • 뒤의 1KB, 4KB 프로세스도 대기

 

가변 분할

보호하는 방법은 고정 분할과 비슷합니다.

프로세스마다 기준값크기 값을 저장해서 크기 값보다 크면 오류입니다.

 

 

가변 분할을 외부 단편화를 발생시킵니다.

외부단편화 - 사용하고 있지도 않은 메모리 공간이 나오는 것입니다.

 

어떻게 하면 외부 단편화를 줄일까요?

 

first fit

best fit

 

 

worst fit 

최적 적합보다 공간 활용률 높음? 왜?

외부 단편화가 생겨도 넓은 크기가 남기 때문입니다.

 

가변 분할에서 외부 단편화가 생기기 마련 인대

해결방법 2가지가 있습니다.

 

인접한 빈 메모리를 통합하는 방법이 있습니다.

빈 공간을 합쳐서 큰 빈 공간을 만드는 것입니다.

 

 

메모리를 압축시키는 것입니다.

메모리를 막 옮겨서 남은 공간을 잘 모아 둡니다.

 

메모리 압축

 

주소를 바인딩하는 시점 3가지가 있습니다.

  • 컴파일 시간
  • 적재 시간
  • 실행 시간

메모리 압축하려면 실행 시간에 압축을 해야 합니다.

 

 

다중 프로그래밍 환경에서 연속 메모리 할당

  • 고정 분할일 경우 영역별 큐/ 통합 큐
  • 고정 분할일 경우 분할 영역의 크기와 개수
  • - 시스템 부하 분석 필요
  • - 개수는 다중 프로그래밍의 정도
  • - 영역의 크기에 따라 시스템 전체의 효율 다름
  • 가변 분할일 경우 메모리 압축 시기 혹은 주기

 

 

버디 시스템

버디 시스템 - 고정 분할, 가변 분할의 중간점입니다.

큰 공간을 반복적으로 이등분하여 작은 공간들을 만들며, 가능할 때마다 인접한 빈 공간들을 합치는 과정 반복

  • 고정 분할 방식처럼 구역이 생기고 내부 단편화가 발생
  • 가변 분할 방식처럼 유동적인 메모리 분할이 가능

금이 그어져 있기는 한대 되게 느슨하게(점선으로?) 그어져 있습니다.

 

합쳤다 나눴다가 합쳤다 나눴다가.

그런데 정해진 크기로 나눠집니다.

 

127짜리 쓰고 싶은대 128짜리를 써야 합니다.(=내부 단편화)

 


불연 속 메모리 할당

 

페이징

물리 메모리에 있는 건 - 프레임

논리 메모리에 있는건 - 페이지

 

불연속 적이기 때문에 이것을 저장한 페이지 테이블이 필요합니다.

 

3번 페이지를 6번 프레임에 저장한다.

 

왼쪽은 페이지 번호, 오른쪽은 프레임 번호

 

 

페이지 시스템에서 프로그램을 실행하려면

 

페이징의 특징

자투리 없이 다 쓸 수 있습니다.

그런데 내부 단편화는 발생할 수 있습니다.

마지막 페이지는 안 차있을 수 있습니다.

프레임은 꽉 차 있겠죠?

 

 

논리 메모리에는

페이지 주소몇 번을 가리키고 있는지 적혀있습니다.

이것을 이용해서 프레임을 찾아야 합니다.

 

페이지 테이블에서 페이지 번호는 인덱스입니다.

 

프레 임안에서 몇 번째인지를 알아야 합니다.

이 과정을 하드웨어 적으로 실행합니다.

 

페이지 개수는?

64개 = 2^6

이 가상 메모리 주소의 비트 수는?

가장 주소(=논리적 주소 공간)
256KB를 가지는 메모리 = 256K 개 = 2^18개를 구분하려면 몇 비트가 필요한가요?
18개 

페이지 번호에 사용하는 비트와 페이지 오프셋에 사용하는 비트는?

18비트 중에 페이지를 구분하는 비트와 페이지 안에 오프셋을 구분하는 비트가 있을 것입니다.
페이지 개수는 2^6개를 구분하면 되니 6비트를 사용합니다.
페이지 오프셋은 4KB(=2^12) 개를 구분해야 합니다. 12비트를 사용합니다.

 

 

논리적 주소가 있습니다.

(페이지 번호, 오프셋)

페이지 크기는 2^10입니다.

즉, 1칸이 1024입니다.

 

ex)

256은

페이지 번호는 0

오프셋은 256이 되겠습니다.

 

1024는

(1024*1 , 0)

 

1027은

(1024*1 + 3)

 

2048은

(1024 *2 +0)

 

10243은

(1024 * 10 + 3)

 

페이지 크기는 2^10B

페이지 개수는 2^6개

논리적 주소 공간의 크기는 최대 2^16B

728x90