요구 페이징에 대한 질문입니다

이명수의 이미지

디스크에서 실행파일을 메모리에 적재할 때 처음부터 모든 페이지를 적재하는 것이 아니라
수행에 필요한 일부 페이지만 일단 적재하고 다른 페이지들은 실제로 참조될 때 적재하는 것을 디맨드 페이징이라고 한다고 합니다

이때, '수행에 필요한 일부 페이지'의 기준이 무엇인가요?

실행파일을 실행시키는 타이밍에서 CPU가 판단하는 것인가요?
아니면 컴파일될 때 미리 ELF 헤더 등에 컴파일러가 작성해놓는건가요?

그리고 수행에 필요한 페이지와 수행에 필요하지 않은 페이지의 기준이 무엇인가요?

Hyun의 이미지

실행 프로그램의 크기가 10바이트이며, 페이지의 크기가 1바이트라고 가정합니다. 그리고 프로그램은 0번지부터 수행한다고 하면 프로그램 수행에 필요한 페이지는 0번 주소를 담는 페이지겠죠... 나머지 페이지는 일단 필요가 없게 되구요. 그리고, 이 프로그램이 3번지 주소로 점프하게되면(함수호출 등) 3번지 주소를 담는 페이지가 또 필요하게 되구요. 이때 해당 페이지를 읽어들입니다.
이렇게 프로그램 수행 중 프로세스가 원하는 가상메모리에 물리메모리가 연결되어있지 않으면 MMU 하드웨어가 page fault 예외를 발생시킵니다. 이것을 CPU가 처리해 해당 가상주소에 물리 메모리를 읽어와 연결시켜 줍니다.(만약 page fault가 난 메모리 주소가 해당 프로세스가 사용할 수 없는 영역이면 잘못된 프로그램 수행으로 판단하고 프로그램을 죽여버립니다.)
자세한건 MMU의 동작에 대해 책을 다시한번 읽어보세요.


나도 세벌식을 씁니다
이명수의 이미지

답변 감사합니다

아 그러니까 당장 실행에 필요한 페이지 부분과 실행에 필요하지 않은 페이지 부분이 처음부터 따로 정해져 있는 것이 아니라

단순히 실행 순서대로 페이지 단위로 적재시키는 것이군요?

Hyun의 이미지

위의 예는 code 영역으로 설명했고 data 등 다른 영역또한 같습니다. 예를들어 malloc 등으로 메모리를 할당하더라도 해당할 메모리가 (그 메모리를 직접 접근하기 전에는) 실제 존재한다고 말하기 힘듭니다.
또한, 스택을 예로들면 프로세스의 스택이 8메가바이트 잡혀 있다고 하더라도 프로그램 초기 실행시 8메가바이트의 스택 메모리를 할당해 놓지 않고 스택이 자라는대로 실제 물리 메모리를 붙여줍니다.


나도 세벌식을 씁니다
이명수의 이미지

다시 여쭤봐서 죄송한데요

힙과 스택은 말씀하신대로 알고 있었고
저는 code 영역이 궁금한데

제가 앞에서 질문드린대로
그러니까 code 영역이 적재될 때

"당장 실행에 필요한 페이지 부분과 실행에 필요하지 않은 페이지 부분이 처음부터 따로 정해져 있는 것이 아니라

단순히 실행 순서대로 페이지 단위로 적재시키는 것이군요?"

맞는지 확인 답변 부탁드립니다
.

이미 답변을 주셨지만
제가 지식이 짧고 이해력이 좋지 않아서
다시 한번 확인드립니다
죄송합니다

Hyun의 이미지

네 그렇습니다. 메모리가 부족하면 해당영역을 회수해 다른 프로세스나 다른 부분에서 재사용 한다고 알고있습니다. 그리고 프로그램 실행이나 함수 호출 등으로 물리메모리에 올려지지 않은 메모리를 접근하면 다시 해당 페이지를 읽어들입니다.


나도 세벌식을 씁니다
이명수의 이미지

친절하고 자세한 설명 감사드립니다
좋은 하루 되세요

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.