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

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

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

2019-11-14 09:50:52
字體:
來源:轉載
供稿:網友
        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
91久久在线观看| 日韩在线视频网站| 欧美激情精品久久久久久| 亚洲激情在线观看| 欧美成人一区二区三区电影| 91精品国产91久久| 在线播放日韩精品| 2020久久国产精品| 亚洲精品国产综合区久久久久久久| 久久久久久久爱| 欧美性生活大片免费观看网址| 久久深夜福利免费观看| 欧美成人性色生活仑片| 亚洲专区国产精品| 国产精品私拍pans大尺度在线| 亚洲第一在线视频| 在线日韩欧美视频| 国产97在线播放| 国产精品国产三级国产专播精品人| 欧美亚洲在线观看| 久久精视频免费在线久久完整在线看| 国产精品福利小视频| 国产精品久久久久久久av大片| 久久久免费精品视频| 日韩三级成人av网| 亚洲色在线视频| 色中色综合影院手机版在线观看| 91精品久久久久久久久中文字幕| 精品久久久久久亚洲精品| 国产精品电影一区| 狠狠色香婷婷久久亚洲精品| 精品成人久久av| 亚洲日本中文字幕免费在线不卡| 欧美激情精品久久久| 狠狠色香婷婷久久亚洲精品| 日本午夜人人精品| 久久99亚洲精品| 久久久久久久久久久免费| 欧美一区二区三区免费观看| 欧美限制级电影在线观看| 欧美激情视频网址| 久久黄色av网站| 欧美洲成人男女午夜视频| 国外成人在线直播| 精品人伦一区二区三区蜜桃免费| 欧美另类在线播放| 九九九久久久久久| 国产情人节一区| 亚洲综合在线小说| 欧美中文字幕在线观看| 欧美尺度大的性做爰视频| 国产精品久久久久免费a∨大胸| 色悠悠久久88| 国产精品国产三级国产aⅴ浪潮| 国产精品欧美日韩一区二区| 国产精品6699| 国产在线拍偷自揄拍精品| 欧美xxxx14xxxxx性爽| 亚洲精品久久久久久久久久久久| 欧美精品亚州精品| 免费不卡在线观看av| 欧美性猛交xxxx免费看久久久| 欧美成人精品一区二区| 亚洲人a成www在线影院| 日韩电影视频免费| 俺也去精品视频在线观看| 国产精品美女久久久久久免费| 日本一区二区三区四区视频| 久久久91精品国产一区不卡| 日韩电视剧免费观看网站| 91久久精品美女| 精品夜色国产国偷在线| 欧美中文在线视频| 欧美日韩在线免费观看| 国产精品久久久久9999| 成人有码视频在线播放| 欧美性生活大片免费观看网址| 不卡伊人av在线播放| 精品电影在线观看| 欧美日韩精品在线观看| 一本色道久久88综合亚洲精品ⅰ| 最近免费中文字幕视频2019| 日韩av电影国产| 欧美精品在线免费| 日本sm极度另类视频| 欧美在线视频一区| 欧美激情成人在线视频| 日韩中文视频免费在线观看| 亚洲最大福利视频网| 欧美又大又粗又长| 亚洲人成网站免费播放| 亚洲天堂av在线免费观看| 日韩在线精品视频| 国产精品专区h在线观看| 欧美久久久精品| 成人深夜直播免费观看| 午夜欧美大片免费观看| 成人日韩在线电影| 亚洲少妇激情视频| 久久免费少妇高潮久久精品99| 久久国产加勒比精品无码| 日韩福利伦理影院免费| 日韩av综合中文字幕| 欧美电影在线免费观看网站| 久热精品视频在线免费观看| 精品女厕一区二区三区| 777777777亚洲妇女| 黄网动漫久久久| 亚洲成年人影院在线| 懂色av影视一区二区三区| 在线看欧美日韩| 欧美另类69精品久久久久9999| 国产一区视频在线| 亚洲一区久久久| 岛国精品视频在线播放| 亚洲天堂久久av| 日韩av三级在线观看| 久精品免费视频| 国产精品pans私拍| 欧美成人免费大片| 久久久亚洲天堂| 亚洲国产成人精品一区二区| 91国内精品久久| 国产性猛交xxxx免费看久久| 欧美大尺度激情区在线播放| 美日韩在线视频| 一区二区亚洲精品国产| 久久影院中文字幕| 亚洲欧洲日韩国产| 亚洲精品国产精品久久清纯直播| 亚洲加勒比久久88色综合| 国产97人人超碰caoprom| 国产精品久久久久秋霞鲁丝| 色婷婷亚洲mv天堂mv在影片| 欧美影院成年免费版| 精品国产自在精品国产浪潮| 中文字幕成人精品久久不卡| 国产欧美日韩免费看aⅴ视频| 欧美乱大交做爰xxxⅹ性3| 浅井舞香一区二区| 日韩欧美中文免费| 欧美日韩视频在线| 91久久夜色精品国产网站| 亚洲欧美色图片| 成人免费xxxxx在线观看| 亚洲成人av在线| 中文字幕在线看视频国产欧美在线看完整| 亚洲欧美日韩精品久久| 国产不卡av在线免费观看| 亚洲精品影视在线观看| 亚洲一区二区三区久久| 欧美老女人xx| 精品视频9999| 亚洲激情免费观看| 国产精品白嫩美女在线观看| 国语自产偷拍精品视频偷| 91精品久久久久久久久| 日韩av网站导航| 欧美大全免费观看电视剧大泉洋| 国产精品久久97| 亚洲人成在线播放| 日韩中文字幕网| 成人福利网站在线观看| 久久久久久久国产|