가상 메모리 개발자 라면 알아야 하는 CS 기초 지식

2022. 9. 24. 18:33컴퓨터사이언스(CS)

728x90

안녕하세요 저번에는 가상 메모리에 대한 기초지식 알아두면 이해하기 편한 지식 몇 가지들을 몇몇 소개 하였습니다 이번에는 진짜 가상 메모리의 대해서 이야기해보려고 하는데요 사실 진짜 가상 메모리는 매우 엄청 중요합니다 가상 메모리를 모르냐 아냐 에따라 가끔 성능을 좌우하기도 합니다  OS 지식 중 꼭 알아야  할 지식이 아닌가 싶습니다.

 

그래서 오늘은 가상 메모리에 대해서 설명하려고 하는데요 사실 가상 메모리라는 것은 디스크입니다 디스크일정 부분을 잘라 메모리 인척 하는 디스크 형태 즉 디스크에 메모리 라고 이름을 붙혀줄순 없으니 디스크를 가상의 메모리 라고 하자 라고 한것 입니다 쉽게 말해서 그냥 디스크 일정부분을 시스템에서 운영체제에서 자동적으로 잘라 가상의 메모리 공간을 만들어준 것이라고 말할 수 있습니다 

 

우리가 우리의 컴퓨터에 대한 가상 메모리를  더 만들 수 있고 더 적게 만들 수도 있습니다  즉 우리가 가상 메모리를 지정해줄 수 있다는 말입니다 가상 메모리를 저번에 포스팅했던 Not - continuous allocation과   비슷한  형태와 운영방식을 가지고 있습니다

 

가상 메모리의 paging System  은 일단 먼저 알야아 합니다 가상메모리의 Pagung System  은 밑에와 같습니다

1. block 단위로 프로세스를 자른 것 각 하나당 page라고 부른다

2. 실제 main 메모리의  블록단위 형태로 잘라 놓은 것을 page frame이라고 한다 

 

 

위에 있는 것을 알아야 밑에 있는 가상 메모리의 특징을 이해 하실수 있습니다 자 가상메모리의 특징은 밑에와 같습니다 

 

가상메모리 특징

 

1 첫 번째로는 가상 메모리의 특징은 논리적 분할이 아니라 크기에 따른 분할이다 블록 단위는 4kb씩 자르는

한 단위라고 말씀드렸습니다 즉 만약 어떤 프로그램의 메서드가  6kb 라고 생각 해 보겠습니다  그뒤에는 

2kb 메소드가 있다고 가정해보겠습니다 그러면 그 메서드의 4kb는 한 단위로 올라가겠지만 그 뒤에 있는 2kb 바이트와

6kb 잘린 2kb 와 합쳐져 한 블록이 된다는 것을 알 수 있습니다 이렇게 논리적으로 분할하는 게 아니라 정해진 크기에 

따라 분할한다는 것을 알 수 있습니다 

( 리눅스에서는 block 단위를 정할 수 있다 하지만 window는 일반적으로 4kb~5kb라고 합니다 )

 

2 메모리의 파편화 가 생기지 않는다입니다 제가 위해서 말했던 page frame 말했던 거 main 메모리의 프레임 이 생겨서

각 블록당 하나씩 올라간다는 점에서 크기가 정해져 있지만 메모리 파편화는 생길 일이 없다는 것입니다 하지만 문제가 하나 있습니다 파편화는 생기지 않지만 내부적 파편화가 생길 수 있다는 것인데요 무엇이냐면 17kb짜리 프로세스 하나이다면  17kb를 블록단위로 나누다 보면 5 개 즉 4kb 4개와 1kb 지만 4kb 블록 안에 넣어야 하는 1개  프로세스 총 이렇게 블록이 5개 나오는데요  메모리에는 4kb 인식돼 잘 돌아가지만 사실 알고 보면 내부에는 1kb 인 내부적 파편화가  생기는 것을 알 수 있습니다 

 

 

가상 메모리가 돌아가는 방식은 밑에와 같습니다 

가상 메모리의 주소를 구분하기 위한 블록 pmt 블록이 운영체제의 핵심 ( 커널)에 pat 즉 page를 볼 수 있는 테이블이 들어갑니다 ( 각 프로세스당 하나씩)

page number ( 프로세스에서 page로 잘려나가면서 붙여진 순서) // residence bit ( 메모리 할당 여부 0이면 할당 안됨 1이면 할당됨)//pageframe number(메인 메모리 가 할당되었다면 메인 메모리의 할당된 페이지 프레임 번호)

 

이렇게 위에 pmt라는 테이블이 운영체제의 커널에 안에 등록되게 됩니다 

이렇게 등록이 된 후에 만약 프로세스를 사용하게 된다면  vitruarl address에  -> page number를 물어봅니다 그 후 페이지 -> number 와 entrySize( 각 표의 사이즈 )를곱해 b( pmt 블록의 크기를 ) 더하면 블록의 위치를 가서 확인합니다 -> 1이면 page frame 의 번호를 리턴합니다 -> 그후 p' 페이지 번호  와 page Size( 페이지의 크기 ) 를 곱해 d( 페이지와 얼마 너 떨어져 있는지를 더해주면  메인 메모리의 위치를 알 수 있을 것입니다 

 

이렇게 페이지의 메인 메모리의 위치를 알아줄 수 있을 것입니다 만약 메인 메모리가 등록되지 않았다면 ( 즉 residence bit 이 0이라면 ) page( block ) 단위로 잘린  블록을 main 메모리의 등록 후 pmt에 등록된 page frame 번호를 등록한 후  residence bit을 1로 바꿔 준후 위에 page frame 번호를 리턴합니다 부터 진행합니다 

 

즉 이렇게 프로세스를 부르거나 사용할 때  vitual address에서 이런 식으로 main 메모리를 억셉해서 사용합니다 이렇게 가상 메모리가 돌아가는 방법을 설명해봤는데요 사실  residence bit 0 일때의 방법과 그리고 residence bit 1 떄의 방법은 문제점이 한 가지가 있습니다 

 

1 residence bit 0 문제는 프로세스가 runing 상태로 됐을 때 ( cpu에 프로세스가 등록된 상태 )가 등록되었을 때 vitual address 가 0이면 main 메모리에 억셉을 해야 즉 디스크를 다시 억셉해야 합니다 그러면 프로세스는 aseelp 상태로 들어가게 되면 문맥 전환 ( 컨텍트 스위칭 ) 이 일어납니다 커널안에있는 pcb 블록에 정보를 저장해두는 여러가지 다른 것들은 블록이되는 상태들이 일어난데요  문맥전환 ( 컨텍트 스위칭 )  은 매우 오버해드가 큽니다 

 

2 residence bit 1의 문제는 프로세스가 디스크를 i/o 하지 않아서 컨택트 스위칭이 일어나지 않지만 커널 은 main 메모리 한 영역에 등록되어있는데요 첫 번째로 main 메모리를 억셉해 pmt에 확인을 후 다시 메인 메모리의 가서 연산을 한후 메인메모리의 주소를 알 수 있는 그런 상황이 일어납니다 즉 main 메모리를 두 번 연결해야 하는 상황이 일어납니다 

 

 

위에 두 문제 중 2번 문제는 여러 해 결 방법론이 있습니다 이렇게 위에 여러 방법 해결론을 한번 찾아 해결하는 방식으로 찾아보시면 아주 완벽하게 가상 메모리를 이해했다고 생각하시면 될 것 같습니다 감사합니다

728x90