LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: sybaselu

Thread and Process

[复制链接]
发表于 2006-4-5 14:18:26 | 显示全部楼层
Post by littlepig
是什么啊是?按理说非初始化数据在bss里,用size命令可以看到text, data和bss的长度。
heap?不malloc没它什么事儿。
话又说回来,我是老头了,只写过进程,没写过线程,难道现在的内存空间布局改了?


您教训的是
俺应该区分清楚
嘿嘿
回复 支持 反对

使用道具 举报

发表于 2006-4-5 15:00:29 | 显示全部楼层
Post by sybaselu

补充一下:
Thread1~N 当然不共享Stack,只是认为他们在Memory中的空间位置都叫做Stack,Thread1~n模块中遇到function call又去重新分配Stack,互不影响各自的执行路径。


线程在内存空间中的位置都叫stack
你是从哪里看到的?

进程里的所有线程的共享一个地址空间,CLONE_VM
在这个地址空间内,每个线程独有的是stack, thread local storge
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-4-5 19:01:15 | 显示全部楼层

  1. [root@root GUI]# cat main.c

  2. #include <stdio.h>

  3. int main(void)
  4. {
  5.     char* str="I love you honey";
  6.     void* voP = NULL;
  7.     voP = (char* )malloc(10*sizeof(char));
  8.     if (NULL==voP)
  9.     {
  10.         fprintf(stderr, "%s\n", "Failed");
  11.     }
  12.     else
  13.     {
  14.         fprintf(stderr, "%s\n", "Sucess");
  15.         strcpy(voP, str);
  16.         fprintf(stderr, "%s\n", voP);
  17.     }
  18.     free(voP);
  19.     voP = NULL;

  20.     return 0;
  21. }
  22.         
  23. [root@root GUI]#
  24. [root@root GUI]# gcc main.c -o main -g
  25. [root@root GUI]# ./main
  26. Sucess
  27. I love you honey
  28. [root@root GUI]#
  29. [root@root GUI]# size main
  30.    text    data     bss     dec     hex filename
  31.    1242     268       8    1518     5ee main
  32. [root@root GUI]#

复制代码

那能帮我解下一下这里的text/data/bss/dec的含义吗? 如果将:
voP=(char* )malloc(10*sizeof(char))换成voP=malloc(10*4) 有BUG吗?
回复 支持 反对

使用道具 举报

发表于 2006-4-5 19:43:34 | 显示全部楼层
呵呵,你算一算1242+268+8是不是等于1518 (记着下次看看man先)

"voP=(char* )malloc(10*sizeof(char))换成voP=malloc(10*4) 有BUG吗?"
那bug就大了,我就说一句:一个char只有一个字节
至于text,data和bss的含义,这就是一个c程序在内存中分布的问题:
text就是正文段(版主说的.rodata粗分的话也属于正文段),data段是存放所有的函数外的诸如:int i = 1;之类数据,这两个段都在程序文件中,bss段则是函数外的的诸如:int j; 这样的变量,程序被运行之前由内核初始化为0。 按照版主的动静态数据划分方式,我的理解是bss也属于静态数据,不知道对不对。
所有自动变量,和函数运行需要的信息(比如调用者的返回地址)存在stack中,heap是当你调用malloc系列库函数动态分配内存是使用的内存区域。这两个就属于动态区域,用时开辟,不用则释放,并且动态增减的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-4-6 15:52:35 | 显示全部楼层
呵呵,你算一算1242+268+8是不是等于1518 (记着下次看看man先)

1:呵呵,但我想知道的是text为什么等于1242(Byte?bit?)和其它的段。
2:现在正在公司读其他人写的CODE,但找不到一套标准的测试用例,主要是根据林锐博士的C/C++中的标准来看,所以在他们的CODE中发现大量的malloc()返回后没有强制转化;分配内存没有失败的判断和释放,带指针的函数没有做断言处理;指针赋值判断很随意;书写不规范等;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-4-7 09:37:51 | 显示全部楼层
在LinuxPthread中重新定义了singal(这在POSIX中不是标准),那singal和condition variable为什么不能代替呢,都是对share buffer是否能用(不是可用)的信号。
回复 支持 反对

使用道具 举报

发表于 2006-4-7 11:23:35 | 显示全部楼层
char *p
p=(char*)malloc(4*sizeof(char));
if(p==NULL)
    exit(0);
我一般是这样写的....
char在不同的平台有不同的大小.
bss全局数组,和全局指针变量都在者.......
text和data可以分离这样就可以share text,节约内存
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表