메모리와 관련하여 질문있습니다.

hdcjg1991의 이미지

안녕하세요. 현재 임베디드 1년차 개발자로 일하고 있고 메모리 기법 관련하여 공부를 하는 중 궁금한 점들이 생겨 고민고민 해봐도 답을 찾지 못해 이렇게 질문드립니다.

1. 보통의 강의나 기술블로그를 보면 하나의 프로세스가 실행되었을 때 메모리 영역을 어떠한 방식으로 할당하는지에 대해서만 나와있고 여러 프로세스가 동시에 동작 중일 경우엔 어떻게 할당하는지는 나와있지 않습니다...

만약 백그라운드로 3개의 프로세스가 동작 중일 때,

1) 메모리 유저영역은 한 번에 하나의 프로세스가 독점하며 Context switching할 때 프로세스들이 번갈아 독점하는 식

2) 3개의 프로세스가 메모리 유저영역에서 각자의 영역들을 커널로부터 할당받는 식

이 중에 어느 방법으로 커널이 메모리를 할당하나요? 아니면 이외 방법으로 할당을 하는 것인가요?

2. Flash memory나 hard disk 같은 저장매체에 있는 문서를 수정할 때 눈에 보이는 건 실제로 Ram에 있는 Data이고 저장을 해야만 저장매체로 Data가 옮겨지는 것으로 알고 있습니다.

그러면 문서를 수정하고 있을 때의 Data는 메모리의 커널 영역에 위치하는 것인가요?

3. 만약 메모리 크기보다 큰 실행파일을 실행했을 때(32bit 커널, 4GB메모리, 파일용량8GB),

커널은 이 실행파일을 메모리에 어떠한 방법으로 적재하고 관리를 하는 것인가요?

익명 사용자의 이미지

임베디드 개발이라면 조금 어렵군요.

일반론을 다루고 싶으시다면 운영체제론의 Virtual Memory 파트를 공부하시면 되겠습니다만

대체로 공통점이 많은 데스크탑 x86 OS들과는 달리 임베디드라면 장비마다, OS마다 다른 점이 있을 수도 있습니다.

그런 건 따로 공부하셔야 할 겁니다.

jachin의 이미지

1. 1)의 경우는 메모리 보호기능과 프로세스에 대한 권한이 없는 OS가 사용하는 방식입니다. DOS나 Amiga, 일부 소형 펌웨어에서 사용하는 방법입니다.
2)의 경우는 현재 (임베디드 시스템을 포함한) 대다수의 OS가 Virtual Memory Map 을 제공하며 프로세스별 자원관리 및 메모리 보호 정책을 가지고 있는 경우입니다.
아마 프로세스 컨텍스트 스위칭을 이야기하셨으니, 2번이 답이 될 것입니다.

2. ㄱ. 원시적인 ARM SoC 는 주소공간을 분할하여, Program Counter 0 번지부터는 플래시 메모리 영역을 연결하고, 플래시 메모리에 적재된 부트로더 영역이 실행되면서, 시스템 이미지를 분할된 주소공간으로 적재한 다음, 해당 주소로 점프하여 시스템을 실행하도록 합니다.
ㄴ. 커널이 부팅되면서, 플래시 메모리 영역을 루트파일시스템 영역으로 읽기 전용 옵션으로 마운트 시킨 후, 데이터가 쓰이는 /home, /etc 등을 메모리 파일 시스템인 tmpfs 로 마운트 하는 경우가 많습니다.
ㄷ. 따라서 문서를 수정하고 있을 때의 Data 는 tmpfs 파일시스템 영역안에 있으므로, 커널 영역은 아닙니다.

3. Linux 의 경우, ELF(Executable and Linkable Format) 형식으로 실행파일이 구성되어 있는데, 프로그램에 할당할 메모리의 정보 등을 적재해둡니다. 프로그램을 정적으로 링크해서 4 GB 이상의 파일로 만들어도, 실제론 하드디스크에서 프로그램의 일부 영역을 불러들여 메모리 상에 적재하고, 다른 영역은 메모리 스와핑을 통해 다시 읽어오고 실행합니다. 옛 추억을 들어 이야기하자면, 예전 어떤 게임들은 프로그램 리소스까지 포함하여 1.6 GB 이상의 실행파일을 가지고 있었지만, 4 GB 를 가진 시스템에서 300~600 MB 정도의 메모리 할당량을 가지고 실행했던 것을 기억합니다. (이거 아는 사람들은...철컹철컹?) 이러한 시스템이 가능한 것은 Virtual Memory 형태로 프로세스의 메모리 영역을 관리하기 때문입니다.

실제 45MB 정도 되는 실행 파일을 가진 프로그램을 실행하셨을 때, 작업관리자의 메모리 사이즈가 그것보다 작은 것을 관찰하실 수 있으실 겁니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.