linux多进程问题请教

还没想好写什么 2014-08-20 04:03:01
对linux进程有点疑惑,请教下:
1,使用fork函数得到的子进程是父进程的一个复制品,它从父进程处继承了整个进程的地址空间,包括进程上下文、进程堆栈、内存信息、打开的文件描述符、信号控制设定、进程优先级、进程组号、当前工作目录、根目录、资源限制、控制终端等,而子进程所独有的只有它的进程号、资源使用和计时器等。如果父子进程这些都相同的话不是乱套了?难道各自的内存空间不应该是独立的吗?
2,什么时候需要用到多进程编程,它相对于多线程有什么优势?大家都说多线程不好控制,难道多进程不是一样的问题吗?不也需要同步,互斥吗?
3,如果一个软件要求同时完成数据采集,网络传输,事务处理3个功能,能否为各个任务建立各自进程?处理方式是不是主函数创建2个子进程,根据返回值区分进程,然后把3个任务的处理函数分别调用?这就是多进程编程方式吗?

网上查了些进程线程相关资料,理解的有点模糊,麻烦大家指点一下
...全文
229 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
奔跑的路 2014-08-22
  • 打赏
  • 举报
回复
哎,不得不说你想的挺多的,也想的挺深入的,实际工作中哪里会管这么多呀没能用就行了,不过有这种心态还是非常好呀! 1、父进程创建子进程后谁先执行呢?老爸?儿子?还是牵着手一起走?老爸或者儿子先走都是可以的,但就是不可能一起走,为什么呢?这是由处理器处理任务按时间片操作来决定的。 当复制完以后,两个人几乎一模一样,也没有给谁优先权(nice值相同)啊,所以就排队呗,所以父子都在同一个起跑线上,谁先跑到cpu那里排上队,谁就先有吃的,谁就先干活。你在linux下可以用打印输出来试试,也可以用sleep让老爸先休息下,或者你就告诉老爸(waitpid)老爸你在这里等着吧,我去干就行了。 2、没有exec之前就是没有和老爸分家呗,老爸什么状态我就什么状态,老爸是我,我就是老爸,除了pid傻傻分不清楚。 “除了id,有没有别的标识?” 要是工作了,boss知道了可能要骂人了,你丫管这个干吗! 其实这个id又和UNIX挂钩了,那就是万物皆文件,管你王侯将相,老子看来你们都是平民(文件) 为了方便管理,id是一种很直接的方式,你说不是吃饱了,有它就够了,谁管其他的呢,我想说他们的地址空间不同,你不会去把他们的地址给找不来吧,要真研究到那了,你也就不用问了,当然还有点远呢。 不过提供一些思路吧:用 ps -la 打印进程的属性,找到你要研究的进程,慢慢对比 用ls -lsh 查看文件的属性 了解文件属性的头文件 /usr/include/sys/stat.h /*/dirent.h 看看操作系统进程管理的书吧
  • 打赏
  • 举报
回复
引用 12 楼 lee244868149 的回复:
楼上的讲的都很好,准确精辟,就是感觉有点书面化了,不知你能不能很好的理解。 不知道你有没有看过黑客帝国,进程就像是黑客帝国里面可以复制自己那个人,他叫史密斯。 他可以通过一种手段(fork)来不断的复制自己,每次复制完成,这个复制体就有了自己的肉体,思想,灵魂,就像进程的堆栈、内存信息和pid,但是这两个人一模一样就如你想的乱套了吗,没有,虽然是复制体,但两个人毕竟是独立的,他们的想法和肉体都是独立的,就是在还没有exec之前要天天睡在一张床上(共同的内存空间)。 但是他不会没事就复制自己吧,所以他每次复制完就叫这个复制体,不要在这里挤了,去找exec给你分个房子去,干你该干的事情去,没有哪个无聊的人复制一堆的自己,都留在自己的家里闲着不干活的,老爸都叫他们出去干活创造自己的空间去,等他们把活干完了就寄个信回来(waitpid),把房子卖了,自己就不用回来了(空间回收)。 所以你说的数据采集,网络传输,事务处三件事,叫自己的儿子孙子去做就可以了,就3个进程,让exec给搞定3个房子,你们每个人在自己的房子里面把自己的事干好,干完了就把房子让出来,激活自毁,把自己化成灰,消失的无影无踪。
1,父进程创建出子进程后,是不是2者一起执行了?我看网上有人说fork后父子进程一起执行,但貌似大家说的exec后才执行; 2,子进程如果没执行,exec之前处于一种什么状态?除了id,有没有别的标识,名字什么的?
奔跑的路 2014-08-22
  • 打赏
  • 举报
回复
楼上的讲的都很好,准确精辟,就是感觉有点书面化了,不知你能不能很好的理解。 不知道你有没有看过黑客帝国,进程就像是黑客帝国里面可以复制自己那个人,他叫史密斯。 他可以通过一种手段(fork)来不断的复制自己,每次复制完成,这个复制体就有了自己的肉体,思想,灵魂,就像进程的堆栈、内存信息和pid,但是这两个人一模一样就如你想的乱套了吗,没有,虽然是复制体,但两个人毕竟是独立的,他们的想法和肉体都是独立的,就是在还没有exec之前要天天睡在一张床上(共同的内存空间)。 但是他不会没事就复制自己吧,所以他每次复制完就叫这个复制体,不要在这里挤了,去找exec给你分个房子去,干你该干的事情去,没有哪个无聊的人复制一堆的自己,都留在自己的家里闲着不干活的,老爸都叫他们出去干活创造自己的空间去,等他们把活干完了就寄个信回来(waitpid),把房子卖了,自己就不用回来了(空间回收)。 所以你说的数据采集,网络传输,事务处三件事,叫自己的儿子孙子去做就可以了,就3个进程,让exec给搞定3个房子,你们每个人在自己的房子里面把自己的事干好,干完了就把房子让出来,激活自毁,把自己化成灰,消失的无影无踪。
zhxianbin 2014-08-21
  • 打赏
  • 举报
回复
引用 8 楼 lth93 的回复:
[quote=引用 7 楼 zhxianbin 的回复:] 这种例子都是为了说明 fork 的 没有什么进程处理函数之说 从写代码看,一个进程就是一个 main 函数,将这个编译后,另外一个进程 fork 后在子进程中用 exec 执行它
假设系统里有可执行程序A,目前的main函数编码后为可执行程序B,我在B里fork一下,然后调用exec启动 A,A就是B的子进程了?那为什么不直接exec A呢?fork存在的意义是?[/quote] fork + exec 是一种方式,当然可以直接执行 另外楼主都知道 Linux下的 IPC 方式吗,很多东西慢慢学的
  • 打赏
  • 举报
回复
引用 7 楼 zhxianbin 的回复:
这种例子都是为了说明 fork 的 没有什么进程处理函数之说 从写代码看,一个进程就是一个 main 函数,将这个编译后,另外一个进程 fork 后在子进程中用 exec 执行它
假设系统里有可执行程序A,目前的main函数编码后为可执行程序B,我在B里fork一下,然后调用exec启动 A,A就是B的子进程了?那为什么不直接exec A呢?fork存在的意义是?
zhxianbin 2014-08-21
  • 打赏
  • 举报
回复
这种例子都是为了说明 fork 的 没有什么进程处理函数之说 从写代码看,一个进程就是一个 main 函数,将这个编译后,另外一个进程 fork 后在子进程中用 exec 执行它
  • 打赏
  • 举报
回复
引用 5 楼 zhxianbin 的回复:
如果 fork 还和父进程一样有什么意义?! exec 如何执行看接口参数 http://www.cnblogs.com/mickole/p/3187409.html
result = fork(); /*通过result的值来判断fork函数的返回情况,首先进行出错处理*/ if(result == -1){ perror("fork"); exit; } /*返回值为0代表子进程*/ else if(result == 0){ printf("The return value is %d\nIn child process!!\nMy PID is%d\n",result,getpid()); } /*返回值大于0代表父进程*/ else { printf("The return value is %d\nIn father process!!\nMy PID is %d\n",result,getpid()); } 父进程创建子进程,成功后子进程以什么样的方式存在着?出于被启动状态吗?它暴露给父进程的只有其id号吗?我原来的理解是如果返回0,里面执行的是子进程的代码,返回大于0是父进程的代码;即: /*返回值为0代表子进程*/ else if(result == 0){ printf("The return value is %d\nIn child process!!\nMy PID is%d\n",result,getpid()); } 花括号里的任务代码属于子进程,里面放置子进程处理函数,包括while(1)主循环等。。。看来这种理解方式不对?我将进城理解为类似于ucOS里的任务,看来还是没有搞清楚进程和线程的区别
LinuxInEmbedded 2014-08-21
  • 打赏
  • 举报
