홈페이지 » 어떻게 » 내 컴퓨터의 RAM이 얼마나 많은 메모리 주소를 보유 할 수 있습니까?

    내 컴퓨터의 RAM이 얼마나 많은 메모리 주소를 보유 할 수 있습니까?

    언젠가는 컴퓨팅 경험의 표면 수준을 살펴 보는 것이 재미 있고, 다른면에서는 내부 작업을 깊이 파헤치는 것이 재미 있습니다. 오늘 우리는 컴퓨터 메모리의 구조를 살펴보고 RAM의 막대기에 얼마나 많은 물건을 담을 수 있는지 알려줍니다..

    오늘의 질문 및 답변 세션은 Q & A 웹 사이트의 커뮤니티 중심 그룹 인 Stack Exchange의 하위 부문 인 수퍼 유저의 도움으로 이루어졌습니다..

    질문

    수퍼 유저 리더 Johan Smohan은 총 주소 수를 산출하기 위해 프로세서 유형과 메모리 크기가 함께 작동하는 방식에 대해 고심하고 있습니다. 그는 쓴 :

    32 비트 프로세서와 1GB RAM을 사용할 수있는 메모리 주소의 수와 64 비트 프로세서의 메모리 주소 수?

    나는 이것이 다음과 같은 것이라고 생각한다.

    메모리 주소 수를 얻기 위해 1GB RAM을 32 비트 4 비트 (?)로 나눈 값?

    나는 위키 백과에서 1 개의 메모리 주소가 32 비트 폭 또는 4 옥텟 (1 옥텟 = 8 비트)이고, 1 메모리 주소 또는 1 정수가 64 비트 폭 또는 8 옥텟 인 64 비트 프로세서와 비교할 때 읽었다. 그러나 내가 그것을 올바르게 이해했는지 모르겠다..

    이들은 호기심 많은 괴짜를 밤에 위로 유지할 수있는 질문의 종류입니다. Johan의 가상 시스템마다 몇 개의 주소를 사용할 수 있습니까??

    대답

    수퍼 유저 기여자 인 Gronostaj는 RAM이 어떻게 분리되고 활용되는지에 대한 통찰력을 제공합니다.

    짧은 답변: 사용 가능한 주소의 수는 다음 중 작은 수와 같습니다.

    • 메모리 크기 (바이트)
    • CPU의 기계어에 저장할 수있는 가장 큰 부호없는 정수

    위의 긴 대답과 설명 :

    메모리는 바이트 (B)로 구성됩니다. 각 바이트는 8 비트 (b).

    1 B = 8 b 

    1GB RAM은 실제로 1 GiB (기가 바이트가 아닌 기가비트)입니다. 차이점은 다음과 같습니다.

    1 GB = 10 ^ 9 B = 1 000 000 000 B 1 GiB = 2 ^ 30 B = 1 073 741 824 B 

    메모리의 모든 바이트는 CPU 머신 워드의 크기와 상관없이 자체 주소를 가지고 있습니다. 예 : Intel 8086 CPU는 16 비트 였고 메모리를 바이트 단위로 처리 했으므로 최신 32 비트 및 64 비트 CPU를 사용하십시오. 이것이 첫 번째 제한의 원인입니다. 메모리 바이트보다 많은 주소를 사용할 수 없습니다..

    메모리 주소는 CPU가 메모리의 처음부터 건너 뛴 바이트 수입니다..

    • 첫 번째 바이트에 액세스하려면 0 바이트를 건너 뛰어야하므로 첫 번째 바이트의 주소는 0입니다..
    • 두 번째 바이트에 액세스하려면 1 바이트를 건너 뛰어야하므로 주소는 1입니다..
    • (기타 등등… )
    • 마지막 바이트에 액세스하기 위해 CPU는 1073741823 바이트를 건너 뜁니다. 따라서 주소는 1073741823입니다..

    이제 32 비트가 실제로 무엇을 의미하는지 알아야합니다. 앞에서 언급했듯이 기계 단어의 크기입니다..

    기계어 란 CPU가 숫자를 저장하는 데 사용하는 메모리 양 (RAM, 캐시 또는 내부 레지스터)입니다. 32 비트 CPU는 32 비트 (4 바이트)를 사용하여 숫자를 저장합니다. 메모리 주소는 숫자이기도하므로 32 비트 CPU에서 메모리 주소는 32 비트.

    이제 이것에 대해 생각해보십시오. 하나의 비트가 있으면 0 또는 1의 두 값을 저장할 수 있습니다. 비트를 하나 더 추가하면 네 개의 값인 0, 1, 2, 3이 있습니다. 3 비트에서 8 개의 값을 저장할 수 있습니다 : 0, 1, 2 ... 6, 7. 이것은 실제로 바이너리 시스템이며 다음과 같이 작동합니다.

    2 진 10 진수 0 0000 1 0001 2 0010 3 0011 4 0100 5 0101 6 0110 7 0111 8 1000 9 1001 10 1010 11 1011 12 1100 13 1101 14 1110 15 1111 

    이것은 보통의 덧셈과 똑같이 작동하지만 최대 숫자는 9가 아닌 1입니다. 10 진수는 0입니다. 0000, 1을 더하고 get 0001, 다시 한 번 추가하면됩니다. 0010. 여기서 일어난 일은 십진수를 갖는 것과 같습니다. 09 하나 추가 : 9를 0으로 변경하고 다음 자릿수를 증가시킵니다..

    위의 예에서 상수 값을 가진 숫자에는 항상 최대 값이 있음을 볼 수 있습니다. 모든 비트가 1이고 값을 1 씩 늘리려고하면 모든 비트가 0이되어 번호. 정수 오버플로라고 불리며 사용자와 개발자 모두에게 많은 불쾌한 문제를 일으 킵니다..

     11111111 = 255 + 1 ----------- 100000000 = 0 (여기서 9 비트이므로 1이 다듬어 짐) 
    • 1 비트의 경우 최대 값은 1입니다.,
    • 2 비트 - 3,
    • 3 비트 - 7,
    • 4 비트 - 15

    가능한 최대 수는 항상 2 ^ N-1입니다. 여기서 N은 비트 수입니다. 앞에서 말한 것처럼 메모리 주소는 숫자이며 최대 값을가집니다. 이것이 기계어의 크기가 사용 가능한 메모리 주소의 수에 대한 제한이기도 한 이유입니다. 가끔씩 CPU가 더 많은 메모리를 처리 할만큼 큰 숫자를 처리 할 수없는 경우가 있습니다.

    따라서 32 비트에서 0에서 2 ^ 32-1까지의 숫자를 유지할 수 있습니다. 4 294 967 295입니다. 1GB RAM에서 가장 큰 주소보다 많기 때문에 특정 경우에 RAM의 양이 제한 요소가됩니다.

    32 비트 CPU의 RAM 제한은 이론적으로 4GB (2 ^ 32)이며 64 비트 CPU의 경우 16 EB (엑사 바이트, 1 EB = 2 ^ 30 GB)입니다. 즉, 64 비트 CPU는 전체 인터넷을 처리 할 수 ​​있습니다 ... 200 번;) (WolframAlpha로 추정).

    그러나 실제 운영 체제에서 32 비트 CPU는 약 3 GiB의 RAM을 처리 할 수 ​​있습니다. 운영 체제의 내부 아키텍처 때문입니다. 일부 주소는 다른 용도로 예약되어 있습니다. Wikipedia에서 이른바 3GB 장벽에 대해 더 많이 읽을 수 있습니다. 실제 주소 확장을 사용하여이 제한을 들어 올릴 수 있습니다..

    메모리 어드레싱에 관해서는 언급해야 할 몇 가지 사항이 있습니다. 가상 메모리분할 과 페이징.

    가상 메모리

    @Daniel R Hicks이 또 다른 대답으로 지적한 것처럼 OSes는 가상 메모리를 사용합니다. 이것이 의미하는 것은 응용 프로그램이 실제 메모리 주소에서 작동하지 않지만 OS에서 제공하는 것입니다..

    이 기술을 통해 운영 체제는 RAM에서 소위 페이지 파일 (Windows) 또는 스왑 (* NIX)으로 일부 데이터를 이동시킬 수 있습니다. HDD는 RAM보다 속도가 느리지 만 드물게 액세스되는 데이터에는 심각한 문제가 아니며 OS가 실제로 설치 한 것보다 많은 RAM을 응용 프로그램에 제공 할 수 있습니다.

    페이징

    지금까지 우리가 얘기 한 것은 플랫 주소 지정 체계라고합니다..

    페이징은 플랫 모델에서 일반적으로 하나의 기계어로 할 수있는 더 많은 메모리를 처리 할 수있는 대체 주소 지정 체계입니다.

    4 글자 단어로 가득 찬 책을 상상해보십시오. 각 페이지에 1024 개의 숫자가 있다고 가정 해 보겠습니다. 번호를 지정하려면 두 가지를 알아야합니다.

    • 해당 단어가 인쇄 된 페이지 수.
    • 그 페이지에서 당신이 찾고있는 단어는 어느 것입니까?.

    이제 그것이 바로 최신 x86 CPU가 메모리를 처리하는 방법입니다. 그것은 4 KiB 페이지 (각각 1024 기계 단어)로 나뉘며 그 페이지에는 숫자가 있습니다. (실제로 페이지는 4 MiB 또는 PAE가있는 2 MiB 일 수도 있음). 메모리 셀을 주소 지정하려면 해당 페이지에서 페이지 번호와 주소가 필요합니다. 각 메모리 셀은 정확하게 한 쌍의 숫자로 참조되며 세그먼테이션의 경우는 그렇지 않습니다..

    분할

    글쎄, 이것은 페이징과 아주 비슷하다. 그것은 하나의 예제를 명명하기 위해 인텔 8086에서 사용되었습니다. 주소 그룹은 페이지가 아닌 메모리 세그먼트라고합니다. 차이점은 세그먼트가 겹칠 수 있으며 중복되는 부분이 많다는 것입니다. 예를 들어 8086에서 대부분의 메모리 셀은 4096 개의 다른 세그먼트에서 사용할 수있었습니다.

    예 :

    우리가 8 바이트의 메모리를 가지고 있고, 모두 4 번째 바이트를 제외하고는 0을 가지고 있다고 가정 해보자..

    평면 메모리 모델에 대한 그림 :

     _____ | 0 | | 0 | | 0 | | 255 | | 0 | | 0 | | 0 | | 0 | ----- 

    페이징 메모리에 대한 그림 4 바이트 페이지 :

     PAGE0 _____ | 0 | | 0 | | 0 | PAGE1 | 255 | _____ ----- | 0 | | 0 | | 0 | | 0 | ----- 

    세그먼트 화 된 메모리에 대한 그림 4 바이트 세그먼트가 1 :

     SEG 0 _____ SEG 1 | 0 | _____ SEG 2 | 0 | | 0 | _____ SEG 3 | 0 | | 0 | | 0 | _____ SEG 4 | 255 | | 255 | | 255 | | 255 | _____ SEG 5 ----- | 0 | | 0 | | 0 | | 0 | _____ SEG 6 ----- | 0 | | 0 | | 0 | | 0 | _____ SEG 7 ----- | 0 | | 0 | | 0 | | 0 | _____ ----- | 0 | | 0 | | 0 | | 0 | ----- ----- ----- ----- 

    보시다시피 네 번째 바이트는 네 가지 방식으로 처리 할 수 ​​있습니다. (0부터 주소 지정)

    • 세그먼트 0, 오프셋 3
    • 세그먼트 1, 오프셋 2
    • 세그먼트 2, 오프셋 1
    • 세그먼트 3, 오프셋 0

    항상 같은 메모리 셀입니다..

    실제 구현에서 세그먼트는 1 바이트 이상 이동합니다 (8086의 경우 16 바이트).

    세분화에 대한 나쁜 점은 복잡하다는 것입니다. (하지만 이미 알고 있다고 생각합니다.) 좋은 점은 모듈화 된 프로그램을 만드는 데 영리한 기술을 사용할 수 있다는 것입니다..

    예를 들어, 일부 모듈을 세그먼트에로드 한 다음 세그먼트가 실제 크기보다 작은 것으로 가장하고 (모듈을 보유하기에 충분히 작은) 가장 가까운 하위 세그먼트와 겹치지 않는 첫 번째 세그먼트를 선택하고 다음 세그먼트를로드 할 수 있습니다 모듈, 등등. 기본적으로,이 방법은 가변 크기의 페이지입니다..


    설명에 추가 할 것이 있습니까? 의견에서 소리가 나지. 다른 기술에 정통한 Stack Exchange 사용자의 답변을 더 읽고 싶습니까? 전체 토론 스레드를 여기에서 확인하십시오..