문제

틀림없이 나는 그것을 얻을하지 않습니다.말이 있는 메모리와 함께 메모리 워드 길이의 1 바이트입니다.왜 당신은에 액세스는 4 바이트 길이의 변수 하나의 메모리스에 정렬되지 않은 주소를(i.e나눌하지 않 4),그것의 경우 주소를 정렬?

도움이 되었습니까?

해결책

그것은 제한 많은 기본 프로세서를 지원합니다.그것은 일반적으로 주위에 근무를 수행하여 4 비효율적인 하나의 바이트로 가져 오히려 하나 이상의 효율적인 단어 가지만,많은 언어는 지 결정하는 것이 더 쉽 그냥 무법자들을 강제로 모든 것이 정렬되어 있습니다.

더 많은 정보에 이 링크 는 영업 이익이 발견되었습니다.

다른 팁

하위 시스템 메모리에 현대적인 프로세서는 제한 액세스하는 메모리에서 수준 및 맞춤 그 단어의 크기;이 경우 여기에는 몇 가지 이유가 있습니다.

속도

현대적인 프로세서는 여러 수준의 캐시 메모리에 데이터를 뽑아;지원하는 하나의 바이트를 읽을 메모리에 하위 시스템 처리량을 단단히 묶은 실행 단위로 처리량(일명 cpu-bound);이것은 모든 연상시키는 방법 PIO 모드에 의해 능가 DMA 의 많은 같은 이유에서는 하드 드라이브입니다.

CPU 를 읽고 그 말에 크기(4 개의 바이트에서 32 비트 프로세서),그래서 당신이 할 때는 정렬되지 않은 주스에서 지원하는 프로세서 그것으로 프로세서를 읽어가는 여러 단어입니다.프로 읽는 각 단어의 메모리는 귀하의 요청한 주소에 걸쳐.이로 인해 증폭의 최대 2 배의 번호를 메모리에 트랜잭션에 액세스하는 데 필요한 요청한 데이터이다.

이 때문에,그것은 매우 쉽게 느리를 읽을 두 바이트다.예를 들어,당신이 말하는 구조체에서 메모리는 다음과 같습니다.

struct mystruct {
    char c;  // one byte
    int i;   // four bytes
    short s; // two bytes
}

32 비트 프로세서 그것은 가장 가능성이 될 것 정렬과 같은 다음과 같이 여기:

Struct Layout

프로세서 읽을 수 있는 이러한 각각의 구성원에 하나의 트랜잭션으로 간주합니다.

말 당신이 가득 버전의 구조체,어쩌면 네트워크에서는 그 포장에 대한 전송 효율;그것은 아래와 같이 설정합니다:

Packed Struct

독서 첫 번째 바이트는 것 같습니다.

요청할 때 프로세서를 제공할 16 비트에서 0x0005 그것을 읽어야 할 것이 단어에서부터 0x0004shift 왼쪽에는 1 바이트 장소에서 16-bit register;몇 가지 추가 작업,그러나 대부분을 처리할 수 있는 하나의 주기입니다.

요청하면 32 비트에서 0x0001 당신을 얻을 것이다 2 배 확대.프로세서에서 읽 0x0000 으로 결과를 등록하고 변화 왼쪽에는 1 바이트를 읽을 다음,다시서 0x0004 으로 임시 등록,오른쪽으로 전환하는 3 바이트를,다음 OR 그 결과에 등록한다.

범위

에 대한 어떤 주소 공간의 경우,건물 추측할 수 있는 2LSBs 는 항상 0(e.g.,32-bit 컴)다음에 액세스할 수 있습니다 4 배 더 많은 메모리(는 2 비트 저장할 수 있습을 나타내는 4 개의 명백한다),또는 동일 금액의 메모리로는 2 비트에 대한 무언가가 다음과 같 플래그입니다.복 2LSBs 의 주소를 제공하는 4 바이트의 정렬;이라고도 함 보폭 4 개의 바이트입니다.마 주소가 증가 효과적으로 증가 비트 2 비트 0,즉,마지막 2 비트는 항상 계속 00.

