首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

创办线程变进程

2013-06-25 
创建线程变进程奇怪问题请教,创建线程变进程测试序如下:(1)创建2个线程,结果得到4个进程(2)PS结果(3)在arm

创建线程变进程
奇怪问题请教,创建线程变进程
测试序如下:

(1)创建2个线程,结果得到4个进程
(2)PS结果
(3)在arm开发板上出现,在PC机上完全正常
(4)是否与编译器有关,还是与内核核心有关


~ $ ps
  PID  Uid     VmSize Stat Command
    1 root        360 S   init       
    2 root            SW< [kthreadd]
    3 root            SW< [ksoftirqd/0]
    4 root            SW< [events/0]
    5 root            SW< [khelper]
   34 root            SW< [kblockd/0]
   37 root            SW< [cqueue/0]
   41 root            SW< [ata/0]
   42 root            SW< [ata_aux]
   50 root            SW< [khubd]
   53 root            SW< [kseriod]
   73 root            SW  [pdflush]
   74 root            SW  [pdflush]
   75 root            SW< [kswapd0]
   76 root            SW< [aio/0]
  163 root            SW< [mtdblockd]
  225 root        652 S < udevd --daemon 
  235 root            SW< [rpciod/0]
  264 root            SW< [hieth_skber]
  266 root            SWN [jffs2_gcd_mtd3]
  268 root            SWN [jffs2_gcd_mtd4]
  270 root            SWN [jffs2_gcd_mtd5]
  272 root            SWN [jffs2_gcd_mtd6]
  305 root            SW< [scsi_eh_0]
  308 root            SW< [scsi_eh_1]
  686 root        556 S   -sh 
  846 root            SW< [kjournald]
  849 root            SW< [kjournald]
  856 root            SW< [kjournald]
  859 root            SW< [kjournald]


 1320 root        228 S   telnetd 
 1330 root        456 S   -sh 
 1338 root        272 S   ./example 
 1339 root        272 S   ./example 
 1340 root        272 S   ./example 
 1341 root        272 S   ./example 
 1345 root        356 R   ps 



原代码如下:

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

void * pthread_func_test1(void * arg);
void * pthread_func_test2(void * arg);

int main()
{
    pthread_t pt1,pt2;
    pthread_create(&pt1,NULL,pthread_func_test1,"This is the Thread_ONE");
    pthread_create(&pt2,NULL,pthread_func_test2,"This is the Thread_TWO");
        printf("\npid:%d\n", getpid());
    pthread_join(pt1,NULL);
    pthread_join(pt2,NULL);        //这行不写,会发生什么?或写成pthread_join(pt1,NULL);又会怎么样?
}

void * pthread_func_test1(void * arg)
{
        while(1)
        {   
                printf("\n<1>%d",getpid());
                sleep(1);
        }   
        pthread_exit(NULL);            //显式声明
}
void * pthread_func_test2(void * arg)
{
        while(1)
        {   
                sleep(1);    
                printf("\n<2>%d",getpid());
        }    

        pthread_exit(NULL);            //显式声明
}

[解决办法]
是因为Linux下线程实质是进程的原因吧?
[解决办法]
是不是linux版本的原因啊?redhat上,内核版本2.6.18看到的只有一个进程。
另外只输入ps命令不带选项能看到那么多信息?

[解决办法]
strace看一下系统调用到底是啥。
[解决办法]
正常,嵌入式liunx用轻量级的进程模拟线程的实现。


[解决办法]

引用:
正常,嵌入式liunx用轻量级的进程模拟线程的实现。


这个解释。。。不对吧。
[解决办法]
引用:
引用:

正常,嵌入式liunx用轻量级的进程模拟线程的实现。


这个解释。。。不对吧。

我也是听说过这样的说法,也没研究过代码实现。一直这么认为的。愿闻其详。
[解决办法]
找到一篇文章,你看一下。IBM开发者上也有类似的东西,总的来说Linux线程天生存在缺陷,现在有一个小组正在开发新的线程库以解决这些问题。

1.Linux“线程”

  Linux内核只提供了轻量进程的支持,未实现线程模型,但Linux尽最大努力优化了进程的调度开销,这在一定程度上弥补无线程的缺陷。Linux用一个核心进程(轻量进程)对应一个线程,将线程调度等同于进程调度,交给核心完成。

笔者曾经在《基于嵌入式操作系统VxWorks的多任务并发程序设计》(《软件报》2006年第5~12期)中详细叙述了进程和线程的区别,并曾经说明 Linux是一种“多进程单线程”的操作系统。Linux本身只有进程的概念,而其所谓的“线程”本质上在内核里仍然是进程。大家知道,进程是资源分配的 单位,同一进程中的多个线程共享该进程的资源(如作为共享内存的全局变量)。Linux中所谓的“线程”只是在被创建的时候“克隆”(clone)了父进 程的资源,因此,clone出来的进程表现为“线程”,这一点一定要弄清楚。因此,Linux“线程”这个概念只有在打冒号的情况下才是最准确的,可惜的 是几乎没有书籍留心去强调这一点。

目前Linux中最流行的线程机制为LinuxThreads,所采用的就是线程-进程“一对一” 模型,调度交给核心,而在用户级实现一个包括信号处理在内的线程管理机制。LinuxThreads由Xavier Leroy (Xavier.Leroy@inria.fr)负责开发完成,并已绑定在GLIBC中发行,它实现了一种BiCapitalized面向Linux的 Posix 1003.1c “pthread”标准接口。Linuxthread可以支持Intel、Alpha、MIPS等平台上的多处理器系统。

按照POSIX 1003.1c 标准编写的程序与Linuxthread 库相链接即可支持Linux平台上的多线程,在程序中需包含头文件pthread. h,在编译链接时使用命令:

gcc -D -REENTRANT -lpthread xxx. c
其中 -REENTRANT宏使得相关库函数(如stdio.h、errno.h中函数) 是可重入的、线程安全的(thread-safe),-lpthread则意味着链接库目录下的libpthread.a或libpthread.so文 件。使用Linuxthread库需要2.0以上版本的Linux内核及相应版本的C库(libc 5.2.18、libc 5.4.12、libc 6)。

[解决办法]
上面的解析都有问题:
首先、linux虽然是使用轻量级进程实现的线程,但是使用PS是查看不到所创建的线程。
其次、就算创建的是进程,子进程加上父进程,那也应该是三个,而不是四个。
建议:
(1)使用top命令,查看这几个进程的父进程是谁?
(2)可以的话,查看海斯提供给你的内核代码?是否是他内核实现的问题。
[解决办法]
以前的Linux线程就是进程,没有区别。pthread等是依靠用户层自己实现的机制来进行线程管理的。
后来2.6引入的本地线程,内核本身支持了线程,不过这个机制和平台有关,比如ARM的可能没有实现。
[解决办法]
如果是在linux 上面的话这个就很正常了,在linux下无论是创建线程还是进程都用到了clone这个系统调用了,只不过创建的进程拥有线程的特性,比如说共享内存,文件描述符...

热点排行