정보공간_1

[linux] 프로세스 공간 관리 본문

IT 놀이터/IT Storehouse

[linux] 프로세스 공간 관리

알 수 없는 사용자 2011. 6. 29. 13:48


일단 너무 늦게 글을 올려서 너무 죄송합니다 ㅠㅠ

마지막 메모리에 관련한 내용을 하도록 하겠습니다.


이번시간에는 프로세스가 공간을 어떻게 관리하는지 에 대한 얘기를 해보도록 하겠습니다

프로세스는 각각 독립된 가상 주소 공간 위에서 움직이고 있습니다. 여기서 커널의 역할 중 가상 페이지와 물리 페이지 관리 방법에 대해 제일 매일 거론하겠습니다.

OS 커널 설계에서 가장 중요한 포인트 중의 하나는 프로세스 공간에 물리페이지를 할당할 때의 사고방식이라고 할 수 있습니다.

프로세스 공간에 물리 페이지를 할당할 때의 사고 방식이라 하겠습니다.

프로세스 공간을 관리하기 위한 제어구조나 처리도 그런 사고 방식을 반영한 것입니다.

 

1. 기본 테크닉 ...

현재까지, 물리 페이지의 할당과 관련하여 여러가지 테크닉이 개발되어 왔습니다.
메모리관리 코드를 읽기 위해서는 리눅스 커널이 사용하고 있는 테크닉을 알아둘 필요가 있는데요.
그래서 구현 방법을 설명하기에 앞서 몇가지 테크닉을 알아보고자 합니다.

- Swap
가상페이지에 항상 물리테이지가 대응되고 있는것은 아닙니다. 디스크 등 2차 기억 장치에 저장되어 있는 경우도 있습니다.
어떤 시점에서 프로세스가 접근하는 주소의 범위는 한정되어 있습니다.
그리하여 최근 접근된 가상 페이지만을 물리 메모리에 놔두고 그외에는 2차 기억장치에 보존합니다.
이렇게 함으로써 실제 탑재되어 있는 물리 메모리보다 큰 메모리를 사용하고 있는 것처럼 가장 할 수 있습니다.
이 테크닉을 swap이라고 합니다.

대응할 물리체이지가 없는 가상페이지를 접근 하면 하드웨어는 예외를 알려주고 커널에 통지합니다.
커널은 그 예외처리에 따라 물리페이지를 할당하고, 스왑 디바이스로 부터 데이터를 읽어 들인 후 프로세스에 제어를 반환합니다.
프로세스는 아무일 도 없었던 것 처럼 처리를 계속합니다.


- Demand Paging
요구 페이징이란, 메모리가 필요한 시점에서 물리페이지를 할당하는 방식입니다.

- Copy On Write
원래 fork 처리를 위해 만들어진 기술입니다.
프로세스를 fork하게 되면 자식 프로세스의 프로세스 공간은 부모 프로세스의 프로세스 공간을 복사하게 됩니다
초기에는 자식프로세스에 물리 페이지를 할당, 복하하고 있었습니다. 그러나 자식 프로세스 측에서 항상 페이지를 접근 하고 있는 것이 아니기 때문에 낭비되는 측면이 있었습니다.
그래서 현재는 FORK 시스템콜을 발행할 때 페이지 테이블을 복사만 해두고 실제로 메모리는 확보하지 않은 채로 필요할 때마다 메모리를 복사하도록 되어 있습니다.
이때 부모와 자식 모두 쓰기 접근을 금지하도록 페이지 테이블의 설정을 바꿉니다. 부모와 자식 어느 것이 든지 쓰기 접근을 수행하면 페이지 폴트 예외가 발생합니다.

이와 같이 읽기 접근 만 둘다 가능하게 해놓고 둘 중 어느 한 쪽이라도 쓰기가 발생하면 처음으로 복사하는 테크닉을 copy on write라고 합니다.

- 파일 맵

mmap 시스템 콜을 사용하면 파일의 일부를 프로세스 공간에 매핑하여 메모리의 일부처럼 접근 할 수 있습니다. 이 기능을 파일 맵이라고 합니다. 프로세스 공간을 구현한다고
하는 것은 파일 맵을 빼고서는 말할 수가 없습니다.

일반적으로 파일의 접근 시에는 read/write 시스템 콜을 사용합니다. 이때 커널은 파일의 데이터를 커널 내의 버퍼에 복사하고 그런다음에 프로세스 공간에 복사합니다.
버퍼를 페이지 단위로 하고, 그 페이지를 프로세스 공간에 매핑하는것이 파일 맵의 원래 아이디어 입니다.
파일에 대해서 read/write 경유의 접근과 파일 맵에 의한 메모리 접근이 동시에 발생해도 모순되지 않게 취급할 수 있다. 리눅스는 과거에도 파일 맵 기능이 지원되고 있었다.
그러나 가상 기억 관리 시스템이 제대로 통합된것은 2.6 버젼 보터 입니다.


2. 제어 구조 ...

그럼 지금부터 프로세스를 관리하기 위해 기본이 되는 구조체에 대해 알아 보고자 합니다.

- mm_struct
mm_struct는 프로세스 공간을 관리하는 기본이 되는 제어표 입니다. 이 구조체 안에는 프로세스의 페이지 디렉토리의 포인터를 시작으로 프로세스 공간을 관리하기 위한
정보를 모두 참조할 수 있게 되었습니다.
mm_struct 구조체는 1개의 프로세스 공간을 나타냅니다. 프로세스 별로 필요하기 때문에 task_struct 구조체로 부터 포인트 되어 있습니다.
여러 프로세스가 공간을 공유하고 있는 경우에는 여러게의 task_struct 구조체로 부터 1개의 mm_struct 구조체를 가리키게 됩니다.
커널 스레드 프로세스 공간을 갖지 않기 때문에 mm_struct가 필요가 없지요

- vm_area_struct
프로세스 공간은 전부 사용되고 있는 것은 아닙니다. 예를 들어 텍스트 영역, 데이터 영역, 힙영역, 스택 영역 등과 같이 몇가지의 논리적인 공간으로 나눠서 사용 됩니다.
vm_area_struct 구조체는 앞에서 서술한 테크닉을 사용하는데 있어 매우 중요한 데이터 입니다. 우선 페이지 폴트시 주소의 정당성이나 접근 권한의 정당성을 판단하게 됩니다.
또한 물리 페이지를 어떻게 할당할지에 대해 vm_area_struct 구조제츼 멤버를 참조해서 결정합니다.

 

이상 메모리에 관한 내용을 마치며 다음시간 부터는 프로세스 에 대해 알아보고자 합니다


그럼 행복한 방학 보내세요