亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

The Linux Programming Interface 筆記之malloc和free的實現

2019-11-14 09:13:18
字體:
來源:轉載
供稿:網友
        Although malloc()andfree() PRovide an interface for allocating memory that ismuch easier to use than brk() and sbrk(), it is still possible to make various programmingerrors when using them. Understanding how malloc() and free()are implemented

provides us with insights into the causes of these errors and how we can avoid them.

       The implementation of malloc()is straightforward. It first scans the list of memoryblocks previously released by free() in order to find one whose size is larger thanor equal to its requirements. (Different strategies may be employed for this scan,depending on the implementation; for example, first-fit or best-fit.) If the block isexactly the right size, then it is returned to the caller. If it is larger, then it is split, sothat a block of the correct size is returned to the caller and a smaller free block is

left on the free list.

       If no block on the free list is large enough, then malloc() callssbrk() to allocatemore memory. To reduce the number of calls to sbrk(), rather than allocatingexactly the number of bytes required, malloc() increases the program break inlarger units (some multiple of the virtual memory page size), putting the excessmemory onto the free list.

       Looking at the implementation of free(), things start to become more interesting.When free() places a block of memory onto the free list, how does it know whatsize that block is? This is done via a trick. When malloc() allocates the block, itallocates extra bytes to hold an integer containing the size of the block. This integer islocated at the beginning of the block; the address actually returned to the callerpoints to the location just past this length value, as shown in Figure 7-1.

        When a block is placed on the (doubly linked) free list,free()uses the bytes of theblock itself in order to add the block to the list, as shown in Figure 7-2.

        As blocks are deallocated and reallocated over time, the blocks of the free list willbecome intermingled with blocks of allocated, in-use memory, as shown in Figure 7-3.

        Now consider the fact that C allows us to create pointers to any location in theheap, and modify the locations they point to, including the length,previous free block,and next free block pointers maintained by free() and malloc(). Add this to the precedingdescription, and we have a fairly combustible mix when it comes to creatingobscure programming bugs. For example, if, via a misdirected pointer, we accidentallyincrease one of the length values preceding an allocated block of memory, andsubsequently deallocate that block, then free()will record the wrong size block ofmemory on the free list. Subsequently, malloc() may reallocate this block, leading toa scenario where the program has pointers to two blocks of allocated memory thatit understands to be distinct, but which actually overlap. Numerous other picturesof what could go wrong can be drawn.         To avoid these types of errors, we should observe the following rules:> After we allocate a block of memory, we should be careful not to touch anybytes outside the range of that block. This could occur, for example, as a resultof faulty pointer arithmetic or off-by-one errors in loops updating the contents ofa block.> It is an error to free the same piece of allocated memory more than once. Withglibc on linux, we often get a segmentation violation (SIGSEGV signal). This isgood, because it alerts us that we’ve made a programming error. However,more generally, freeing the same memory twice leads to unpredictable behavior.> We should never call free() with a pointer value that wasn’t obtained by a call toone of the functions in the malloc package.> If we are writing a long-running program (e.g., a shell or a network daemonprocess) that repeatedly allocates memory for various purposes, then weshould ensure that we deallocate any memory after we have finished using it.Failure to do so means that the heap will steadily grow until we reach the limitsof available virtual memory, at which point further attempts to allocate memory fail. Such a condition is known as amemory leak.

Tools and libraries for malloc debugging

        Failure to observe the rules listed above can lead to the creation of bugs that areobscure and difficult to reproduce. The task of finding such bugs can be easedconsiderably by using the malloc debugging tools provided by glibc or one of a numberof malloc debugging libraries that are designed for this purpose.

        Among the malloc debugging tools provided by glibc are the following:

> The mtrace() and muntrace() functions allow a program to turn tracing of memoryallocation calls on and off. These functions are used in conjunction withthe MALLOC_TRACE environment variable, which should be defined to contain thename of a file to which tracing information should be written. When mtrace() iscalled, it checks to see whether this file is defined and can be opened for writing; if so,then all calls to functions in the malloc package are traced andrecorded in the file. Since the resulting file is not easily human-readable, ascript—also called mtrace—is provided to analyze the file and produce a readablesummary. For security reasons, calls to mtrace()are ignored by set-user-ID andset-group-ID programs.