回复
应该是线程类似ucos里的任务,至于进程,了解不多,友情帮顶。
  • 打赏
  • 举报
回复
有些东西,仅仅限于知道是不够的;知道和搞清楚完全是两回事。。。linux的一个常见概念,做完几个项目也不见得完全明白。。
zhxianbin 2014-08-20
  • 打赏
  • 举报
回复
如果 fork 还和父进程一样有什么意义?! exec 如何执行看接口参数 http://www.cnblogs.com/mickole/p/3187409.html
  • 打赏
  • 举报
回复
引用 2 楼 zhxianbin 的回复:
1. 写时复制 2. Linux 下线程是轻量级进程,有篇文章叫 Linux下编程为什么多用进程少用线程,对共享资源的读写无论多线程、多进程都需要互斥。 3. 可以每个任务一个进程,“处理方式是不是主函数创建2个子进程,根据返回值区分进程,然后把3个任务的处理函数分别调用?”这地方不对了,不是3个任务的处理函数分别调用,应该是 fork + exec 的模式,exec是一簇函数,Google 一下。另外我觉得也可以多线程
引用 3 楼 FENGQIYUNRAN 的回复:
楼主要深入的理解上面的问题,首先还是应该明白,为什么有了父进程还要产生子进程?简单来说,若某一个工作量比较大,需要多个进程协同完成,这时就需要在父进程中创建一个或若干个子进程来一起完成工作。举例:web服务器中的httpd进程。当用户访问web服务器的时候,httpd作为父进程,会fork出许多个子进程来应对访问者,你看进程的分类可以知道,进程有守护,批处理和交互,我们不可能把大多数的工作交给一个父进程来完成,所以fork出子进程来协助。 问题1: fork()会产生一个和父进程完全相同的子进程,但子进程在此后多会exec系统调用,出于效率考虑,linux中引入了“写时复制“技术,也就是只有进程空间的各段的内容要发生变化时,才会将父进程的内容复制一份给子进程。在fork之后exec之前两个进程用的是相同的物理空间(内存区),子进程的代码段、数据段、堆栈都是指向父进程的物理空间,也就是说,两者的虚拟空间不同,但其对应的物理空间是同一个。当父子进程中有更改相应段的行为发生时,再为子进程相应的段分配物理空间,如果不是因为exec,内核会给子进程的数据段、堆栈段分配相应的物理空间(至此两者有各自的进程空间,互不影响),而代码段继续共享父进程的物理空间(两者的代码完全相同)。而如果是因为exec,由于两者执行的代码不同,子进程的代码段也会分配单独的物理空间。。 另外,进程号直接决定了不会出现乱套,就像人的唯一身份证号。 问题二: 进程是资源分配的最小单位,线程是CPU调度的最小单位。应该根据不同的情况进行选择? 问题三 最好每个建立一个进程或更多。pid区分。
fork创建子进程以后子进程不是已经在执行了吗?为什么还要exec呢?如果用exec,是不是应该根据子进程的名字或者子进程的进程号启动它?子进程的名字又是什么?exec资料也稍微介绍了下,但是它给的例子好像又是子进程直接执行了,有点迷惑。。。
FeelTouch Labs 2014-08-20
  • 打赏
  • 举报