이할 수 있도에 영향을 미치는 물리적인 디자인의 시스템입니다.는 경우 주는 버스 요구에 적은 2 비트가 있을 수 있습 2 적 핀 CPU,2 개의 더 적은에 대한 추적 교환 및 반품이 불가능합니다.

자성

CPU 운영할 수 있습니다에 맞추어 자동으로 메모리,의미 없다는 것 기타 명령할 수 있는 인터럽트는 작업입니다.이것은 중요한 올바른 작업의 많은 lock-free data structures 기타 concurrency 패러다임.

결론

메모리 시스템의 프로세서는 아주 조금 더 복잡하고 관련된 보다 여기서 설명;토론에서 어떻게 86 실제로 프로세서 메모리 주소 을 도울 수 있(많은 프로세서의 비슷하게 작동하).

더 많은 혜택을 부착하여 메모리에 정렬할 수 있는 읽기에 이 IBM 문서.

컴퓨터의 기본 사용을 변환하는 데이터입니다.현대적인 메모리 아키텍처 및 기술 최적화되었습을 통해 수십 년 동안을 촉진하는 점점 더 많은 데이터,밖에서,그리고 사이 더 빠르고 더 많은 실행 단위에서 신뢰할 수 있는 방법입니다.

보너스:캐시

다른 정렬한 성능을 나는 이전에 언급은 맞춤 캐시선을 할 수 있습니다(예를 들어,일부 Cpu)64B.

는 방법에 대한 자세한 내용은 많은 성과를 얻을 수 있습을 활용하여 캐시 살펴보 갤러리의 프로세서 캐시 효과;에서 이 질문에 캐시-라인 크기

의 이해를 캐쉬 라인이 중요할 수 있는 특정 유형의 프로그램 최적화를 달성할 수 있습니다.예를 들어,정렬 데이터가 일치하지 않을 수 있습니다 여부를 결정하는 작업이 닿은 하나 또는 두 개의 캐쉬 라인입니다.우리가 본 것처럼 위의 예에서,이 쉽게 할 수 있는 의미에서는 비뚤어질 경우,작동 될 것입니다 두 번 느립니다.

할 수 있습으로 일부 프로세서(이 nehalem 이 할 수 있다어),하지만 이전에는 모든 메모리 액세스하는 64 비트(32 비트),라인 때문에 버스는 64 비트,당신을 가져올 64 비트 시간에,그것은 상당히 쉬운 가이에 정렬되어의'덩어리'를 64 비트입니다.

그래서,당신은 당신을 얻고 싶었다 하나의 바이트를,당신은 가이 64 비트 덩어리고 그때 가면 오프 비트는 당신을 원하지 않았다.쉽고 빠른 경우는 바이트 오른쪽 끝에 있는 경우에,그러나 중에는 64 비트 덩어리,당신이 떨어져 가면 원하지 않는 비트와 그런 다음 이동을 통한 데이터를 바랍니다.더 원한다면 당신은 당신이 2 바이트 변수는 분할에서 2 개의 덩어리,그런 다음 필요한 더블에 필요한 메모리에 액세스합니다.

그래서,모든 사람들이 생각하는 메모리 저렴,그들이 만든 컴파일러 정렬 데이터를 프로세서의 덩어리 크기 그래서 당신의 코드를 실행하는 더 빠르고 더 효율적으로의 비용으로 낭비되는 메모리.

기본적으로는 이유이기 때문에 메모리 버스는 어떤 특정한 길이 훨씬,훨씬 작은 메모리보다 크기입니다.

그래서,CPU reads 의 칩에 L1 캐시는 종종 32KB 이러한 일입니다.그러나 메모리를 연결하는 버스 L1 캐시 CPU 가질 것이 크게 작은 폭의 캐쉬 라인 크기.이 순서에는 128 .

그래서:

262,144 bits - size of memory
    128 bits - size of bus

Misaligned 에 액세스하는 것입니다 때때로 겹치는 두 캐시 라인,그리고 이것은 완전히 새로운 캐시 읽기를 얻기 위해서는 데이터입니다.그것도 모든 방법을 DRAM.

