LinuxSir.cn,穿越时空的Linuxsir!

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

shell能否实现多线程编程?

 关闭 [复制链接]
发表于 2004-4-6 19:33:39 | 显示全部楼层
呵呵,辩论好激烈~,我认为,shell不具备"职业"编程语言(像C,JAVA等)处理线程的能力!,毕竟,shell就是shell~~~而已!
发表于 2004-4-6 20:23:07 | 显示全部楼层
我要声明很重要的前提:我们谈的是shell操作,而不是程序。

我想你误解我的意思了,我说的系统调用当然不指trap,而是把上面的handler设置为系统调用,有何疑义吗?

不对,trap不能进行系统调用。从来就没有直接的系统调用,最根本的是"命令"。Shell的最小单位正是命令,而不是内核API!

难道真的没有吗?举个简单类似的例子,比如我们在浏览网页的时候,网页上除了基本的html文本外还有大量的比如图象,视频文件。那么我们打开网页的时候,并不时让网页从上而下显示,而是将文本与其他媒体(这里是图象和视频)分几个线程同时下载,所以我们往往看到文本先显示,但当所有的东西都显示完后,浏览器状态才显示100%,即标志此进程已完成。不知道此例有无不妥,有请指出。

没错,这是多线程。但这是程序(命令)本身的功能。如果命令给了一个线程控制接口,那么通过shell当然也可以管理线程,比如说proz下载工具的线程选项。shell本身不能管理线程。
你所说的过于片面,线程是进程的内部实例,这句话很大程度上是错误的。在多线程OS中,进程只作为系统资源分配的单位,给线程提供资源而已,并不是一个可执行的实体,而真正的可执行实体却是线程。你说的“人工干预”不知为何意?难道人没办法控制线程吗?难道线程的控制真的就那么的困难吗?那么请看下面的线程控制的实例:

  1. #include <pthread.h>
  2. #include <stdio.h>

  3. int sum;
  4. void *runner(void *param);

  5. main(int argc,char *argv[])
  6. {
  7.   pthread_t tid;
  8.   pthread_attr_t attr;
  9.   if(argc !=2){
  10.    fprintf(stderr,"usage:a.out<integer value>\n");
  11.    eixt();
  12.   }
  13.   if(atoi(argv[1])<0){
  14.    fprintf(stderr,"%d must be <=0\n",atoi(argv[1]));
  15.    exit();
  16.   }
  17. pthread_attr_init(&attr);
  18. pthread_create(&tid,&attr,runner,argv[1]);
  19. pthread_join(tid,NULL);
  20. printf("sum=%d\n",sum);
  21. }

  22. void *runner(void *param);
  23. {
  24.  int i;
  25.  sum=0;
  26.  if (upper>0){
  27.     for(i=1;i<=upper;i++)
  28.       sum+=i;
  29.   }
  30. pthread_exit(0);
  31. }
复制代码

以上程序轻松的实现了线程的创建、以及执行、退出。为何不能?

注意哦,还是那句话,线程的维护是高级语言如C的责任,进一步说,这例子更体现了线程受制于程序(进程)本身。我们不能用脚本来实现这点,因为脚本只是"粘合剂"。

Unix并无多线程机制!
#####以下引用王波--<<FreeBSD使用大全>>#####
在Unix中,是使用的进程概念来区分不同的独立计算任务,进程具有独立的上下文空间、独立数据空间等等特性,这样进程就可以很容易的独立执行,内核就可以根据优先级在进程之间进行切换,因此进程也就是最基本的内核调度实体。但是,由于计算任务的复杂性,很多任务需要使用多个进程完成,而且这些进程之间需要交换数据。为了解决这个问题,Unix中又设计了多种进程间的通信方式,称为IPC,例如管道、共享内存、套接字等等,这些内容本身就可以独立使用一本专门的书籍来描述了。

因此对于一些比较复杂的程序,就形成了一个怪圈,为了隔离计算任务,设计了进程的概念,为了进程之间能够共享数据,又设计了多种IPC通信方式。因此,人们就希望能设计一种能够独立执行,但没有独立数据空间的轻量级进程的概念,这就是线程。

明显的,线程对于复杂系统来讲非常有意义,因为不再需要复杂的IPC通信方式维护进程之间的数据交换,同时多个线程也可以独立、并行的执行。目前,很多数据库系统、Java应用程序都需要线程支持。但是由于Unix系统本身并不存在线程这个概念,那么在Unix下引入线程就有两种比较直接的方式。

