[운영체제] 가상 메모리 개요

Robert.Yang·2023년 4월 16일
1

OS

목록 보기
19/22
post-thumbnail
post-custom-banner

이 포스트는 널널한 개발자님의 강의를 듣고 작성한 글입니다.

가상 메모리 개요

운영체제에서 가장 중요한 것이 가상메모리이다. 가상메모리 체계가 사실상 시스템 프로그래밍을 다루는 내용중에 가장 중대한 요소이다. 우선 가상메모리에 대해 조금 애기해보자면 어떤 PC가 있는데 PC의 스펙이 PC마다 실제 메모리 크기가 다르다. 즉, RAM의 용량과 HDD용량 제각각이다. 즉, 물리메모리라는 것은 크게 2가지인데 1차메모리이냐 아니면 2차메모리이냐는 것이다. 근데 중요한 것은 메모리 크기가 서로 다르니까 이때마다 어떤 S/W가 여기에 대해 의존성이 존재해서 그때마다 코드를 변경해야한다고 해보자. 그러면 개발측면에서 매우 난감할 것이다. 그런데 실제로 옛날에는 그랬지만 오늘날 범용 OS가 등장하고 그럴 필요가 없어졌다. 그래서 이 S/W를 어떤 가상화 형식 위에서 실행하다 보니까 메모리가 어떤 용량이든 잘 실행될 수 있도록 만들어주는 체계로 가상메모리가 필요해졌다. 그뿐만 아니라 이 가상메모리 안에 들어가 있는 것중에 장치에 대한 의존성이 있는데 특히 메모리에 대한 의존성이 있는데 이 의존성을 없애는 역할도 하고 더 중요한 것은 관리적인 측면에서 추상성을 제공한다는 것이 매우 중요한데 이 추상성 제공으로 인해서 보안이 올라갔다. 즉, 접근통제가 가능해졌다는 것이다. 이게 굉장히 큰 의미가 있다. 그리고 가상메모리 체계든 물리 메모리 체계든 중요한것은 메모리의 관리의 최소단위가 1byte인데 이 1byte마다 주소가 붙는데 이 주소가 32bit 체계면 최대용량 4GB이다.

아무튼 이때 주소 길이는 OS가 몇 bit냐에 따라 혹은 CPU가 몇 bit냐에 따라 의존적이다. 그래서 가상메모리가 나오면 일단 중요한 건 주소의 bit수부터 따져야 한다. 만약 64bit platform을 쓴다고 하면 주소 bit수가 64bit인거고 나올 수 있는 전체 경우의 수는 16EB이다.

만약 예를 들어 32bit platform이다고 하면 응용 S/W가 32bit이면 VMS를 보통 반으로 짤라서 앞에 2GB, 뒤에 2GB짤라서 쓴다. 그래서 앞에 2GB를 user-mode 영역이라고 하고 뒤에 2GB를 kernel 영역이라고 한다. 그리고 앞에 2GB중 0번지부터 어느정도는 OS가 사용하고 있다. 그래서 user-mode에서 쓸 수 있는 용량의 크기가 1.8GB정도이다. 그래서 C언어로 malloc()을 2GB 할당 요청하면 에러가 발생한다.

가상메모리에서 메모리 관리자가 사용할 수 있는 메모리 전체 크기는 물리 메모리와 스왑영역을 합한 크기이다. 여기서 메모리 관리자는 커널쪽에 존재한다. 이 메모리 관리자가 OS중에서 굉장히 중요한 핵심요소 중 하나다. 근데 요즘은 특별한 이유가 없다면 swap영역의 크기를 OS가 알ㅇ서 조절한다. swap이 늘면 용량이 늘어서 좋지만 swap이 자주 일어나면 I/O 효율이 굉장히 떨이지기 때문이다.

아무튼 VMS에서 메모리 관리자는 물리 메모리와 스왑영역을 합쳐서 프로세스가 사용하는 가상주소를 실제 메모리의 물리주소로 변환하는데 이러한 작업을 동적주소변환이라고 한다. 즉, 동적주소변환의 동적은 runtime이라는 것 즉, 프로세스가 실행중인 중간에 주소체계를 뭔가 변환한다는 것이다. 여기서 주소체계를 잠시 애기하면 물리적인 수준에서 주소애기를 하면 이때는 세그먼테이션으로 가는데 user-mode에서 프로세스 VMS를 일정단위로 짜르는데 이걸 페이지라고 한다. 그래서 세그먼테이션하고 페이징하고 섞어가지고 쓰는데 이걸 같이 이야기한다.

좀 정리하면 VMS에서 가변분할방식을 이용하는 기법을 세그먼테이션, 고정분할방식을 이용한 기법을 페이징이라고 한다. 그래서 예를 들어 hello-world 콘솔 어플리케이션이 있다고 보자, 중요한 것은 이 S/W가 실제 쓰는 메모리는 2GB 전부 사용할까? 실제로는 그렇지 않고 많이줘도 1MB정도 쓸 것이다.

예를 들어 위의 그림의 프로세스3가 진짜 쓰는 실제 RAM의 메모리 주소가 10이다고 해보자. 하지만 VMS에서는 메모리 주소가 100을 가르킬 수 있다. VMS시작은 메모리 주소 0부터인데 웃긴것은 프로세스마다 VMS 체계에서는 각자 고유의 메모리 주소를 갖기 때문에 각 프로세스 VMS의 0번지라도 실제 RAM은 다를 수 있다. 그래서 물리적 메모리 위치를 두고 봤을때는 당연히 다른 위치가 되는 것이고 심지어 경우에 따라 swap되었다고 하면 HDD로 갈 수 있는 것이다.

어쨌든 물리 메모리상의 주소가 절대주소가 부여되어 있는데 그 기준주소를 두고 즉, 프로세스마다 같은 주소를 말한다 하여 물리메모리는 다른 주소이다. 어느 프로세스A가 메모리를 쓰고 있으면 메모리 매니저 안에 매핑 테이블이 있는데 이 매핑 테이블에 가보면 프로세스 A의 0번위치가 물리메모리의 세그먼트0번에 존재한다 이런식으로 표기되어 있다.

그리고 매핑테이블은 물리메모리가 세그먼테이션으로 분할된 경우뿐만 아니라 페이징으로 분할된 경우에도 똑같은 방식으로 적용된다.

매핑테이블은 자료구조로 배열일 가능성이 있다.

매핑테이블을 OS가 관리하고 있는데 그래서 좋은점이 만약에 프로세스A가 잘못된 연산을 하여 죽으면 매핑 테이블의 프로세스A 컬럼을 날려버리고 가르키고 있던 세그먼테이션0번을 여분의 공간으로 빼버린다. 즉, 관리를 잘 해준다.

가상메모리를 썼을 때 굉장히 좋은점이 만약 프로그램이 죽으면 이 프로그램이 연결되어있던 모든 체계를 메모리 매니저가 알고 있기 때문에 신속히 회수가 가능하고 자원낭비가 없다. 망약 물리 메모리가 잘못되어서 OS가 공간회수를 못하게 되면 재부팅을 해야한다.

좋은 OS일수록 Application의 가상화정도가 높다. 대표적인 예로 모바일OS이다. 생각해보면 어플이 죽었다해서 우리가 모바일을 재부팅한적은 없을 것이다.

profile
모든 것을 즐길 줄 아는 개발자, 양성빈입니다.
post-custom-banner

0개의 댓글