当内存用完时,以下程序将被内核杀死。 我想知道什么时候全局variables应该被分配给“ENOMEM”。 #define MEGABYTE 1024*1024 #define TRUE 1 int main(int argc, char *argv[]){ void *myblock = NULL; int count = 0; while(TRUE) { myblock = (void *) malloc(MEGABYTE); if (!myblock) break; memset(myblock,1, MEGABYTE); printf("Currently allocating %d MB\n",++count); } exit(0); }
我正在从Linux操作系统需要mmap文件,但我有一个问题,什么可以使它失败。 如果所有的记忆都是碎片的,每个记忆只有200M,但是我想把一个文件映射到1000M的记忆中,它会成功吗? 还有另外一个问题:在linux中是否有任何工具可以像Windows中的某些工具一样记忆内存,例如xp的内置工具。 感谢名单,
假设我们对大小为n的内存块做一个malloc请求,对于k> 0,其中2 ^ k!= n。 Malloc为这个请求的内存块返回空间,但是如何处理页面中的这个剩余缓冲区。 我读的页面通常是两个权力的内存块。 维基指出以下内容: Like any method of memory allocation, the heap will become fragmented; that is, there will be sections of used and unused memory in the allocated space on the heap. A good allocator will attempt to find an unused area of already allocated memory to use before resorting […]
char *ptr = (char*) malloc(40); printf("%u",ptr); 56737856 (some output) 现在,如果我没有错误,我们上面看到的输出不是物理地址,而是来自虚拟地址空间。 我对么? 有没有办法看到实际的物理地址? 反之亦然(如果我上面的假设是错误的),所有malloc的内部实现必然使用jemallocalgorithm?
Hi all, 我目前正在debugging设备驱动程序,我得到一个内核恐慌。 检查回溯或错误日志后,似乎问题是与kmalloc。 我想也许我可以用其他分配函数来改变kmalloc。 他们有什么不同? 这里是错误日志: Unable to handle kernel NULL pointer dereference at virtual address 0000000d pgd = c7bdc000 [0000000d] *pgd=4785f031, *pte=00000000, *ppte=00000000 Internal error: Oops: 17 [#1] PREEMPT Modules linked in: bcm5892_secdom_fw(P) bcm5892_lcd snd_bcm5892 msr bcm5892_sci bcm589x_ohci_p12 bcm5892_skeypad hx_decoder(P) pinnacle hx_memalloc(P) bcm_udc_dwc scsi_mod g_serial sd_mod usb_storage CPU: 0 Tainted: P (2.6.27.39-WR3.0.2ax_standard #1) […]
我需要从GCC for Linux编译的C程序中回答一个基本的问题:当前正在使用多less进程堆(由malloc分配)以及多余的空闲堆块。 标准库的GNU实现有mallinfo函数,它能够准确地报告我需要什么,但是它只能用于32位configuration,AFAIK没有这个function的64位等价物(顺便说一句,任何人都知道为什么?)。 我在Linux上使用GCC,所以我需要这个Linux。 但是我认为这个堆对系统是不透明的,所以回答这个问题的唯一方法就是使用标准库实现提供的方法。 在Windows平台上的MSVC实现中,没有等价的mallinfo函数,但是所谓的堆栈遍历 ( heap-walk)function允许通过遍历堆中的所有块来计算必要的信息。 AFAIK,GNU C库中没有堆行走界面。 (在那儿?)。 那么,我又在GCC做了什么? 它不一定要高效,这意味着前面提到的基于堆栈的方法对我来说工作得非常好。 我如何知道GCC中有多less堆正在使用以及有多less空闲? 我可以尝试安装malloc-hooks和“手动”跟踪大小,虽然我不知道如何在不使用mallinfo情况下确定当前的堆大小(请参阅mallinfo.arena )。
示例源代码: #include <stdio.h> #include <stdlib.h> #include <errno.h> #define GIGABYTE 1024*1024*1024 int main (void) { void *foo; int result; foo = (void *) malloc (GIGABYTE*5); result = errno; if (foo != NULL) { return 2; } else { fprintf (stderr, "ERROR: %d\n", result); return 1; } return 0; } 题: 如何指示gdb( # gdb -silent ./huge_malloc ) […]
考虑下面的C代码,它创build100,000个4KB大小的页面,然后释放99,999页,最后释放最后一页: #include <stdio.h> #include <stdlib.h> #define NUM_PAGES 100000 int main() { void *pages[NUM_PAGES]; int i; for(i=0; i<NUM_PAGES; i++) { pages[i] = malloc(4096); } printf("%d pages allocated.\n", NUM_PAGES); getchar(); for(i=0; i<NUM_PAGES-1; i++) { free(pages[i]); } printf("%d pages freed.\n", NUM_PAGES-1); getchar(); free(pages[NUM_PAGES-1]); printf("Last page freed.\n"); getchar(); return 0; } 如果你编译它,运行它并监视进程的内存使用情况,你可以看到内存使用量在第一个getchar之前(当内存分配给100,000页时)达到了400MB左右,那么即使在99,999页之后- 分配(在第二个getchar ),最后,当最后一个页面被解除分配时,最终下降到1MB。 所以,我的问题是为什么会发生这种情况? 为什么只有当所有页面被释放后,整个内存才会返回到操作系统? 有任何页面大小或任何页面alignment,防止这种事情发生? 我的意思是,是否有任何页面大小或alignment使任何mableced页面完全返回到操作系统时,只有一个页面被释放?
不pipe存储器1的现有内容如何,我都希望写入char *缓冲区的时间相同。 你不是吗? 然而,在缩小基准的不一致性的同时,我发现了一个显然不是真实的案例。 包含全零的缓冲区在性能上与用42填充的缓冲区有很大不同。 从graphics上看,这看起来像(详情如下): 这是我用来产生上述3的代码: #include <stdio.h> #include <stdlib.h> #include <inttypes.h> #include <string.h> #include <time.h> volatile char *sink; void process(char *buf, size_t len) { clock_t start = clock(); for (size_t i = 0; i < len; i += 678) buf[i] = 'z'; printf("Processing took %lu μs\n", 1000000UL * (clock() – start) / CLOCKS_PER_SEC); […]
可能重复: Malloc线程安全? 当我正在阅读“Linux编程接口”时,我并不困惑。 从书中说,malloc是不可重入的,因为它操纵全局链表数据结构,但是通过使用互斥锁使它成为线程安全的。 我有点困惑:因为它是线程安全的使用互斥体,因此可以同时调用多个线程,为什么它不是一个可重入函数? (如果我们说可重入是指它可以同时被多个调用者调用) 另一个问题是,因为malloc是线程安全的,我们可以把它放在一个信号处理程序? 我认为答案是肯定的,但我不确定,因为根据这本书,它说,只有一个可重入或asynchronous信号安全function可以放在信号处理程序。 任何人都可以向我解释这个?