admin管理员组文章数量:1567268
2024年5月18日发(作者:)
进程: 子进程是父进程的复制品.子进程获得父进程数据空间、堆和栈的复制品。
线程:相对与进程而言,线程是一个更接近与执行体的概念,它可以与同进程的其他线程共
享数据,但拥有自己的栈空间,拥有独立的执行序列。
根本区别:用多进程每个进程有自己的地址空间,线程则共享地址空间。所以其他区别都是
由此而来的:
1、 速度:线程产生的速度快,线程间的通讯快、切换快等,因为他们在同一个地址空间内。
2、 资源利用率:线程的资源利用率比较好也是因为他们在同一个地址空间内。
3、 同步问题:线程使用 公共变量/内存 时需要使用同步机制还是因为他们在同一个地址
空间内。
很想写点关于多进程和多线程的东西,我确实很爱他们。但是每每想动手写点关于他们的东
西,却总是求全心理作祟,始终动不了手。
今天终于下了决心,写点东西,以后可以再修修补补也无妨。
一.为何需要多进程(或者多线程),为何需要并发?
这个问题或许本身都不是个问题。但是对于没有接触过多进程编程的朋友来说,他们确实无
法感受到并发的魅力以及必要性。
我想,只要你不是整天都写那种int main()到底的代码的人,那么或多或少你会遇到代码响
应不够用的情况,也应该有尝过并发编程的甜头。就像一个快餐点的服务员,既要在前台接
待客户点餐,又要接电话送外卖,没有分身术肯定会忙得你焦头烂额的。幸运的是确实有这
么一种技术,让你可以像孙悟空一样分身,灵魂出窍,乐哉乐哉地轻松应付一切状况,这就
是多进程/线程技术。
并发技术,就是可以让你在同一时间同时执行多条任务的技术。你的代码将不仅仅是从上到
下,从左到右这样规规矩矩的一条线执行。你可以一条线在main函数里跟你的客户交流,
另一条线,你早就把你外卖送到了其他客户的手里。
所以,为何需要并发?因为我们需要更强大的功能,提供更多的服务,所以并发,必不可少。
二.多进程
什么是进程。最直观的就是一个个pid,官方的说法就:进程是程序在计算机上的一次执行活
动。
说得简单点,下面这段代码执行的时候
[cpp] view plaincopyprint?
int main()
{
printf(”pid is %d/n”,getpid() );
return 0;
}
进入main函数,这就是一个进程,进程pid会打印出来,然后运行到return,该函数就退
出,然后由于该函数是该进程的唯一的一次执行,所以return后,该进程也会退出。
看看多进程。linux下创建子进程的调用是fork();
[cpp] view plaincopyprint?
#include
#include
#include
void print_exit()
{
printf("the exit pid:%d/n",getpid() );
}
main ()
{
pid_t pid;
atexit( print_exit ); //注册该进程退出时的回调函数
pid=fork();
if (pid < 0)
printf("error in fork!");
else if (pid == 0)
printf("i am the child process, my process id is %d/n",getpid());
else
{
printf("i am the parent process, my process id is %d/n",getpid());
sleep(2);
wait();
}
}
i am the child process, my process id is 15806
the exit pid:15806
i am the parent process, my process id is 15805
the exit pid:15805
这是gcc测试下的运行结果。
关于fork函数,功能就是产生子进程,由于前面说过,进程就是执行的流程活动。
那么fork产生子进程的表现就是它会返回2次,一次返回0,顺序执行下面的代码。这是子
进程。
版权声明:本文标题:多线程与多进程的区别 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dianzi/1715964063a479129.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论