回复
楼主要深入的理解上面的问题,首先还是应该明白,为什么有了父进程还要产生子进程?简单来说,若某一个工作量比较大,需要多个进程协同完成,这时就需要在父进程中创建一个或若干个子进程来一起完成工作。举例:web服务器中的httpd进程。当用户访问web服务器的时候,httpd作为父进程,会fork出许多个子进程来应对访问者,你看进程的分类可以知道,进程有守护,批处理和交互,我们不可能把大多数的工作交给一个父进程来完成,所以fork出子进程来协助。
问题1:
fork()会产生一个和父进程完全相同的子进程,但子进程在此后多会exec系统调用,出于效率考虑,linux中引入了“写时复制“技术,也就是只有进程空间的各段的内容要发生变化时,才会将父进程的内容复制一份给子进程。在fork之后exec之前两个进程用的是相同的物理空间(内存区),子进程的代码段、数据段、堆栈都是指向父进程的物理空间,也就是说,两者的虚拟空间不同,但其对应的物理空间是同一个。当父子进程中有更改相应段的行为发生时,再为子进程相应的段分配物理空间,如果不是因为exec,内核会给子进程的数据段、堆栈段分配相应的物理空间(至此两者有各自的进程空间,互不影响),而代码段继续共享父进程的物理空间(两者的代码完全相同)。而如果是因为exec,由于两者执行的代码不同,子进程的代码段也会分配单独的物理空间。
另外,进程号直接决定了不会出现乱套,就像人的唯一身份证号。
问题二:
进程是资源分配的最小单位,线程是CPU调度的最小单位。应该根据不同的情况进行选择?

问题三
最好每个建立一个进程或更多。pid区分。
zhxianbin 2014-08-20
  • 打赏
  • 举报
回复
1. 写时复制 2. Linux 下线程是轻量级进程,有篇文章叫 Linux下编程为什么多用进程少用线程,对共享资源的读写无论多线程、多进程都需要互斥。 3. 可以每个任务一个进程,“处理方式是不是主函数创建2个子进程,根据返回值区分进程,然后把3个任务的处理函数分别调用?”这地方不对了,不是3个任务的处理函数分别调用,应该是 fork + exec 的模式,exec是一簇函数,Google 一下。另外我觉得也可以多线程
  • 打赏
  • 举报
回复
有人了解吗?

23,125

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