结束语:顺便提一下为什么会有inetd服务器的原因linux用不了多线程,因为如果没有的话,假设在系统中有10个请求服务端,然后就会创建10个接受进程来接受服务,这样系统就多了10个进程linux用不了多线程,那么如果没有请求来的话这10个进程还在挂起状态,严重的浪费了系统的资源, 所以人们就想用一个进程来做,所以就出来了个inetd服务器的东西,就是说它读取/etc/inetd.conf文件读取10个进程的服务项,然后创建socket等等,这样系统中只是一个进程在挂起,来请求时,就调用相应的任务进程即可,这样节省了系统的资源。由用户 唐韵宋风 提供的知识:南北方在生活习惯上差别还是有很多的,其差别原因首先是地域气候的差异造成的,其次是历史传统习俗留下来的。prefork(多进程,每个进程产生子进程)和worker(多进程,每个进程生成多个线程)prefork的工作原理是,控制进程在最初建立“startservers”个子进程后,为了满足minspareservers设置的需要创建一个进程,等待一秒钟,继续创建两个,再等待一秒钟,继续创建四个……如此按指数级增加创建的进程数,最多达到每秒32个,直到满足。
1. stevens的测试已是十几年前的了,现在的OS和CPU已起了翻天覆地的变化,表中的数值需要重新测试。
2. stevens没有提供服务器程序整体的运行计时,我们无法理解504.2 :21.5的实际运行效率,有可能是1504.2 :1021.5,也可能是100503.2 : 100021.5,20倍的差异可能很大,也可能可以忽略。
因此我写了下面的实验程序,来计算在Linux2.6上创建、销毁10万个进程/线程的绝对用时。
创建10万个进程(forkcreat.c):
#include
#include
#include

#include
#include
#include
#include
#include
int count;//子进程创建成功数量
int fcount;//子进程创建失败数量
int scount;//子进程回收数量
void sig_chld(int signo)
{
pid_t chldpid;//子进程id
int stat;//子进程的终止状态
//子进程回收,避免出现僵尸进程
while((chldpid=wait(&stat)>0))
{
scount++;
}
}
int main()
{
//注册子进程回收信号处理函数
signal(SIGCHLD,sig_chld);
int i;
for(i=0;i<100000;i++)//fork()10万个子进程
{
pid_t pid=fork();
if(pid==-1)//子进程创建失败
{
fcount++;
}
else if(pid>0)//子进程创建成功
{
count++;
}
else if(pid==0)//子进程执行过程
{
exit(0);
}
}
printf('count:%d fount:%d scount:%d',count,fcount,scount);
}
创建10万个线程(pthreadcreat.c):

#include
#include
int count=0;//成功创建线程数量
void thread(void)
{
//啥也不做
}
int main(void)
{
pthread_t id;//线程id
int i,ret;
for(i=0;i<100000;i++)//创建10万个线程
{
ret=pthread_create(&id,NULL,(void *)thread,NULL);
if(ret!=0)
{
printf('Create pthread error!');
return(1);
}
count++;
pthread_join(id,NULL);
}
printf('count:%d',count);
}
创建10万个线程的Java程序:
public class ThreadTest
{
public static void main(String[] ags) throwsInterruptedException
{
System.out.println('开始运行');
long start = System.currentTimeMillis();
for(int i = 0; i < 100000; i++) //创建10万个线程
{
Thread athread = new Thread(); //创建线程对象
athread.start(); //启动线程
athread.join(); //等待该线程停止
}
system.out.println("start notify time="+system.currenttimemillis())。 system.out.println("start wait time="+system.currenttimemillis())。 system.out.println("start wait time="+system.currenttimemillis())。
}
} 结束语
本篇文章比较了Linux系统上多线程和多进程的运行效率,在实际应用时还有其他因素的影响,比如网络通讯时采用长连接还是短连接,是否采用select、poll,java中称为nio的机制,还有使用的编程语言,例如Java不能使用多进程,PHP不能使用多线程,这些都可能影响到并发模 式的选型。
最后还有两点提醒:
1. 文章中的所有实验数据有环境约束。
2. 由于并行服务的不可测性,文章中的观点应该只做参考,而不要去定性。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-105369-2.html
贬值更加快