또한,어떤 부분의 프로 서있는 그것의 머리에 함께 넣어 단체의 이러한 두 개의 서로 다른 cache 라는 각각의 조각이있는 데이터입니다.에 하나인 것에는 매우 높은 비트,다른 매우 낮은 비트입니다.

가 될 것이 전용 하드웨어로 완벽하게 통합되는 파이프라인의 손잡이를 이동 정렬 개체에 필요한 비트 CPU 의 데이터 버스,그러나 그러한 하드웨어할 수 있는 부족을 위한 비뚤어 개체이기 때문에,그것은 아마 더 많은 의미가 사람들을 사용하는 트랜지스터 속도에 대한 올바르게 최적화된 프로그램입니다.

어떤 경우에,두 번째 메모리 읽기 때로는 필요한 속도가 느려집 파이프라인을 아무리 많은 특별한 용도의 하드웨어었다(만약하고 어리석게도)용하여 패치 misaligned 메모리 작업입니다.

@joshperry 주신 훌륭한 이 질문에 대답.또한 그의 대답에,나는 어떤 숫자를 표시하는 그래픽 영향을 설명했다,특히 2 배 확대.여기에 대한 링크 구글 스프레드시트 무엇을 보여주는 효과가 서로 다른 단어 선형 다음과 같다.또한 여기에 대한 링크 Github gist 과에 대한 코드를 테스트합니다.테스트 코드는 영어 문서 서면에 조나단 Rentzsch 는@joshperry 참조됩니다.테스트에서 실행 되었 맥북 프로 쿼드 중핵 2.8GHz Intel Core i7 64 비트 프로세서와 16GB RAM.

enter image description here

면으로 시스템 바이트 어드레스로 불러낼 수 있는 메모리를 32 비트 메모리 버스,그 의미가 있을 효과적으로는 네바이트-와이드 메모리 시스템은 모든 유선을 읽거나 쓰기 위해 동일한 주소입니다.정렬된 32 비트의 읽고 필요에 저장된 정보와 동일한 주소에서 네 메모리 시스템,그래서 모든 시스템을 공급할 수 있는 데이터를 동시에.는 정렬되지 않은 32 비트의 읽고 필요한 것이 몇 가지 메모리 시스템을 데이터를 반환에서 하나의 주소,일부 데이터를 반환에서 다음으로 높은 주소입니다.하지만 거기에 몇 가지 메모리 시스템은 최적화를 수행할 수 있 이러한 요청(외에도 그들의 주소,그들을 효과적으로는"플러스 중 하나"신호는 원인이 되는 그들을 사용하는 주소 중 하나는보다 더 높은 지정한)같은 기능을 추가한 상당한 비용과 복잡성을 메모리 시스템대부분의 상품 메모리 시스템은 단순히 반환할 수 없는 부분의 32-비트 단어에 동일한 시간입니다.

는 경우에 당신은 32 비트 데이터 버스,주소 버스 주 라인에 연결하여 메모리에서 시작2, 그래서만 32bit 맞춰 주소에서 액세스할 수 있는 단일 버스 사이클.

그렇다면 이 말씀에 걸쳐 있는 주소를 정렬계-즉A0 에 대한 16/32 비트 데이터 또는1 32 비트 데이터는 제로,두 개의 버스 사이클을 얻기 위해 필요한 데이터입니다.

어떤 아키텍처/명령어 집합을 지원하지 않는 정렬되지 않은 액세스를 생성하는 예외에 이러한 시도는,그렇게 컴파일러에서 생성한 정렬하지 않고 액세스 코드를 필요로하지만 추가적인 버스 사이클 하지만,추가 지침을 만들고,더 효율적입니다.

에 사용할 수 있는 로드하는 정수에서 이상한 주소로 문제가 없습니다.

Sparc and I86 그리고(나는 생각한다)Itatnium 하드웨어 올리는 예외하려고 할 때이다.

한 32bit 로드 vs 네이 8 비트 부 밤을 만들려고 많은 차이에서 가장 현대적인 프로세서를 지원합니다.는지 여부를 데이터가 이미에서는 캐나지 않을 것이다 훨씬 더 큰 효과가 있다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top