2012-09-22 3 views
2

나는 실시간 OS 사양을 다룰 예정이었고, RTOS에서 우리는 보통 malloc을 선호하지 않는다는 것을 읽었습니다. 그 이유는 성능 문제 때문에 malloc을 사용해서는 안됩니다. malloc을 통해 메모리를 할당하는 데 시간이 많이 걸리고 할당 된 메모리를 추적하는 오버 헤드가 높기 때문입니다.메모리 풀 대 malloc

지금 실시간 시스템에서 시간 제약은 모든 프로세스와, 우리가 일반적으로 malloc을 사용하지 마십시오있다. 호기심이 생기고 RTOS에서 런타임에 실제로 메모리를 할당하는 방법과 같은 약간의 연구를 시작했고 메모리 풀을 발견했습니다. 이제 메모리 풀은 고정 된 크기의 블록 할당이라는 의미입니다. 메모리 풀의 장점은 조각화가 발생하지 않는다는 것입니다. 그게 어떻게 가능해? 우리가 4 바이트의 3 풀을 가지고 있고 응용 프로그램이 10 바이트를 필요로한다고 가정하면,이 경우 메모리 풀은 내부 단편화로 어려움을 겪을 것이다.

어떻게 메모리 풀 작동합니까 메모리가 어떻게 할당? 특정 응용 프로그램이 풀 크기 4bytes에서 3 개의 풀을 얻는 것처럼 응용 프로그램이 컴파일 시간에 풀을 가져 옵니까? 풀에 들어갈 수없는 메모리가 필요한 경우에는 어떻게해야합니까? 그러한 시스템에 크기가 다른 많은 메모리 풀이 있습니까? 나에게 설명해주십시오.

답변

1

음, 조각화는 메모리 풀 구현에 따라 달라집니다. 일반적으로 메모리 풀은 고정 된 크기의 메모리 블록 풀입니다. 뭔가가 그 크기의 메모리 블록을 원하면 그 풀에갑니다. 따라서 블록 크기를 원하는 모든 것이 그 크기의 블록 풀에서 가져 오기 때문에 조각화가 없습니다. 특정 크기의 블록의 풀 (pool)이 존재하지 않는 경우

지금, 그 후에 더 큰 크기의 풀 (pool)을 사용할 수있다. 그런 다음 기술적으로 발생하면 할당 된 메모리 블록의 특정 부분이 사용되지 않기 때문에 (단편화 됨) 조각화가 발생합니다. 모든 메모리 풀에 필요한 모든 크기의 블록을 공급하는 경우

후 아무런 조각이 없을 것이다.

0

풀 단편화를 제거하지 않지만, 극적으로 감소, 또한 가능성이 매우 작은 블록의 매우 많은 수를 할당하는 오버 헤드를 줄일 수 있습니다. 좋은 코드 중 하나는 클라이언트 코드가 확장 성이 뛰어난 각 구조체에 대한 풀을 만들 수있게 해주는 라이브러리입니다. 풀 작성시, 블록 크기, 초기 할당 블록 수 및 디버깅을위한 텍스트 이름을 지정합니다.

당신은 할당에 풀 ID를 전달, 블록을 할당합니다. 풀에 여유 블록이 없을 때마다 블록의 인접한 덩어리를 할당하여 사용 가능하게 만들고 그 중 하나를 반환합니다. 블록이 해제 될 때마다 해당 블록의 청크에있는 모든 블록이 비어 있으면 청크가 해제됩니다.

디버그의 경우 설명, 할당 된 수 및 사용 가능한 사용 가능한 수의 수와 같은 다른 통계를 제공하는 루틴이 있습니다 (높으면 조각화 문제가있는 경우). . 메모리 누수를 찾는 데 매우 유용합니다.

이 유형의 라이브러리에 대한 최악의 경우는 많은 블록을 할당 한 다음 시스템 수명 초기에 임의의 다수를 해제하는 하위 시스템을위한 것입니다. 다수의 덩어리가 할당 된 상태로 유지되지만 사용중인 블록은 거의 없습니다. 가장 좋은 경우 (malloc과 비교)는 특정 임베디드 시스템과 같이 오랜 기간 동안 시스템을 유지해야하는 시스템의 경우, 수명이 광범위하게 변화하는 새로운 블록을 필요로하는 지속적인 사이클이 있습니다.

이것은 가장 단순하며 단일 스레드 응용 프로그램에 가장 적합합니다. 멀티 스레드 응용 프로그램의 경우 스레드 안전을 위해주의를 기울여야하며 잠금 오버 헤드 (예 : 스레드 별 "경기장")를 최소화하기 위해 malloc()이 종종 수행하는 최적화를 모방해야 할 수도 있습니다.