linux 2.6 (32bit) 에서 /lib/libc-2.5.so 나 /lib/libpthread-2.5.so 같은 것들은
여러프로세스가 공유하는 것인데, 실제로 물리적 RAM 상에서는 하나만 존재하는게 맞나요?
프로세스마다 가상주소로는 여러개인데 물리적 메모리에서는 저런 공유메모리가 시스템 메모리상에서
하나만 존재하는 것인가요?
자꾸 햇갈려서 질문 드립니다.
조언 주시면 감사하겠습니다.
기본적으로 최신 윈도우즈나 리눅스 커널 모두 Copy On Write 방식을 사용합니다.
라이브러리 영역도 분명히 코드 섹션에 강제로 쓰기 권한을 주면 쓰기가 가능한 영역이기 때문에 한 프로세스에서 이 영역을 수정한다고 해서 다른 프로세스에 있는 라이브러리 영역까지 수정되버리면 안될 것입니다.
따라서 리눅스 라이브러리, 윈도우즈의 dll 등의 동적 바이너리들은 모두 최초에 한 번 올려진 메모리(물리 메모리)가 있다면 추후 새 프로세스 생성 시에 로딩되어야 할 때는 단순히 이미 올려진 영역을 그대로 매핑만 해주는 식으로 구현이 되어 있습니다.
말하자면 아래와 같습니다.
A 프로세스 가상주소 0x40000000 -> 물리메모리 0x90000000 B 프로세스 가상주소 0x50000000 -> 물리메모리 0x90000000 (재배치가 되었다고 가정)
이렇게 같은 메모리를 가리키게 되어 있습니다
이 때 만약 한 프로세스가 이 영역을 수정한다면, 수정하는 즉시 복사가 일어나게 됩니다. 이는 리눅스에서 fork 를 구현할 때도 마찬가지로 적용되는 사항입니다.
보통은 수정하는 일이 없다시피 하기 때문에 이런 라이브러리들은 한 번 로딩되면 복사가 거의 일어나지 않습니다.
.
저도 그 부분이 항상 궁금했었는데 의문점이 풀렸습니다. 감사합니다.
텍스트 포맷에 대한 자세한 정보
<code>
<blockcode>
<apache>
<applescript>
<autoconf>
<awk>
<bash>
<c>
<cpp>
<css>
<diff>
<drupal5>
<drupal6>
<gdb>
<html>
<html5>
<java>
<javascript>
<ldif>
<lua>
<make>
<mysql>
<perl>
<perl6>
<php>
<pgsql>
<proftpd>
<python>
<reg>
<spec>
<ruby>
<foo>
[foo]
?
기본적으로 최신 윈도우즈나 리눅스 커널 모두 Copy On Write 방식을 사용합니다.
라이브러리 영역도 분명히 코드 섹션에 강제로 쓰기 권한을 주면 쓰기가 가능한 영역이기 때문에
한 프로세스에서 이 영역을 수정한다고 해서 다른 프로세스에 있는 라이브러리 영역까지 수정되버리면 안될 것입니다.
따라서 리눅스 라이브러리, 윈도우즈의 dll 등의 동적 바이너리들은 모두 최초에 한 번
올려진 메모리(물리 메모리)가 있다면 추후 새 프로세스 생성 시에 로딩되어야 할 때는 단순히
이미 올려진 영역을 그대로 매핑만 해주는 식으로 구현이 되어 있습니다.
말하자면 아래와 같습니다.
A 프로세스 가상주소 0x40000000 -> 물리메모리 0x90000000
B 프로세스 가상주소 0x50000000 -> 물리메모리 0x90000000 (재배치가 되었다고 가정)
이렇게 같은 메모리를 가리키게 되어 있습니다
이 때 만약 한 프로세스가 이 영역을 수정한다면, 수정하는 즉시 복사가 일어나게 됩니다.
이는 리눅스에서 fork 를 구현할 때도 마찬가지로 적용되는 사항입니다.
보통은 수정하는 일이 없다시피 하기 때문에 이런 라이브러리들은 한 번 로딩되면 복사가 거의 일어나지 않습니다.
감사합니다. ^^
.
저도 그 부분이 항상 궁금했었는데 의문점이
저도 그 부분이 항상 궁금했었는데 의문점이 풀렸습니다. 감사합니다.
댓글 달기