명령어 메모리, 데이터 메모리

skycloud의 이미지

명령어가 어떻게 처리되는지 공부하고 있습니다.
PC가 가르키는 주소를 명령어 메모리에서 가져오고
후에 데이터 메모리에도 접근하는데 이유가 한 클럭에 같은 곳을 2번 접근하면 안되니깐 그런 것으로 알고있습니다.

그런데 그러면 이 메모리라는게 RAM 아닌가요?
RAM에 명령어있는 곳과 데이터 있는 곳을 이용하게 된다는 뜻인가요?
한 클럭에 ram에 2번 접근하는 것은 상관 없나요?

jick의 이미지

일단 요즘 CPU는 RAM에 비해서 속도가 워낙 (수백배?) 빠르기 때문에, CPU의 기다리는 시간을 최대한 줄이기 위해 연산장치와 메모리 사이에 캐시를 삼단계는 끼워 넣습니다. 그러니까 교과서에 나오는 그림은 "1980년대의 CPU는 이런 식으로 동작했습니다" 정도로 이해하시면 되고 너무 디테일에 연연하지 않는 게 좋습니다.

그나저나 그건 그렇다 치고, CPU가 명령을 메모리에서 읽어오고 *그 다음에* 데이터를 가져와야 하는 이유는 간단합니다. 일단 명령을 먼저 읽어서 해석을 해야 데이터를 어디에서 읽을지 알 것 아닙니까.

skycloud의 이미지

명령어를 읽고 데이터를 가져오는 과정이 한 클럭 사이에 일어나지 않나요?
한 클럭 안에서 메모리에 두 번 접근한다고 생각이 들어서요

라스코니의 이미지

case-by-case이고 architecture dependent 입니다.
명령을 읽고(fetch) 그 명령이 요구하는 데이터가 cache에 있는지 확인하고 없으면 메모리를 읽어서 캐쉬에 로드한 후 다시 가져오고, 경우에 따라 한 클럭에 따라 가능할 수도 있긴 있는데 cache에 없는 경우 수백 사이클은 금방 지나가겠죠. 그때 다른 가용한 명령을 처리하고 그런 식으로 되어 있습니다.
완전히 고정되어 동작하게 되어 있지 않습니다. 특히 cache가 들어오면서 정확히 몇 사이클 내에 뭐가 된다는 개념은 성립되지 않습니다. 그런게 정말 필요하다면 cache를 비활성화해야 비슷해 질 것 같네요.

Stephen Kyoungwon Kim@Google의 이미지

질문을 이해해 보건데 한 사이클 내에 명령어와 그 명령어가 사용하는 메모리 데이터를 가져올 수 있느냐는 것 같습니다. 아키텍쳐와 관계없이 거의 불가능하다고 판단됩니다.

당연히 cache miss가 L1에서 나는 모든 경우는 훨씬 많은 사이클이 지나갑니다. 제가 이해하기엔 그렇다고 context switching을 cache miss 때문에 하진 않을 테니 수백 사이클까진 아니고 수십 사이클 단위일 것 같습니다.

보통 address에서 implicit하게나 explicit하게 register를 참조하는 경우는 일단 register를 읽어야 합니다. 예컨대, 직접적으로 register를 base address로 사용하는 명령 뿐 아니라 PC relative로 immediate field를 쓰는 경우라도 레지스터를 읽는데, clock-synchronized되어 있으니 같은 사이클 내에는 나올 수 없습니다.

가능한 경우는 instruction이 clock이 떠서 파이파 라인을 넘어오는 그 순간에 address 전체가 instruction register의 아웃풋으로 나오고, 캐쉬가 combinational logic이라서 그 사이클 내에 아웃풋에 데이터가 잡히는 경우일 텐데, 일단 캐쉬가 combinational logic인 경우는 보통의 프로세서에서는 없을 것 같습니다. 그래서 address input까지는 백번 양보해서 instruction이 valid한 그 사이클 내에 전달된다 쳐도--이것도 안 되리라 생각합니다만--거기서 데이터는 같은 사이클 내에 나오기 어렵습니다.

Stephen Kyoungwon Kim@Google의 이미지

그 명령어가 사용하는 데이터는 그 명령어를 읽는 사이클에 메모리에서 가져올 수 없습니다. 캐쉬의 유무와도 관계 없습니다. 하드웨어 설계상 이게 되려면 극단적인 가정이 필요한데, 그렇게 만들어지는 프로세서는 현실에서 거의 없을 겁니다. (아주 없을 수도 있습니다.)

댓글 달기

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