c********e 发帖数: 383 | 1 of course, whats "better" is its "ALL" open source.
unlike windows API when u call waitformultipleobject you have to consult
msdn for detailed behavior description, on linux u can go ahead to
read source code of select to figure everything out by urself.
there are all kinds of libs flying around (maybe be a problem) depending
on what you want to do.
Those APIs are also layered persay, for example, u have malloc in glibc
for user lvl programming and u have kmalloc for kernel coding.
If its GUI re |
|
m*********e 发帖数: 37 | 2 Thanks! I did bt under g++3.2, it said something wrong with concat_list();
I am testing under g++ 4.0.2. The cause it tells now is because in "="
function, I delete the ptr twice.(I don't understand why it happened!)
********************************
void IntList::operator=(IntList newList)
{
IntItem *nptr;
IntItem *ptr = list;
while (ptr)
{
nptr = ptr->nxt;
delete(ptr); //glibc detected here...
ptr = nptr;
}
|
|
a*****i 发帖数: 4391 | 3 【 以下文字转载自 Linux 讨论区 】
发信人: ayanami (螃蟹@FROSTSHOCK PWNS YOU!!11!), 信区: Linux
标 题: 问一个cross compilation的问题
发信站: BBS 未名空间站 (Tue Feb 13 15:22:22 2007), 转信
I would get this error message:
/opt/crosstool/powerpc-405-linux-gnu/gcc-3.4.4-glibc-2.3.5/lib/gcc/
powerpc-405-linux-gnu/3.4.4/../../../../include/c++/3.4.4/cstdlib:103:
error: `::malloc' has not been declared
Anyone has clue of how to fix this?? |
|
X****r 发帖数: 3557 | 4 这种面试问题首先要明白他想问你什么。要是他就想问你自己怎么实现内存管理,那你
就不要怕麻烦,反正也就是动动嘴皮子而已。
要说你的方法,其实也是不错的,除了其实不需要这个全局的映射之外。
你直接把返回地址和实际地址之间的偏移量存到返回地址前一个字节就行了。
你还可以指出如果是实际的问题的话基本上不用自己实现。
比如glibc里有memalign和posix_memalign |
|
X****r 发帖数: 3557 | 5 一般不在缺省安装里。你自己去下一个glibc的源代码就行了。 |
|
w******g 发帖数: 67 | 6 I am working on transfer a MPI program from my laptop to one computing
cluster("Docker"). The system specifications are as following:
my laptop
Dell d810 Intel CPU
GCC 4.1.2
"Docker" cluster:
10 nodes , each node runs with 2 AMD64 processors and CentOS4.4
Linux system.
GCC 3.4.6
The problem is that I can compile the program successfully on the cluster.
But when running, it crashes with error(it crashes when I run it on one
processor)
*** glibc detected *** malloc(): memory corruption: 0x00000000 |
|
f******n 发帖数: 90 | 7 这是glibc 2.6 的实现.
/* Find the first occurrence in S of any character in ACCEPT. */
char *
strpbrk (s, accept)
const char *s;
const char *accept;
{
while (*s != '\0')
{
const char *a = accept; // *** my comment: unnecessary! ???
while (*a != '\0')
if (*a++ == *s)
return (char *) s;
++s;
}
return NULL;
}
I don't understand why there is an extra temp variable "a" defined at ***.
Why don't we just use accept? Anyway, changes made to accep |
|
t****t 发帖数: 6806 | 8 actually, glibc default behaviour is to allocate large chunk separately by
mmap. |
|
b***y 发帖数: 2799 | 9 ☆─────────────────────────────────────☆
chaomian (超大碗牛肉面) 于 (Wed Jul 9 23:19:28 2008) 提到:
条件是不许用指针来遍历...
面试官是一个印度阿三
还问我Patricia tree..., 没搞过, 郁闷
☆─────────────────────────────────────☆
repast (xebec) 于 (Wed Jul 9 23:27:17 2008) 提到:
call 某个 function, 这个 function 替你遍历也行吧?
☆─────────────────────────────────────☆
Tevez99 (野兽99) 于 (Wed Jul 9 23:34:52 2008) 提到:
strlen???
☆─────────────────────────────────────☆
Tevez99 (野兽99) 于 (Wed Jul 9 23:36:02 2008) 提到:
glibc那个strlen用汇编实现的s |
|
b***y 发帖数: 2799 | 10 ☆─────────────────────────────────────☆
pstwo (孤独的星) 于 (Thu Sep 22 23:34:25 2005) 提到:
I am looking for sqrt() and exp() implementation detail in GCC.
I have searched too many files but I didn't find anything.
I know that sqrt() is built-in and exp() should be a library
function.
Where can I find them ? Please help !
☆─────────────────────────────────────☆
microbe (纵使相逢应不识) 于 (Thu Sep 22 23:53:09 2005) 提到:
You need glibc source, not gcc.
☆─────────────────────────────────────☆
thrus |
|
I*******e 发帖数: 1879 | 11 ☆─────────────────────────────────────☆
gandjmitbbs (Nothing) 于 (Wed Jan 21 14:36:51 2009) 提到:
#include
#include
#include
int main(int argc, char* argv[]) {
char* str = "hello";
char* str1 = new char [strlen(str)+1];
strcpy(str1, str);
char* str2 = str1;
printf("str1: %s, str2: %s\n", str1, str2);
delete [] str1;
delete [] str2;
}
RH3上,输出结果,退出,一切正常。
RH4上:
str1: hello, str2: hello
*** glibc detected *** double free or corruption (fastt |
|
r*********r 发帖数: 3195 | 12 it's always very difficult to upgrade the compiler, even on linux,
since the newer glibc usually breaks the whole system.
apple modified a lot of the linker, since it uses Mach-O format,
instead of ELF. so it's even harder. |
|
j***y 发帖数: 2074 | 13 C里面是没有bool这个类型的,直到C99出现之后。
我发现系统中有stdbool.h这个header,但是gnu c library里面没有:
---
qxu@gso-linuxcom-01(pts/49):~/opensrc/glibc-2.11[120]> locate stdbool.h
/usr/lib/gcc-lib/i386-redhat-linux/3.2.3/include/stdbool.h
/usr/lib/gcc-lib/i386-redhat-linux7/2.96/include/stdbool.h
/lib/ssa/gcc-lib/i386-redhat-linux-gnu/3.5-tree-ssa/include/stdbool.h
/export/WindRiver/3.0/bellona/0.02/toolchain/x86-linux2/lib/gcc/powerpc-wrs-
linux-gnu/4.3.2/include/stdbool.h
/export/WindRiver/3.0/bellona/0.02/toolchain/x86-lin |
|
|
t****t 发帖数: 6806 | 15 what prevents you from peeking at glibc source?
you don't have to copy it, you can just check what you have missed and/or
what dumb thing you have done.
and why do you care io buffering? for sprintf, you are printing to string. |
|
t****t 发帖数: 6806 | 16 grab the glibc source and read the function then...
x86_ |
|
t****t 发帖数: 6806 | 17 yumdownloader --source glibc
rpm -i ....
是装在/root下面的
Fedora
5. |
|
F*******i 发帖数: 190 | 18 Dxia,
I downloaded a glic from gnu and compiled it successfully.
then I change the LD_LIBRARY_PATH to include this new lib in
the .bashrc,
then i login a new shell and issue the command ls, it shows:
/bin/ls: error while loading shared libraries: MYNEWGLIBCLIB/lib/libc.so.6:
ELF file OS ABI invalid
any insights is really appreciated! |
|
e****d 发帖数: 895 | 19 Incompatible ABI between the old lib and the new lib? |
|
X****r 发帖数: 3557 | 20 version of glibc
GCC
array |
|
|
m*****e 发帖数: 4193 | 22
This. glibc uses mmap for anything bigger than about 128KB, which can be
easily returned to the OS once freed.
Smaller memory allocations come from the heap and generally cannot be
returned. |
|
a*****a 发帖数: 1429 | 23 不用框架你开发个什么啊。
就算你是开发产品,而不是应用。如果是界面相关的,在Windows上你要用MFC或者类似
的东西,在Linux上你要用Xlib/Xt以及现在流行的Qt, GTK;在Mac OSX上你要用Cocoa.
你不开发界面,开发更底层的,你不还得用框架,你不用glibc或者WinAPI,你连个
fopen/malloc都没有。
你说你牛叉,在开发崭新的操作系统。可操作系统就是内存管理,进程管理和资源管理
。这么多杂七杂八的,你不得先搭起个框架Framework?
盖个厕所你也得先搭个Framework,再码砖不是?
你做过开发? |
|
r*********r 发帖数: 3195 | 24 glibc 都能称为框架啊。第一次听说。
Cocoa. |
|
t****t 发帖数: 6806 | 25 vsize or rss doesn't reflect how much memory is allocated but not malloc()'
ed. again, it is impossible for OS has any idea on how much memory you
malloc()'ed. if anyone knows, it must be glibc. it's useless to look into /
proc. |
|
d****n 发帖数: 1637 | 26 char *p="abc"; 在代码段,immutable.
any write operation will cause segfault.
char a[]="abc"; stack, read/write okay
#include
#include
int main(){
char *p="abc";
printf("%p\n",p );
*(p+1)='w'; //segfault
free(p); //segfault or
glibc fault
p =(char *) malloc (sizeof(char)*4) ; //okay, but previous "abc" lost
printf("%p\n",p );
char a[]="def";
printf("%p\t%s\n",a,a); ... 阅读全帖 |
|
d****n 发帖数: 1637 | 27 I agree. Glibc and linux source code 都是这么规范的。
但是情况不同,也不要刻舟求剑。
譬如,你有100million 个相同长度51个char。
你会考虑用那个方法呢?
100million个malloc?
还是保证知道最大长度情况下,用static var?
知道别人怎么用的是好的,但是你要考虑自己实际情况。 |
|
h**i 发帖数: 712 | 28 用户的stack overflow不会导致kernel oops,除非你用了上千thread,而且申请了过多
的虚拟内存,但是现在你只有32k。
gcc 有 -fstack-check 选项,可以测试stack overflow,或者用gdb和backtrace().
glibc 缺省在stack之间用一个保护页,函数 pthread_attr_setguardsize可以帮你调
试是不是stack miss the guard page. |
|
X****r 发帖数: 3557 | 29 因为对于任何str,printf("%s\n", str);等价于puts(str),所以gcc作了优化,
这里正好str是NULL。printf("%s", str);并不等价于puts(str),所以真正的
printf被调用了,而glibc里的printf是可以处理NULL的。
其实从第一贴开始我就在说这个,要是还不清楚的话我实在不知道该怎么讲了。 |
|
g***l 发帖数: 2753 | 30 从系统的角度是这样的,但是如果系统中有多个子系统需要很多次的频繁的malloc/
free的话,这个碎片化的问题还是要考虑的吧?还有个问题俺们的系统上没有glibc啊。 |
|
t****t 发帖数: 6806 | 31 不管是不是glibc, malloc/free总是从一块连续大内存池里拿的, 可能算法有好有坏,
但是通常来说不需要用户考虑这个.
如果你想说的是multiple heap, 那是另外一回事. 但是正常情况下一般人不需要这个.
如果是多线程, 那mutex的开销可能更大一些.
啊。 |
|
t****t 发帖数: 6806 | 32 你这里混淆了两个概念(在你bytes.com的link里有人已经提到了): 堆内存的分配/释放
, 即new/delete, 和进程内存的分配/释放, 即brk, 是两个不同的概念. 用ps/top看到
的是第二种, 但STL能控制的基本上是第一种.
先说STL的容器. clear当然不能保证释放, 但是析构函数一定会保证. 所以你如果不能
确定swap()能不能work, 不妨重新分配容器. 性能应该比swap高, 但是你反正是试一下
, 不用太担心.
再说OS. 在linux上, 缺省的glibc的分配模式是, 对于小内存块, 针对不同的尺寸, 有
不同的内存池. 对于大内存块, 是用mmap直接从系统要的. 对于内存池的delete, 就还
给内存池了, OS仍然看不到. 对于mmap的delete, 直接还给OS. 从一方面, 这可以解释
为什么vector是能"完全"释放, 因为vector的内存一定是连续的, 你开一个大vector肯
定是用mmap直接拿的, 删除之后就没了. 对于unordered_set, 内存不连续, 是渐渐分配
的, 很多删除之后还给内存池了, 所... 阅读全帖 |
|
y**b 发帖数: 10166 | 33 找到一篇谈内存碎片的:
http://blog.163.com/dengminwen@126/blog/static/8702267200971894
里面提到内存碎片的罪魁祸首并不是libstdc++的的STL,而是glibc的malloc。
把那个例子换成std::vector,然后new一个对象就插入一个,同样会产生内存碎片。
如果外面加个大循环,乖乖不得了,几下子就能崩溃。
但是如果只产生临时对象,将临时对象的拷贝一个一个插入vector,每次大循环之前
用clear清空vector,不会耗光内存。我的程序是这样。
但主要问题还是在于mpi本身的缓存:
unordered_set单进程计算反复循环,内存不增加;mpi并行计算反复循环,内存增加。
vector单进程计算反复循环,内存不增加;mpi并行计算反复循环,内存增加。 |
|
r**u 发帖数: 1567 | 34 多谢,这个C Runtime library是不是就相当于linux下的gcc的glibc?
我感觉windows的dll就相当于linux下的.so文件吧,linux下有我提到的这个内存分配
问题么?
correctly,
when |
|
L******3 发帖数: 18 | 35 有谁对glibc caching熟悉,来说说? |
|
n****1 发帖数: 1136 | 36 "Node.js是纯异步的",这就是你"纯异步"的定义么?
1. 什么纯阻塞/非阻塞IO之类的,根本就应该完全由nodejs封装好, 用户根本不需要知
道后端是怎么实现的. 换句话说, 0.11之前的nodejs没有同步api, 所以根本就是一陀,
倒被你捧成金子了
2. 难道就不能用node中的nonblocking IO 来实现cpython中与glibc相关的blocking
api么? 你忘了已经node nonblocking IO实现了yield么?
3. 为啥你非要把js和node划等号呢? js离开node就无法运行了? spidermonkey和v8都
有单独的命令行, 啥时候node成了js的唯一了
4. 再次纠正你以下, 有了yield后, Node.js不是"纯异步的", 只是"纯非阻塞IO". |
|
h**********c 发帖数: 4120 | 37 6的kernel有很老,做服务器用的
玩android换ubuntu,没法子
实在不行,centos虚拟机上ubuntu
我记得centos 死活找不到libstdc.so.6 |
|
S*A 发帖数: 7142 | 38 您老说的是 C++ 吧,和 LZ 问的 java 有点不一样了。
我对 Linux 内核的memory 管理还比较熟悉的,user space glibc
是如何搞就知道不多了。
Free 不是固定大小的 allocation 是如何几条指令处理的?
要和旁边的 area merge 吧,我自己觉得那个不太容易几个
指令搞定。如果是 alloc/free 固定大小的 allocation,
那个很容易几个指令搞定。
你 override 了 C++ 的 “new”?这个好想是很麻烦的事情,有些
时候一些lib free memory 的时候去调用系统的 free 而不是你自
己的那个 free 然后就悲剧了。我以前碰到过这种情况,非常恶心。
你是如何解决的? |
|
w***g 发帖数: 5958 | 39 有人遇到过这个问题吗?这事情搞了我整整两天,一直以为是内存泄漏。
结果发现是glibc的问题-- 这个thread释放的内存那个thread没法用。
这次大涨见识了。 |
|
w***g 发帖数: 5958 | 40 服务器需要长期运行,运行过程中动态加载新的模型。每个模型非常大(N多G)。
本来加载-释放-加载-释放...不应该导致内存增长。
问题是这些加载释放的请求被不同的线程响应了,glibc的行为导致
不同线程间空闲内存无法复用。理论上说每个线程都浪费一份模型大小
的内存才能保证malloc开始复用内存。然后我有好几十个线程。
于是就发现内存一直涨一直涨,一涨就是十好几G。看起来跟内存泄漏
非常像。 |
|
m********5 发帖数: 17667 | 41 这其实是一个非常难搞的东西
我知道很多项目最后都是自己针对应用优化的,不过除非是常年不变的东西,这么做其
实很不划算。有朋友还认为glibc远好于jemalloc呢。
说白了,你要针对life cycle和access pattern来选择malloc的实现方式。并不会自动
用哪种就一定性能高。
调参数是不可避免的,我现在是尽量少malloc, 但系统运行时间长了,碎片化之后不可
避免的性能低下。
http://locklessinc.com/benchmarks_allocator.shtml
tcmalloc |
|
m********5 发帖数: 17667 | 42 很遗憾没有不变应万变的方法
用我过时的知识来看,如果你的threads变化很大,似乎一般推荐tcmalloc, 如果
threads变化不大,一般推荐jemalloc. 如果大部分size很小,周期很短,用glibc.
当然我们可以想像一样,如果我们搞一个类似ATLAS的东西,可以自动调整和选择策略
,那也许针对大部分应用可以无脑上。你的系统在正常load下跑一段时间,专家系统+
genetic algorithm 自适应分配策略。
存, |
|
h**********c 发帖数: 4120 | 43 来自主题: Programming版 - 代码开源了 Asus laptop i7 4500U Centos 6/8G host
VM: Centos 7 4G, dev desktop installation,
yum update -y
yum install glibc-static
89 cd Release/
90 make all
91 ls
92 ls pc12306
93 ./pc12306
94 history
[et@localhost Release]$
...
start benchmark
Total time = 30.316479
POC of code sanity! |
|
j******a 发帖数: 100 | 44 不好意思,我以为你说glibc的allocate/free
他的那个是没做完,魏有讲过 |
|
x****u 发帖数: 44466 | 45 我觉得组件ABI对于Linux也同样重要啊,不应该动不动就build world,这个事情是
unix带来的坏传统,Linux当年glibc一升级简直山崩地裂的。
不必要的rebuild我看分两种,一种是不做省时间的,如开源工具,另一种是不可能做
的,如闭源商业软件,驱动或游戏 |
|
t****n 发帖数: 1347 | 46 Linux(glibc)中 SVR4 和 BSD 的差不多都有, 不过可能
SVR4更接近些. |
|
s******s 发帖数: 35 | 47 yes.
name a few
1. book by W. Richard Stevens in the 'Jing Hua Qu' in
chinese
2. www.gnu.org/manual glibc for linux programming but also
general in unix
3. some introductory docs in www.redhat.com |
|
c****u 发帖数: 6 | 48 Hi, fryingfish, what's your glibc version? |
|
|
j***y 发帖数: 2074 | 50 C里面是没有bool这个类型的,直到C99出现之后。
我发现系统中有stdbool.h这个header,但是gnu c library里面没有:
---
qxu@gso-linuxcom-01(pts/49):~/opensrc/glibc-2.11[120]> locate stdbool.h
/usr/lib/gcc-lib/i386-redhat-linux/3.2.3/include/stdbool.h
/usr/lib/gcc-lib/i386-redhat-linux7/2.96/include/stdbool.h
/lib/ssa/gcc-lib/i386-redhat-linux-gnu/3.5-tree-ssa/include/stdbool.h
/export/WindRiver/3.0/bellona/0.02/toolchain/x86-linux2/lib/gcc/powerpc-wrs-
linux-gnu/4.3.2/include/stdbool.h
/export/WindRiver/3.0/bellona/0.02/toolchain/x86-lin |
|