malloc으로 많은 갯수의 메모리 를 잡았을때..

bxhs의 이미지

시스템에 어떤 영향을 주는지 정확하게 아시는 분 계신지..

리눅스에서도 상관없고 윈도우에서도 상관없습니다.

예를 들어 100byte짜리 메모리단위들을malloc으로

100만개 정도 잡았다면, 메모리 100메가 정도 잡힌 셈인데..

대충 생각하기에는

하나의 버퍼로 100메가 잡은 것보다 실재론 더 많은 메모리를

못쓰게 만들것 같기도 하고..

malloc속도도 후반으로 갈수록 속도가 떨어질것 같군요..

운영체제 공부하신분들.. 가르침을 바랍니다.

lunarainbow의 이미지

답변이 올라오지 않기에, 좀 허접한 답변이나마 올려봅니다.

일단 100만번 돌면서 100바이트씩 할당할 경우 한번에 100메가를 할당할 경우보다 더 많은 메모리를 사용하게 됩니다.

이것에 관한 내용은 예전에 kldp 게시판에 pynoos님이 친절하게 설명해주신 강좌가 있습니다.

http://bbs.kldp.org/viewtopic.php?t=1244

참고하시면 많은 도움이 될듯 싶습니다.

malloc의 속도가 후반에 갈수록 떨어진다는 말씀은...

테스트를 해보지 않아서 잘은 모르겠지만, 적어도 그럴 일은 없을듯 싶습니다.

정확한것은 공룡책을 보시면 아시겠지만, 간단하게 정리를 한다면..

메모리 할당과 같은 작업은, 사용자가 요청하는 크기와 현재 메모리의 사용되지 않고 분할되어 있는 영역과의 관계를 이용하게 되는데,

이때 사용되지 않고 있는 부분을 저장하고 있게 되는데, 이 저장 방법이 단편화된 크기를 오름차순으로 정렬할 경우를 best-fit라 부르고, 내림차순으로 정렬할 경우 worst-fit라고 부릅니다.

다음과 같이 사용되지 않은 메모리 영역이 있다고 가정해 봅니다.

5  9 21 4 2 12 6
(편의상 이런것이 가능하다고 하죠.;; 바이트 단위)

이것을 각 방법으로 나열할 경우,

best-fit
2 4 5 6 9 12 21

worst-fit
21 12 9 6 5 4 2

위와 같이 메모리가 정렬될 것입니다.

이때 사용자로부터 10바이트의 메모리를 할당해 달라는 요청이 들어온다면, 각 방법에 따라 어떤 결과나 나올까요?

best-fit 방법은 2 4 5 6 9 12 총 6번의 탐색끝에 적당한 메모리를 할당시킬 수 있게 됩니다.

그럼 10바이트를 할당하고 난 후, 조각난 2바이트를 다시 넣어두어야 하지요?

2 2 4 5 6 9 21

10바이트를 할당한 후 모습은 이렇게 변하겠네요.

이제 worst-fit의 경우를 보면,

가장 먼저 검색해 보는 크기는 21바이트로써, 한번에 탐색이 가능해 지는군요.

그리고 조각난 것을 다시 넣어두게 되면, 최종적인 모습은

12 11 9 6 5 4 2

와 같이 됩니다.

어느것이 더 효율적으로 보입니까? 만일 메모리 단편화가 너무 심하여, 사용자가 원하는 크기만큼의 여유분 메모리가 존재하지 않는다면, best-fit방법의 경우 전 단편화된 메모리를 모두 탐색해 보아야 알 수 있을 것입니다.

반면에 worst-bit의 경우엔 언제나 1번의 탐색으로 가능해 지는군요.

음.. 제가 알기로 worst-fit 방법을 사용하고 있는것으로 압니다.

그러므로 후반부로 갈수록 느려진다는 의견은 테스트상의 문제가 아닐까 생각됩니다.

cinsk의 이미지

glibc에서 malloc()은 Doug Lea의 dlmalloc()에 변형을 가한 것을 쓰고 있습니다. (확인 안해봤음)

dlmalloc()은 "best-first with coalescing"을 쓰며, 자세한 것은 http://gee.cs.oswego.edu/dl/html/malloc.html를 참고하시고, malloc implementation에 관한 사항은 http://www.cs.colorado.edu/~zorn/Malloc.html를 보시기 바랍니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.