创建线程变进程
奇怪问题请教,创建线程变进程
测试序如下:
(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用轻量级的进程模拟线程的实现。
[解决办法]
这个解释。。。不对吧。
[解决办法]
我也是听说过这样的说法,也没研究过代码实现。一直这么认为的。愿闻其详。
[解决办法]
找到一篇文章,你看一下。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这个系统调用了,只不过创建的进程拥有线程的特性,比如说共享内存,文件描述符...