b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

Linux下多线程和多进程的选择及区别(2)

电脑杂谈  发布时间:2019-06-12 00:22:10  来源:网络整理

结束语:顺便提一下为什么会有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

linux 线程 进程_linux 线程 死锁_linux用不了多线程

#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):

linux用不了多线程_linux 线程 死锁_linux 线程 进程

#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

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...