2015-01-08 8 views
4

CPU가 프로그램을 실행할 때 메모리 파이프 라인을 통해 모든 데이터를 이동합니까? 그러면 어떤 데이터 조각이 ram-> cache-> 레지스터에서 옮겨 지므로 실행 된 모든 데이터가 어느 시점에서 CPU 레지스터에 저장됩니다. 또는 어떻게 든 더 빠른 메모리 유형에 포함 된 코드를 선택하거나 프로그래머가 유지할 특정 코드 (예 : 최적화를위한 캐시)를 선택할 수 있습니까?CPU가 어떤 데이터를 어떤 메모리 (램, 캐시, 레지스터)에 저장할지 결정하는 방법은 무엇입니까?

+1

사용하는 CPU, 프로그래밍 언어 및 기타 여러 요소에 따라 다릅니다. 프로세서 언어와 컴파일러에 대한 자세한 정보는 물론 구체적인 예를 제공해 주시겠습니까? –

+1

@MikeofSST 구체적인 예제가 없습니다. OS 클래스를 사용하고 있는데, 이것들이 내 머리 속으로 튀어 나온 질문들입니다. 나는 이것에 대한 다른 구현에 대해 정말로 생각하지 않았다. 만약 존재한다면 더 일반적인 대답을 찾고 있었다. –

+2

대상 프로세서에 여러 레지스터가 있다고 가정하면 Linux 나 Windows 변형 중 하나와 같이 비교적 큰 운영 체제를 호스팅하는 데 적합한 대부분의 CPU에서 볼 수 있듯이 데이터 캐시와 메모리 관리 장치가 필요합니다. 적절한 최적화 컴파일러와 관련 OS API 라이브러리가 모든 것을 처리 할 것입니다. 조립품이나 다른 저수준 언어를 사용하여 'Under the Hood'를 조금이라도 사용하면 데이터 저장 위치, 캐시 등에 명백하게 영향을 미칠 수 있습니다. –

답변

6

이 질문에 대한 답변은 전체 과정입니다. (보통) 일어나는 일에 대한 간단한 요약은 다음과 같습니다.

  1. 프로그래머는 RAM에 들어갈 내용을 지정하십시오. 글쎄, 컴파일러는 당신 대신에 그것을하지만, 당신이 변수를 선언하는 방법으로 이것을 제어합니다.
  2. 코드가 변수에 액세스 할 때마다 CPU의 MMU는 값이 캐시에 있는지 확인하고 그렇지 않은 경우 RAM의 변수가 들어있는 '라인'을 캐시로 가져옵니다. 일부 CPU 명령어 세트는 특정 저 빈도 연산에 대해 (스톨을 발생시키지 않도록) 허용하지만 매우 낮은 수준의 코드가 필요합니다. 값을 업데이트하면 MMU는 캐시 된 메모리를 RAM에 커밋하여 '캐시 플러시'작업을 수행합니다. 다시 말하지만, 저수준 코드로 언제, 어떻게 발생하는지에 영향을 미칠 수 있습니다. 또한 캐시가 연속 기입인지 여부와 같은 MMU 구성에 따라 달라집니다.
  3. ALU (산술 논리 장치)에서 사용할 필요가있는 값에 대해 어떤 종류의 작업을 수행하려는 경우, 또는 이와 유사한 경우 캐시에서 적절한 레지스터로로드됩니다. 어떤 레지스터는 컴파일러가 생성 한 명령어에 의존합니다.

일부 CPU는 실제로 CPU가 필요하지 않은 작업에 대한 바로 가기를 제공하는 DMA (동적 메모리 액세스)를 지원합니다. 여기에는 메모리 - 메모리 복사 및 메모리와 메모리 매핑 주변 장치 제어 블록 (예 : UART 및 기타 I/O 블록) 간의 데이터 전송이 포함됩니다. 이로 인해 데이터가 CPU 코어에 전혀 영향을 미치지 않고 RAM으로 이동, 읽거나 쓰게됩니다.

상위 수준에서 여러 프로세스를 지원하는 일부 운영 체제는 프로세스가 스왑 아웃 될 때 현재 프로세스에 할당 된 RAM을 하드 디스크에 저장하고 프로세스가 다시 실행될 때 디스크에서 다시로드합니다 . (이것이 C : 드라이브의 '페이지 파일'과 그 크기를 제한하는 옵션을 찾는 이유입니다.) 이렇게하면 실행중인 모든 프로세스가 실제로 모든 파일을 공유 할 수는 없지만 대부분의 사용 가능한 RAM을 활용할 수 있습니다 동시에. 페이징 자체의 코스의 가치가 아직 또 다른 주제입니다. (이것을 언급 한 사람은 Leeor입니다.)

+2

1. 사용하는 대상을 지정했지만 OS가이를 바꾸기로 결정할 수 있습니다 디스크에 저장되므로 전체 제어가 불가능합니다. 2. 캐싱은 일반적으로 전체 페이지가 아니라 라인 단위로 수행됩니다 (예외는 일부 있음). 3. 스크래치 패드 (scratchpads)라는 개념이 있습니다. 캐시와 유사한 저장소로서 대기 시간이 거의 비슷하지만 코드에 의해 완전히 제어됩니다. – Leeor

+2

@Leeor 좋은 지적. 1) 원래의 질문은 스왑 파일이나 프로세스 메모리 관리를 언급하지 않았기 때문에 O/P의 컨텍스트를 고려할 때 필연적으로해야 할 것은 없지만 그 측면에 대해서는 생각하지 않았습니다. 2) 네, 맞습니다. 필자의 경험은 커널 모드에서 ISR 중 캐시 미스의 악조건에 의해 왜곡되어 전체 캐시 플러시를 유발합니다. 3) 필자가 작업 한 (거의) 프로세서의 아키텍처에서 스크래치 패드를 발견하지 못했습니다. 새로운 답변을 추가하거나 광산을 편집하여 커뮤니티 위키 답변으로 표시하십시오. –

+1

글쎄, 네가 말했듯이 질문이 너무 광범위해서이 작은 수정으로 해결할거야. 그것은 실제로 좋은 대답입니다, +1 :) – Leeor