> The mcheck() and mprobe() functions allow a program to perform consistencychecks on blocks of allocated memory; for example, catching errors such asattempting to write to a location past the end of a block of allocated memory.These functions provide functionality that somewhat overlaps with the mallocdebugging libraries described below. Programs that employ these functionsmust be linked with the mcheck library using the cc -lmcheck option.

> The MALLOC_CHECK_ environment variable (note the trailing underscore) serves asimilar purpose to mcheck() and mprobe(). (One notable difference between thetwo techniques is that using MALLOC_CHECK_ doesn’t require modification andrecompilation of the program.) By setting this variable to different integer values,we can control how a program responds to memory allocation errors. Possiblesettings are: 0, meaning ignore errors; 1, meaning print diagnostic errors onstderr; and 2, meaning call abort() to terminate the program. Not all memoryallocation and deallocation errors are detected via the use of MALLOC_CHECK_; itfinds just the common ones. However, this technique is fast, easy to use, andhas low run-time overhead compared with the use of malloc debugging libraries.For security reasons, the setting of MALLOC_CHECK_ is ignored by set-user-ID andset-group-ID programs.

        Further information about all of the above features can be found in the glibc manual.

        A malloc debugging library offers the same API as the standard malloc package,but does extra work to catch memory allocation bugs. In order to use such alibrary, we link our application against that library instead of the malloc package inthe standard C library. Because these libraries typically Operate at the cost of slowerrun-time operation, increased memory consumption, or both, we should use themonly for debugging purposes, and then return to linking with the standard mallocpackage for the production version of an application. Among such libraries areElectric Fence (http://www.perens.com/FreeSoftware/),dmalloc(http://dmalloc.com/),Valgrind (http://valgrind.org/), andInsure++(http://www.parasoft.com/).

        Both Valgrind and Insure++ are capable of detecting many other kinds of bugsaside from those associated with heap allocation. See their respective web sitesfor details.

Controlling and monitoring the malloc package

        The glibc manual describes a range of nonstandard functions that can be used tomonitor and control the allocation of memory by functions in the malloc package,including the following:

> The mallopt() function modifies various parameters that control the algorithmused by malloc(). For example, one such parameter specifies the minimumamount of releasable space that must exist at the end of the free list beforesbrk() is used to shrink the heap. Another parameter specifies an upper limitfor the size of blocks that will be allocated from the heap; blocks larger thanthis are allocated using the mmap() system call (refer to Section 49.7).

> The mallinfo() function returns a structure containing various statistics aboutthe memory allocated by malloc().

        Many UNIX implementations provide versions of mallopt() and mallinfo().However, the interfaces offered by these functions vary across implementations, so theyare not portable.


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩国产精品专区| 欧美人在线视频| 一道本无吗dⅴd在线播放一区| 欧美成人精品在线视频| 欧美又大粗又爽又黄大片视频| 久久偷看各类女兵18女厕嘘嘘| 日韩乱码在线视频| 亚洲欧美国产一本综合首页| 久久亚洲精品小早川怜子66| 亚洲视频777| 欧美日韩亚洲成人| 91久久久久久久一区二区| 黄色一区二区在线观看| 亚洲a在线观看| 日韩精品视频免费专区在线播放| 久久久久999| 精品久久久久久亚洲精品| 久操成人在线视频| 中文字幕日韩有码| 久久精品亚洲国产| 在线视频日韩精品| 一区二区欧美日韩视频| 精品国产福利在线| 亚洲v日韩v综合v精品v| 久久国产精品久久久久久| 色哟哟入口国产精品| 日韩激情视频在线| 91av在线精品| 成人午夜高潮视频| 国产综合在线观看视频| 亚洲片国产一区一级在线观看| 91久久国产婷婷一区二区| 精品国产91久久久| 欧美国产在线视频| 国产欧美最新羞羞视频在线观看| 久久综合亚洲社区| 一区二区三区视频在线| 欧美精品videos另类日本| 久久精品国产视频| 久久精品欧美视频| 91精品视频观看| 少妇高潮久久久久久潘金莲| 日韩av电影手机在线观看| 中文字幕日韩综合av| 国产精品天天狠天天看| 欧美一级大片视频| 伊人成人开心激情综合网| 日韩黄色av网站| 欧美中文在线观看| 国产美女久久精品香蕉69| 精品成人69xx.xyz| 久久久久久久成人| 国产人妖伪娘一区91| 最近2019年日本中文免费字幕| 欧美电影在线观看完整版| 亚洲精品有码在线| 亚洲全黄一级网站| 91久久精品日日躁夜夜躁国产| 久久久99免费视频| 亚洲天堂av高清| 久久天堂av综合合色| 日韩在线视频观看正片免费网站| 成年无码av片在线| 日韩av免费一区| 久久99久久99精品免观看粉嫩| 国产精品极品美女在线观看免费| 欧美与黑人午夜性猛交久久久| 91po在线观看91精品国产性色| 性欧美激情精品| 久久久久国产精品www| 久久久人成影片一区二区三区观看| 日本精品在线视频| 久久精品色欧美aⅴ一区二区| 久久精品久久久久久| 91久久在线视频| 亲爱的老师9免费观看全集电视剧| 亚洲综合中文字幕在线| 日韩精品亚洲精品| xvideos成人免费中文版| 92国产精品视频| 色午夜这里只有精品| 欧美综合一区第一页| 国产精品99一区| 国产91成人video| 国产精品色午夜在线观看| 亚洲人成网站色ww在线| 成人午夜高潮视频| 欧美成人网在线| 亚洲精品欧美极品| 欧美国产日韩中文字幕在线| 国产精品综合网站| 精品露脸国产偷人在视频| 亚洲精品久久久久| 国模极品一区二区三区| 欧美男插女视频| 在线观看日韩欧美| 国产精品成人av在线| 日韩欧美高清在线视频| 国产美女被下药99| 久久露脸国产精品| 久久99精品国产99久久6尤物| 91成人在线播放| 日韩精品久久久久久福利| 亚洲乱码一区二区| 中文字幕亚洲欧美一区二区三区| 91久久久久久久一区二区| 亚洲情综合五月天| 97视频在线观看亚洲| 亚洲春色另类小说| 日av在线播放中文不卡| 日韩中文字幕在线观看| 精品高清一区二区三区| 亚洲乱码国产乱码精品精| 国产97在线播放| 91在线视频成人| 欧美黑人狂野猛交老妇| 日韩欧美a级成人黄色| 欧美丝袜第一区| 亚洲高清免费观看高清完整版| 亚洲性线免费观看视频成熟| 亚洲a级在线播放观看| 亚洲一区二区免费| 国产精品草莓在线免费观看| 亚洲人成啪啪网站| 亚洲r级在线观看| 国产精品久久久久999| 久久久久久中文| 欧美精品制服第一页| 久久精品视频99| 欧美性videos高清精品| 欧美另类极品videosbest最新版本| 久久久伊人日本| 日韩在线一区二区三区免费视频| 亚洲人午夜精品免费| 欧美电影免费观看电视剧大全| 精品在线观看国产| 亚洲网站在线看| 久久天天躁狠狠躁老女人| 欧美日韩午夜视频在线观看| 51视频国产精品一区二区| 亚洲精品www久久久久久广东| 8x海外华人永久免费日韩内陆视频| 久久精品视频播放| 91热精品视频| 日韩中文字幕在线视频| 久久精品2019中文字幕| 国产午夜精品一区理论片飘花| 久热精品视频在线观看一区| 日韩成人xxxx| 91伊人影院在线播放| 亚洲成在人线av| 国产成人福利视频| 久久全国免费视频| 亚洲图片在线综合| 欧美精品在线视频观看| 亚洲二区中文字幕| 久久天天躁狠狠躁夜夜躁| 91精品91久久久久久| 日韩在线一区二区三区免费视频| 日韩高清电影免费观看完整版| 欧美大片在线免费观看| 中文字幕日本欧美| 久久视频在线观看免费| 91国产精品91|