메모리<->cpu간 작업시간을 최소로 단축시킬수있는 작업단위는 몇비트인가요??
글쓴이: k1d0bus3 / 작성시간: 목, 2011/03/24 - 5:26오후
구조체 링크드리스트(or 배열)을 만들어서, 메모리 <-> cpu간 r/w을 하려고 합니다.
제가알기로는 cpu는 32bit단위로 처리하고, 메모리 입출력단위는 8bit로 알고있습니다.
가능한한 메모리 <-> cpu간 작업처리시간을 줄이려면,(메모리에있는 구조체의 각멤버필드를 read/write하려고 합니다)
이때 구조체전체크기나 각각의멤버필드를
32bit의 배수에 맞추는게 유리합니까? 8bit의 배수에 맞추는게 유리합니까?
구체적으로 말하자면....
다음의 구조체 멤버들의 자료형은 어떡게 선언하는게 최선일까요?
비트필드로 선언하는게 유리합니까?
struct person{
어떤자료형? dataA; (크기는최소3bit이상되야함)
어떤자료형? dataB; (크기는최소10bit이상되야함)
struct person* link; (32bit)
};
Forums:
Quote: 이때 구조체전체크기나
struct의 사이즈는
컴파일러가 해당 architecture의 word size의 배수로, 가장 자연스러운 사이즈로 알아서 조정하여 줍니다.
그래서 그렇게 하지 말아달라고 컴파일러에게 지시하는 전처리 명령어들이 있습니다. 가령 #pragma pack.
검색해보시면 관련 문서 많이 나옵니다.
==================
메모리 접근은 word 단위로 하는것이 가장 자연스럽습니다: http://en.wikipedia.org/wiki/Word_%28computing%29
각 architecture 마다 word의 사이즈는 다를수도 있습니다.
자세한 설명은 위키페이지의 설명 참고하세요.
하지만...속도를 위해서라면
이런것보다, 어떻게 하면 cache-friendly 코드를 만들까 생각하는게 훨신 생산적입니다.
메모리는 너무너무너무너무 엄청나게 느립니다. 그래서 OS는 메모리접근의 횟수를 최대한 적게하려고 노력합니다.
메모리 접근이 빈번하면 전반적인 시스템이 엄청느려집니다.
cache-hit rate가 1%만 떨어져도 엄청난 속도 저하가 나타납니다.
또한, 메모리 fragmentation 을 막기위해 메모리 풀같은걸 구현하여 사용하는게
훨신 영양가 높은 방법입니다.
댓글 달기