스택하나의 크기가 4바이트인이유..
글쓴이: qkrwncks593 / 작성시간: 금, 2012/08/03 - 7:19오후
32bit CPU 기준으로 스택하나의 크기가 4바이트인이유는 무엇인가요 ? 예전부터 그냥 암기하고 있었는데 .. 갑자기 궁금하네요
push , pop 을 할때 스택포인터에서 4를 빼거나 더하는이유는 32bit CPU 의 레지스터가 4바이트니까 4바이트씩 처리하나까
스택공간을 할당할때 스택포인터 (esp)에서 4바이트를 빼서
4바이트씩 할당하는 건가요 ? ? ? 아니면 32bit CPU 가 4바이트씩 밖에 할당하지 못하는건가요 ?
Forums:
참고하세요.
(1) 나빌레라님 강좌 추천
주소 : http://kldp.org/node/109764
이유 : 컴퓨터 구조 대한 이해를 높일 수 있다.
(2) 책 추천 "64비트 멀티코어 OS 원리와 구조" 작자 "한승훈" 한빛미디어
32비트 cpu니까 스텍도 32비트이지 않을까요?
어떤 스텍이냐에 따라 다르겠지만 메모리의 어떤 주소를 저장하는 스텍이라면, 메모리 공간이 32비트 주소체계로 넘버링 되어 있으니 당연히 주소값의 크기도 32비트일테고, 그것을 저장하는 스텍의 크기도 자연히 32비트겠죠. 그런데 32비트 cpu는 애초에 설계할 때 부터 명령어나 데이터 주소체계 등등을 32비트를 낭비하지 않고 전송&연산 할 수 있도록 끼워 맞추어 놓았으니, 단일 스텍의 크기도 32비트가 되죠. 그냥 같은 '단위'를 사용한다고 생각하면 편할 것 같습니다.
음
반드시 4 바이트씩만 더하고 빼야하는건 아니고
32비트 시스템에서 주소값의 길이가 4바이트이고,
스택에 보통 주소값을 push, pop 하다보니까 4바이트씩 더하고 빼는것이죠..(레지스터 크기도 4바이트이고..)
컴파일러가 좀 특이한놈이라면 1바이트 데이타를 스택에 넣고뺄때
esp 를 직접 1바이트 단위로 더하고 뺄수도 있습니다
단지 컴파일러가 그런짓을 안할뿐이죠(보통 할필요가 없고, 복잡하고 비효율적이니까)
자기실력이 좋다고 느껴지는건 공부를 안하고 있다는 신호.
인수 승급
함수 호출에서 매개변수에서도 관련이야기가 있다면,
아무리 1byte 등등을 인수로 넣어도, 실제 스택에 저장되는 인수는 4, 8 단위 입니다.
아마도 32비트 단위로 맞추려고 일부로 승급시킨듯?
그래서 가변인수사용할 때, 4, 8 단위이기 때문에 형변환 해서 원래 값을 찾는 방식을 사용합니다.
부가적인 이유도...
일반적으로 32Bit CPU든 64Bit CPU든 Data Bus Line을 가지고 있습니다. 데이터 버스 라인의 역할은 간단하게 메모리에서 필요한 데이터를 가져온다고 생각하시면 됩니다. 이 녀석의 크기가 일반적으로 32Bit CPU에서는 32Bit이고 64Bit CPU에서는 64Bit입니다. (CPU의 하드웨어 명세서라고 해야하나요? 그거 보시면 D로 시작하는 녀석들이 있을 겁니다.)
이 상황에서 예를 들어 8Bit데이터를 읽어들인다고 생각합시다. 그럼 32Bit Data Bus Line을 가지고있는 Hardware에서는 8Bit데이터를 Storage(예를 들어, 메모리)에 요청할껏이고, 이 명령을 받아들인 Storage에서는 데이터를 보낼 겁니다. 이때 가만히 생각해보면, 32Bit 라인에서 8Bit만 사용되니 나머지 24Bit라인은 텅텅빈게 되겠죠?? 즉, 효율이 32Bit데이터를 읽어들일때보다 1/4정도로 감소한다는 소리입니다. 이게 한번일때는 상관없지만, 연속되게 8Bit데이터를 계속 읽어들인다면??
이것은 분명히 프로그램 속도상에 문제가 됩니다. 32Bit로 한번에 읽을껄 8Bit로 4번에 걸쳐서 읽게됩니다. 속도가 느려지죠. (이거외에도 Storage에서도 속도 감소의 요인이 발생하지만 이것은 나중에 기회가 되면 말씀드리구용...)
즉, 이런식으로 동작하는 것은 비효율적이란 소리가 됩니다.
이것을 해결하려면, 32Bit 단위로 데이터를 저장하는게 공간을 낭비하게 된다고 하더라도 속도상의 이점이 있겠죠?
이것을 Data Alignment라고 부릅니다. (http://en.wikipedia.org/wiki/Data_structure_alignment)
Stack의 경우 거의 모든 Intel x86(-64포함) CPU(뿐만이 아니라 ARM역시)에서 돌아가는 프로그램들에서 사용합니다. 그것도 자주요... 프로그램에서의 Stack의 역활은 (C언어의 경우) 임시 데이터를 저장하는 공간이 됩니다. (보통 빈번하게 사용되는 데이터는 Register에 넣죠) 즉, 데이터 엑세스가 많이 일어나고, Stack에 접근하는 속도가 프로그램의 속도에 중요한 역할을 하게 됩니다. (사실 Stack이라 말했지만, 실제론 Stack도 메모리에 위치하니 메모리의 접근하는 속도라고 해도 되겠습니다.)
즉, 속도에 민감한 부분을 애써 8Bit단위로 잘게해서 공간을 절약할 필요없겠죠?? 그래서 32Bit CPU에서는 32Bit CPU로, 64Bit CPU에서는 64Bit 단위의 배수로 Stack의 크기를 사용하는 것으로 알고 있습니다.
PS. 물론 이것말고도 추가적인 이유도 있겠지만, 일단 메모리 관점에서 제가 아는 한도내에서 설명했습니다.
하지만 데이터의 저장등에서는 저장공간을 생각하면, 낭비스러운 짓은 못하겠죠? 이때 하는 것이 Packing입니다. 데이터를 여분없이 한마디로 잘 차곡차곡 쌓는다고 생각하시면됩니다.
댓글 달기