개발자가 될 때 까지..
Memory Alignment
컴퓨터는 데이터를 메모리에 저장할 때 바이트 단위로 데이터를 나누어 저장한다.
데이터를 저장하는 순서는 '빅-엔디안', '리틀-엔디안' 두가지 방식으로 나뉜다.
이는 CPU 아키텍처에 따라 달라지며, 어떤 CPU에서는 이 두 가지 방식을 모두 지원하도록 구성( '미들-엔디안' )할 수도 있다고 한다.
따라서, 데이터를 다른 시스템에 전송 할 때 서로 다른 데이터 저장 방식의 시스템끼리 통신을 하게 되면 엉뚱한 값을 주고 받을 수 있다.
좀 더 자세히 알아 보도록 하자.
엔디안
Endianness 은 컴퓨터의 메모리와 같은 1차원 공간에 여러개의 연속된 대상을 배열하는 방법을 뜻하며, 바이트를 배열하는 방법을 Bytes Otder( 바이트 순서 )라 한다.
엔디언은 보통 큰 단위가 앞에오는 '빅-엔디안( Big-endian )', 작은 단위가 앞에오는 '리틀-엔디안( Little-endian )' 으로 나뉘는데, 두 경우에 속하지 않거나 둘 모두를 지원하는 것을 '미들-엔디언( Middle-endian )'이라 부기도 한다.
빅-엔디안
낮은 주소에 상위 바이트부터 기록되어 높은 주소에 하위 바이트가 기록된다.
= 최상위 바이트( MSB: Most Signficant Byte )부터 차례대로 저장
ex) 4bytes: 0x01020304 가 있을 때,
하위 | 01 | 02 | 03 | 04 | 상위 |
- Sparc / RISC CPU / Unix 계열.
- 바이트 데이터를 앞에서부터 스택에 PUSH.
- 소프트웨어의 디버그를 편하게 해 준다. 사람이 숫자를 읽고 쓰는 방법과 같기 때문에 디버깅 과정에서 메모리의 값을 보기 편하다.
- 네트워크 데이터 통신( TCP/IP, XNS, SNA 규약은 16bis와 32bits 정수에서)는 '빅-엔디안'을 따르고 있다.
- 비교 연산에서 '리틀-엔디안'보다 속도가 빠르다.
리틀-엔디안
낮은 주소에 하위 바이트부터 기록되어 높은 주소에 상위 바이트가 기록된다, Intel CPU 계열
= 최하위 바이트 ( LSB: Least Significant Byte )부터 차례대로 저장
ex) 4bytes: 0x01020304 가 있을 때,
하위 |
04 |
03 |
02 |
01 |
상위 |
- Intel CPU 계열.
- 바이트 데이터를 뒤에서부터 스택에 PUSH.
- 메모리의 저장된 값의 하위 바이트들만 사용할 때도 별도의 계산이 필요 없다.
- 계산 연산에서 '빅-엔디안'보다 속도가 빠르다.
평소 우리가 보기 편한 방식은 빅-엔디안 일 것 이다. 그냥 순서대로 적으면 되니까!
그런데 왜 리틀-엔디안을 사용하는 걸까?
바로, 산술연산유닛(ALU)에서 메모리를 읽는 방식이 메모리 주소가 낮은쪽에서 부터 높은 쪽으로 읽어야 산술 연산의 수행이 더 쉽기 때문이라고 한다.
but, 오늘 날의 프로세서는 여러 개의 바이트를 동시에 읽어들여 동시에 덧셈을 수행하는 구조를 갖고 있어 두 엔디언 사이에 사실상 차이가 없다.
그렇지만 세상엔 아직 옛 프로세스를 따르는 것이 있고, 연산 속도에 차이가 없다 뿐이지 분명 데이터를 기억하는 방식은 다르다는 것을 명심하자.
'개발자 레니는 지금 - > 공부하는 중' 카테고리의 다른 글
동시성 vs 병렬성 (0) | 2018.09.12 |
---|---|
네트워크 모듈 검색 at Python (0) | 2018.09.12 |
Git 입문 및 Command 참고에 좋은 사이트 (0) | 2018.09.07 |
👻 SSL(TLS)에 대하여, 간단히 알아보는 대칭키/공개키 (0) | 2018.09.04 |
메모리 관리, 동적할당 (0) | 2018.07.16 |