크래프톤정글5주차 - 가상메모리/페이징/메모리 단편화/demand-zero memory

김태성·2024년 2월 12일
0
post-thumbnail

자세한 내용은 csapp 9장에 나와있으며 여기는 간단하게 정리만 합니다.

가상 메모리

가상 메모리는 컴퓨터에서 사용 가능한 메모리를 추상화하여 사용자들에게 하나의 큰 메모리 처럼 보이게 만드는 기술이다. 실행되는 프로그램들은 실제 메모리 주소가 아닌, 가상 메모리의 주소를 받게 된다.

가상 메모리를 사용하는것은 많은 장점을 가지고 있는데, 그 대표적인 것은 다음과 같다.

  • 보안 및 안정성 증가

  • 개발의 용이성

  • 메모리 관리의 간편화

이것에 대한 더 자세한 설명은 csapp 9장에 설명되어 있다.
가상메모리에서 같이 설명되는 것들은 다음과 같다.

  • MMU

  • 페이지

페이징

페이징은 2차 기억장치의 메모리를 사용하기 위해서 데이터를 저장/검색하는 메모리 관리 기법이다.기억장치를 모두 같은 크기의 블록으로 편성하여 운용을 하는데, 크기가 일정한 블록들을 페이지(page)라고 한다. 주소 공간을 페이지 단위로 나누며, 실제 기억공간은 페이지 크기와 같은 프레임으로 나누어 사용한다.

  • 프레임(Frame) : 물리 메모리를 일정한 크기로 나눈 블록이다.

  • 페이지(Page) : 가상 메모리를 일정한 크기로 나눈 블록이다.

메모리 단편화

메모리가 작게 나눠져서 사용 가능한 메모리가 있지만 사용할 수 없는 상태를 의미한다.
크게 2가지로 분류되는데, 내부단편화와 외부 단편화가 있다.

  • 내부 단편화 : 프로세스가 필요한 양보다 크게 할당되었을때 발생한다.

  • 외부 단편화 : 메모리 할당과 반환 과정이 계속되면 중간 중간에 사용하지 않은 메모리들이 발생하게 되는데, 이것들이 쌓이면 단편화가 되어 사용할 수 없다.

메모리 단편화는 어렸을때 윈도우 xp쓰면서 디스크 조각모음을 해야 했던 원인이다.

demand-zero memory

직역하면 요구사항이 없는 메모리라는 뜻이다.
번역책에는 무요구 형식이라고 나와서 뭔소리인가 싶어 원문을 찾아봤다.

a.out 를 로드하는 중이다.

... . Map private areas. Create new area structs for the text, data, bss, and stack areas of the new program. All of these new areas are private copy-on-write. The text and data areas are mapped to the text and data sections of the a.out file. The bss area is demand-zero, mapped to an anonymous file whose size is contained in a.out. The stack and heap area are also demand-zero, initially of zero-length. Figure 9.31 summarizes the different mappings of the private areas...

위의 내용은 대충 말하면 일단 text,data,bss,stack은 프로그램에 필요한 부분이니까 매핑을 해 놓는다. 하지만 .bss , stack , heap 영역은 demand zero영역이니까 그냥 놔둔다는 뜻이고, 이후의 글을 찾아보면

. Map shared areas. If the a.out program was linked with shared objects, such as the standard C library libc.so, then these objects are dynamically linked into the program, and then mapped into the shared region of the user’s virtual address space.

또 대충 번역해보면 a.out가 공유 라이브러리 lib.so와 연결된 경우, 이 개채들을 프로그램에 동적으로 연결 후 매핑한다는 소리다.

그리고 또 하나의 자료를 찾아봤다.
카네기 멜런 대학의 교육 자료인것 같다.

보아하니 anonymus file이라고 하는데,
이 anonymus file은 커널로부터 프로세스에게 할당받은 메모리이다.
즉 힙을 거치지 않고 할당을 받았다는 소리다.
파일에 기반을 두지 않기 때문에, 내용이 비어있다.
그래서 0으로 초기화된 파일들이다...

라고 검색하니까 나왔다.

그러니까 정리를 하자면

  • 메모리 매핑을 할때 2가지 파일이 백업 된다

  • 그 중 anonymous file은 힙을 거치지 않고 커널에서 직접 배당 받는다.

  • 이때 내용이 비어있기 때문에 0으로 초기화된 빈 껍데기일 뿐이다.

  • demand - zero - memory 는 따라서 일단 커널한테 배정은 받는 기본적인 파일들이지만 요구되는 데이터가 없어서 0으로 초기화된 메모리 라고 보면 되겠다.

++추가)이해가 거의 된거같아서 내용을 추가한다.

  • 커널은 처음 메모리를 배정받을때 페이지를 배당 받는다. 이때 안의 내용은 상관없이, 접근하면 'trap'오류를 띄우도록 한다.

  • 이후 참조를 할려고 할 때, 'trap' 에러가 발생하고, 커널에서 에러를 처리한다.
    이때 페이지의 내용이 0으로 초기화 되고, 데이터를 초기화한다. 이 작업은 커널에서 이루어진다.

  • 에러가 수정되었음으로 다시 프로세스에서 참조를 시작한다.

그러니까 커널에서 배정받는것도 맞고
초기화를 할 때 0으로 초기화 되는것도 맞다.

하지만 배정받을때 0으로 가득 찬 데이터를 받는다!라고 이해한 건 틀린말이다.

profile
닭이 되고싶은 병아리

0개의 댓글

관련 채용 정보