메모리 정렬제한에 대해서...

gurumong의 이미지

메모리 정렬제한에 대해서...

어셈블리어를 공부하다가 메모리 정렬제한이라는 것을 알게되었습니다
이 정렬제한이라는것을 어기게되면
CPU가 임의번지에 바로 접근하지 않고 먼저 4의 배수 번지에 접근을 하기 때문에
데이터를 두번에 걸쳐서 읽게되고 그때문에 성능이 많이 나빠진다고 하는데
왜 이렇게 4의 배수로만 접근을 해서 필요한 데이터를 잘라내기를 하는지 궁금합니다

한참이나 웹서칭을 해서 알게된것은 그렇게 하는것이 회로를 구현하기가 더 간단하다고 하는데
접근하고자 하는 임의주소에서 그보다 빠른 4의 배수 번지를 계산하고
읽어들인 4바이트중 몇번째 부터가 데이터의 시작인지 계산하는것이 더 부하가 크지 않나요?
제가 알지 못해서 이런 생각을 하는것이겠지만...ㅜ.ㅜ 도무지 알수가 없습니다

aerockh2의 이미지

삭제

cinsk의 이미지

가상의 machine, ASDF가 있다고 가정해 봅시다. 이 machine은 32-bit addressing을 하고, word (32-bit) 단위로 load/store를 제공합니다. machine instruction은 ir이란 레지스터에 저장되고, load 명령은 메모리의 한 word를 읽어서 레지스터 r0 또는 r1에 그 내용을 넣어 줍니다. 또한 모든 명령은 32-bit로 표현합니다.

load 명령은 32-bit로 이루어져 있으며, 다음과 같은 형태를 지닙니다:

IR: 1RXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX

이 때, bit 0은 1(load를 나타냄)이며, bit 1이 0일 경우 r0을, 1일 경우 r1을 뜻합니다. 그리고 나머지 30개의 비트는 메모리의 주소를 나타냅니다.

메모리는 32-bit이므로, byte단위로 addressing할려면 32bit가 필요합니다. 하지만, 위 load 명령에서는 한 명령의 길이가 32 bit이고, bit 0은 opcode를 나타내고 bit 1은 target register를 나타내므로, 실제 주소를 표현할 수 있는 bit의 수는 30 bit입니다.

따라서 32-bit의 주소를 가진 메모리 (최대 4GB)를 모두 addressing 하기 위해서 이 30bit 주소에 4를 곱해서 나타냅니다. 결국, 실제 메모리 주소는 load 명령의 XXXX로 표기한 값에 4를 곱해야 나옵니다. 그렇다면 load 명령으로 접근할 수 있는 실제 메모리 주소는 항상 4의 배수가 된다는 결론이 나옵니다.

실제 IR의 상위 30bit (bit 2에서 bit 31까지)의 배선은 RAM의 address pin (bit 2에서 bit 31까지)에 일대일로 연결되어 있으며 RAM의 address pin, bit 0과 bit 1은 항상 0으로 연결되어 있습니다.

이런 설계를 가진 ASDF는 무조건 4의 배수로 된 주소에서 한 word (32-bit)만 레지스터로 읽어 올 수 있습니다.

그렇다면 다음과 같은 상황에 대해 처리하는 것도 생각해 봐야 합니다:

4 byte로 align되지 않는 주소에서 한 word를 읽는 경우.

아쉽게도 제가 상상한 ADSF 머신은 이런 기능이 없습니다. 하지만 대부분 현존하는 processor는 이런 경우도 해결책을 제공합니다. (processor에 따라 약간씩 다름)

이 경우, 대부분 RISC processor는 bus error(SIGBUS)를 발생시킵니다. 즉, 4 바이트 배수가 아닌 주소에서 word 단위로 읽어올 수 없습니다. 어떤 processor에서는 이 경우에도 제대로 읽어 올 수 있도록 설계됩니다. 이 경우, 여러가지 옵션이 있는데, 첫째, load instruction이 모든 address를 다 지정할 수 있도록 32-bit address를 포함하도록 합니다. (이 경우 load instruction의 길이는 더 이상 32-bit가 아닙니다. opcode 부분을 포함해야 되기 때문) 이 경우 instruction의 길이가 가변적이 되거나, 아니면 64-bit 고정이 되겠지요. 또 다른 방식으론, load 명령을 두 번 발생시켜서, 두 개의 word를 읽게 한 다음, 절반씩 꺼내어 합치는 것입니다. 이 경우 4의 배수로 된 주소에서 꺼내는 것보다 훨씬 느리게 되지만, SIGBUS를 걱정할 필요가 없습니다. 어떤 RISC 머신은 설정에 따라 bus error를 낼 수도 있고, 바로 앞에서 설명한 것처럼, 두번의 load를 통해 읽어오게 할 수도 있습니다.

제가 설명한 내용이 모든 processor에 그대로 적용되는 것은 아니지만, 왜 특정 processor가 word 단위로 값을 읽을 때, alignment rule에 따라야 하는지, 설명은 될 것이라고 생각합니다.

이 분야의 다른 내용이나 좀 더 자세한 내용은 computer architecture에 관한 책을 읽으면 알 수 있습니다.

Computer Organization and Design: The Hardware/Software Interface
   John L. Hennessy, David A. Patterson
   Morgan Kaufmann
 
Computer Architecture: A Quantitative Approach
   John L. Hennessy, David A. Patterson
   Morgan Kaufmann

--
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://www.cinsk.org/cfaqs/

gurumong의 이미지

질문은 몇줄 되지 않는데
이렇게 긴 답변을 써주셔서 미안하기까지 하네요 T.T

몇일간 웹서칭을해서도 알지못했는데
정말로 감사드립니다 (__)

댓글 달기

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