LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1673|回复: 16

Thread and Process

[复制链接]
发表于 2006-3-30 15:58:45 | 显示全部楼层 |阅读模式
[IMG]
http://www.llnl.gov/computing/tu ... s/images/thread.gif

[/IMG]
在这里thread成了最小的调度和执行单位,而process是资源配置单位
发表于 2006-3-30 23:49:46 | 显示全部楼层
难道还有别的说法?
回复 支持 反对

使用道具 举报

发表于 2006-3-31 00:37:28 | 显示全部楼层
呵呵,在没有线程之前不是这个样子
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-3-31 08:58:42 | 显示全部楼层
1:Thread1~n中的所有非初始化和初始化的数据都放到Process中的heap和data段中吗?
2:这里所有的Thread1~n共享stack,如果Thread1~n中又有function call那么这时如何安排空间的?
回复 支持 反对

使用道具 举报

发表于 2006-3-31 09:56:11 | 显示全部楼层
1.是的
2.不共享stack

补充一下
关于第一个,如果变量声明时用了__thread前缀,那就不是放在进程的data或bss段了
而是变成了thread local storage
比如现在的errno就是这样的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-4-2 18:27:11 | 显示全部楼层
2.不共享stack
是指Thread1~n不共享,还是Thread1~n中的function call不共享Stack?谢谢!
补充一下:
Thread1~N 当然不共享Stack,只是认为他们在Memory中的空间位置都叫做Stack,Thread1~n模块中遇到function call又去重新分配Stack,互不影响各自的执行路径。
回复 支持 反对

使用道具 举报

发表于 2006-4-2 22:49:29 | 显示全部楼层
Post by sybaselu
2.不共享stack
是指Thread1~n不共享,还是Thread1~n中的function call不共享Stack?谢谢!

随便找个汇编书分析一下函数调用的过程,就明白了
不同的执行路径怎么可能共享stack

还没有听说过将这两个一起比较的?
有什么区别么?
回复 支持 反对

使用道具 举报

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

  1. ...
  2. void put(struct prodcons * b, int data)
  3. {
  4.   pthread_mutex_lock(&b->lock);
  5.   
  6.   /* Wait until buffer is not full */
  7.   while ((b->writepos + 1) % BUFFER_SIZE == b->readpos) {
  8.     pthread_cond_wait(&b->notfull, &b->lock);
  9.     /* pthread_cond_wait reacquired b->lock before returning */
  10.   }
  11.   /* Write the data and advance write pointer */
  12.   b->buffer[b->writepos] = data;
  13.   b->writepos++;
  14.   if (b->writepos >= BUFFER_SIZE) b->writepos = 0;
  15.   /* Signal that the buffer is now not full */
  16.   pthread_cond_signal(&b->notempty);

  17.   pthread_mutex_unlock(&b->lock);
  18. }
  19. ...
  20. void * producer(void * data)
  21. {
  22.   ...
  23.   for (n = 0; n < 5; n++) {
  24.     printf("%d --->\n", n);
  25.     put(&buffer, n);
  26.   
  27.   ...
  28. }
  29. #
  30. 0 --->
  31. 1 --->
  32. 2 --->
  33. 3 --->
  34. 4 --->
  35. ---> 0
  36. ---> 1
  37. ---> 2
  38. ---> 3
  39. ---> 4

复制代码

还有一个是consumer的subroutine,两者一存一取(实际上这些东西都可以在书上看到), 但我还有一个地方没弄明白。为什么输出是顺序的呢? 我这样理解的:
1. 在外层作5次循环时的第一次时,put先拿到了mutex----->再拿到condition-------->做一次数据的写,写完后---------〉释放condition--------〉 释放mutex
2. 这一刻前get一直在等待mutex, 这一刻开始应该是put和get同时去抢mutex,而显示时为什么总是put得到mutex呢? 做完5次循环后get才得到mutex?
Thanks in advance
回复 支持 反对

使用道具 举报

发表于 2006-4-5 04:48:10 | 显示全部楼层
Post by sybaselu
1:Thread1~n中的所有非初始化和初始化的数据都放到Process中的heap和data段中吗?
Post by zhllg
1.是的

是什么啊是?按理说非初始化数据在bss里,用size命令可以看到text, data和bss的长度。
heap?不malloc没它什么事儿。
话又说回来,我是老头了,只写过进程,没写过线程,难道现在的内存空间布局改了?
回复 支持 反对

使用道具 举报

发表于 2006-4-5 08:12:38 | 显示全部楼层
heap/stack和data说的分别是动态和静态数据区,是操作系统里面的概念,与gcc产生的那些 .data .bss 之类无关。 如果要说由 gcc 产生那些 sections(段),那么数据还有可能是在 .rodata 或者其他的什么段
回复 支持 反对

使用道具 举报

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

本版积分规则

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