第一种方式是不在内核中实现线程,而在用户程序本身中实现线程,这实际是对线程的一种模拟,线程之间的切换和调度是在用户的进程内部进行的,这种方式就被称为用户空间的线程。这种线程的好处是实现非常简单,而且性能也非常好,因为线程之间的切换都在用户进程内部进行,切换开销比较小。FreeBSD下缺省就使用这种线程模式。

它的缺点也很明显,首先就是不能充分利用高端服务器系统的SMP多处理器的优点,因为一个进程只能由一个处理器处理,第二点由于用户空间线程是在用户空间切换,某个线程遇到一个需要阻塞的系统调用而就会造成整个进程被阻塞,因而其他线程也被阻塞,这中情况实际在线程的概念中是不允许的,但实际实现中很难被百分之百避免。

第二种实现方式是通过修改进程的实现方式来完成,可以使用不完全的进程创建方式创建共享数据空间的进程,在Linux下这种系统调用为clone(),而在FreeBSD下它为rfork()。这种方式是Linux的基本线程处理方式,FreeBSD下可以使用linuxthread的兼容库来实现这种线程。
#####引用结束!

我从来没有说过UNIX没有多线程,我只是说它还远远不完善。

严格来说,Linux也没有真正的多线程
Linux的线程实现无非就是通过fork()或者clone()系统调用来实现的。fork()的仅仅是实现进程的复制,把父进程中的所有数据结构复制到新进程中而已,并没有产生线程!clone()也只不过实现了进程的复制而已,但它复制的新进程(即我们认为的线程)中的数据区只是一个指向父进程中数据区的指针而已!所以在Linux下实际上就没有线程的概念!真正实现线程的是WinNT/2000或者Solaris这些!它们本身就是以线程为基础进行任务调度的,性能较好比较正常。SUN Solaris的线程实现则提供了另一个很好的参考平台,在Solaris中,事实上是混用了用户空间的线程和进程基础的线程的,使用多个进程运行更多的线程,因此可以综合利用多处理器的优点和在进程内部切换线程的优点。

没错,正是不完善的见证。
发表于 2004-4-6 21:55:17 | 显示全部楼层
最初由 Freebird 发表
>>关于 trap能不能进行系统调用,建议版主看看人民邮电出版社那本《精通Shell编程》,里面明确提出trap可以调用系统调用!

>>关于线程是否受制于程序(确切说是进程),请版主明白内核级线程,内核可直接操纵进程,无须通过线程所属的进程。

>>你的理解还是出了问题,Unix没有线程!而不是不完善!请看上面我的引用段。

>>实际上Linux里面根本无进程及线程的概念,唯一强调的是“任务”,至于你所的命令,不能和这些term相提并论,关于这点,请翻开<Operating System Concepts>sixth edition.

我声明,我并非计算机专业人士,但我的所述若有错误,您可大胆指正,最好也可以找点有说服力的材料。关于这个问题,讨论太久。呵呵...

我再次重申一点,我们现在讨论的是shell本身,而不是内核或者程序。

1.关于trap命令(注意,是bash提供的trap命令,而不是trap内核函数),我还是坚持己见。trap调用的最小单位是命令。
如果斑竹说能调用系统调用,大可举个例子看看。我认为你说的trap与我说的trap可能不是同一物。
2.内核当然可以直接操纵线程,那是程序的问题,不是shell的问题。
3.Unix, Linux有线程概念,难道斑竹不知道lfs里的glibc-cvs就有一个POSIX线程库吗?它帮助内核实现了线程。
发表于 2004-4-6 22:09:54 | 显示全部楼层
线程和进程之讨论就到这里吧~~~,OK?
 楼主| 发表于 2004-4-7 17:06:32 | 显示全部楼层
Please delete all my posts.No value for others ,I think.And I gained nothing form this endless and boring argument.After all,here is a place ONLY for the shell issuses.Most of all,I don't want anyone else to know my thought of a layman,beacase I dont't think what I said were mature.
Further more,the manners that home_kings's answer of questions is not acceptable,I think.It looks like a chicanery ,more or less.
I am sorry,I don't mean to offend anyone.If I had,I will say sorry to him.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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