[Malloc] 키워드, 궁금했던 것 정리

bongf·2022년 5월 12일
0

정글

목록 보기
10/20

명시적 묵시적 할당기

  • 명시적 할당기는 명시적으로 할당된 블록을 반환해줄 것을 요구
  • 묵시적 할당기는 할당된 블록이 더이상 프로그램에 의해 사용되지 않고 블록을 반환하는지를 할당기가 검출할 수 있을 것을 요구
    • 묵시적 할당기 : 가비지 컬렉터
    • 자동으로 사용하지 않은 할당된 블록을 반환해주는 것을 가바지 컬렉션이라고 부른다.
  • malloc 패키지는 명시적 할당기

sbrk/mmap

  • 컴퓨터 시스템 책을 9.8.4 부터 읽으면 이해가 조금 간다.

sbrk함수

  • 커널은 힙의 꼭대기를 가리키는 변수 brk
  • sbrk 함수는 커널의 brk 포인터에 incr을 더해서 힙을 늘리거나 줄인다

sbrk/mmap

sbrk/brk

왜 char형으로 받을까

  • 블록 포인터 bp를 void *bp 로 받아서 사용하는 곳이 있고, char *로 받아서 사용하는 곳도 있다.
  • p의 주소값을 받아서 값을 읽거나 쓸 때는 unsigned int *로 받아서 주소값 자체에 접근할 수 있도록 하고 주소에 변화를 줄 때는 * char로 받는다.
    • 왜냐면 우리가 WORD, DWORD로 4바이트, 8바이트씩 추가해주는 연산을 해주고 싶은데, 만약 이를 int *로 받으면 주소 + 4 -> 16바이트 이동을 하게 되기 때문이다.

  • 여기를 unsigned int로 받은 것은 한 번에 읽어 올 때 한 word씩 읽어야 하므로 (4바이트)
  • (char *)로 받은 곳은 +- wsize 같은 것 해줘야 하니까 +4 하면 주소값을 4만큼 크게 해줘야 해서

왜 32비트 모드에서 8바이트(구현 기준 더블워드) 정렬하면 항상 payload 시작 주소가 8의 배수인가?

  • 컴퓨터 시스템 책 내용

    In practice, the alignment depends on whether the code is compiled to run in 32-bit mode (gcc -m32) or 64-bit mode (the default). In 32-bit mode, malloc returns a block whose address is always a multiple of 8. In 64-bit mode, the address is always a multiple of 16.

  • WORD의 배수의 사이즈로 블록을 만들어야 하는 것은 이해했다.
  • 그렇게 데이터가 정렬되어 있지 않다면, 한 블록 단위로 읽으면 되는 것을 두 블록을 읽어야 할 수도 있고, 또 이를 결국엔 한 블럭으로 합쳐서 읽어야 하기도 하니까
  • 읽기 쉽게 하기 위해 이렇게 하는 것은 이해했다. 전송도 다 32비트 단위이므로
  • 그런데 왜 주소값이 8의 배수인지 잘 이해하지 못했다
  • 어떤 주소에서 시작하든 블록의 크기가 8의 배수면 되는 것 아닌가?

http://www.mathcs.emory.edu/~cheung/Courses/255/Syllabus/7-M68000/align.html

  • 시스템 버스에는 address bus도 있고 data bus 도 있다 ( 그 외 다른 것도 있다)
  • 메모리에 접근해서 data bus로 전송하는데
  • 32bit는 컴퓨터면 data bus가 32줄로 되어 있다. 1줄에 1 bit로 한 번에 4byte의 데이터를 나를 수 있다
  • 32bit 컴퓨터라면 이렇게 한 번에 4byte씩 읽어서 퍼 나를 수 있다
  • 그런데 중간에 이렇게 이것을 나른다면 두 번 전송해야 한다. 이렇게 한 번, 이렇게 한번. 주소 자체가 2번
  • 버스를 32비트니까 효율적으로 하기 위해 1비트씩 이동하면서 읽는 것이 아니라 32비트씩 읽도록 하는 것이 훨씬 효율 적일 것이기 때문에
  • 다음칸으로 점프 점프 하려면 당연히 첫번째가 0이어야 겠지
  • 그래서 이렇게 맞춰주는 것으로 이해했다.

왜 ChunkSize가 2 << 12 일까

  • chunksize를 정해주지 않고 요청이 올 때 마다 extension 하면 그 extension의 횟수 뿐만 아니라, sbrk()를 건드려야 하므로 os에게 부담이 간다(1칸씩 움직인다고 생각해봐)
  • 그래서 os의 부담을 줄여주기 위해 chunksize를 크게 하여 만든다
  • 근데 또 너무 chunksize를 크게 하면 내부 fragment가 생긴다.
  • 그렇기 때문에 적정 수준을 찾은 것이 2 << 12

왜 WORD에 대한 정의가 각기 다른지? (코치님)

  • 애초에 한번에 다룰 수 있는 데이터의 크기로 지정한 것이 WORD가 맞는데 이게 64비트 컴퓨터, (8바이트) 등 더 고성능이 나오면서 한 WORD 사이즈가 너무 커져버리게 된다.
  • 기본적으로 1 WORD는 4바이트 (32비트 기준) double word는 8바이트 기준이지만
  • 인텔에서는 2바이트 객체를 워드로, 4바이트 객체를 더블 워드로 정의했다. 컴퓨터 시스템 책 810쪽

시스템 콜

커널 이란 운영체제의 핵심(심장)으로 메모리에 상주하는 부분(심장이니까 항상 메모리에 올라가 있다

시스템 콜 System call

  • 사용자 프로그램이 운영체제의 커널에게에 서비스를 청하는 것
  • 시스템을 call 하는 것

데이터 세그먼트

https://plan0a-0z-entering-security.tistory.com/32
https://www.codetd.com/ko/article/13013312

메모리 단편화 Memory Fragmentation

  • 블록이면 블록 페이지면 페이지. 이렇게 메모리를 파티션으로 나눠두잖아. 파티션과 파티션 사이에 빈 공간이 생기는데 그 크키가 작아 요청 메모리를 할당하지 못하는 현상이 외부 단편화, 한 파티션의 크기가 요청 크기보다 커서 파티션 안에 사용되지 않는 빈 공간이 생기는 것이 내부 단편화
  • 내부 단편화
    • 블록으로 나눠져 있어서 블록의 배수만큼 할당해야 하니까, 사실은 더 조금 필요함에도 블록의 배수만큼 할당하게 된다.
  • 외부 단편화
  • 반효경 교수님 강의 참고
profile
spring, java학습

0개의 댓글

관련 채용 정보