当前位置: 技术问答>linux和unix
linux多进程问题请教
来源: 互联网 发布时间:2017-05-26
本文导语: 对linux进程有点疑惑,请教下: 1,使用fork函数得到的子进程是父进程的一个复制品,它从父进程处继承了整个进程的地址空间,包括进程上下文、进程堆栈、内存信息、打开的文件描述符、信号控制设定、进程优先...
对linux进程有点疑惑,请教下:
1,使用fork函数得到的子进程是父进程的一个复制品,它从父进程处继承了整个进程的地址空间,包括进程上下文、进程堆栈、内存信息、打开的文件描述符、信号控制设定、进程优先级、进程组号、当前工作目录、根目录、资源限制、控制终端等,而子进程所独有的只有它的进程号、资源使用和计时器等。如果父子进程这些都相同的话不是乱套了?难道各自的内存空间不应该是独立的吗?
2,什么时候需要用到多进程编程,它相对于多线程有什么优势?大家都说多线程不好控制,难道多进程不是一样的问题吗?不也需要同步,互斥吗?
3,如果一个软件要求同时完成数据采集,网络传输,事务处理3个功能,能否为各个任务建立各自进程?处理方式是不是主函数创建2个子进程,根据返回值区分进程,然后把3个任务的处理函数分别调用?这就是多进程编程方式吗?
网上查了些进程线程相关资料,理解的有点模糊,麻烦大家指点一下
1,使用fork函数得到的子进程是父进程的一个复制品,它从父进程处继承了整个进程的地址空间,包括进程上下文、进程堆栈、内存信息、打开的文件描述符、信号控制设定、进程优先级、进程组号、当前工作目录、根目录、资源限制、控制终端等,而子进程所独有的只有它的进程号、资源使用和计时器等。如果父子进程这些都相同的话不是乱套了?难道各自的内存空间不应该是独立的吗?
2,什么时候需要用到多进程编程,它相对于多线程有什么优势?大家都说多线程不好控制,难道多进程不是一样的问题吗?不也需要同步,互斥吗?
3,如果一个软件要求同时完成数据采集,网络传输,事务处理3个功能,能否为各个任务建立各自进程?处理方式是不是主函数创建2个子进程,根据返回值区分进程,然后把3个任务的处理函数分别调用?这就是多进程编程方式吗?
网上查了些进程线程相关资料,理解的有点模糊,麻烦大家指点一下
|
楼主要深入的理解上面的问题,首先还是应该明白,为什么有了父进程还要产生子进程?简单来说,若某一个工作量比较大,需要多个进程协同完成,这时就需要在父进程中创建一个或若干个子进程来一起完成工作。举例:web服务器中的httpd进程。当用户访问web服务器的时候,httpd作为父进程,会fork出许多个子进程来应对访问者,你看进程的分类可以知道,进程有守护,批处理和交互,我们不可能把大多数的工作交给一个父进程来完成,所以fork出子进程来协助。
问题1:
fork()会产生一个和父进程完全相同的子进程,但子进程在此后多会exec系统调用,出于效率考虑,linux中引入了“写时复制“技术,也就是只有进程空间的各段的内容要发生变化时,才会将父进程的内容复制一份给子进程。在fork之后exec之前两个进程用的是相同的物理空间(内存区),子进程的代码段、数据段、堆栈都是指向父进程的物理空间,也就是说,两者的虚拟空间不同,但其对应的物理空间是同一个。当父子进程中有更改相应段的行为发生时,再为子进程相应的段分配物理空间,如果不是因为exec,内核会给子进程的数据段、堆栈段分配相应的物理空间(至此两者有各自的进程空间,互不影响),而代码段继续共享父进程的物理空间(两者的代码完全相同)。而如果是因为exec,由于两者执行的代码不同,子进程的代码段也会分配单独的物理空间。。
另外,进程号直接决定了不会出现乱套,就像人的唯一身份证号。
问题二:
进程是资源分配的最小单位,线程是CPU调度的最小单位。应该根据不同的情况进行选择?
问题三
最好每个建立一个进程或更多。pid区分。
问题1:
fork()会产生一个和父进程完全相同的子进程,但子进程在此后多会exec系统调用,出于效率考虑,linux中引入了“写时复制“技术,也就是只有进程空间的各段的内容要发生变化时,才会将父进程的内容复制一份给子进程。在fork之后exec之前两个进程用的是相同的物理空间(内存区),子进程的代码段、数据段、堆栈都是指向父进程的物理空间,也就是说,两者的虚拟空间不同,但其对应的物理空间是同一个。当父子进程中有更改相应段的行为发生时,再为子进程相应的段分配物理空间,如果不是因为exec,内核会给子进程的数据段、堆栈段分配相应的物理空间(至此两者有各自的进程空间,互不影响),而代码段继续共享父进程的物理空间(两者的代码完全相同)。而如果是因为exec,由于两者执行的代码不同,子进程的代码段也会分配单独的物理空间。。
另外,进程号直接决定了不会出现乱套,就像人的唯一身份证号。
问题二:
进程是资源分配的最小单位,线程是CPU调度的最小单位。应该根据不同的情况进行选择?
问题三
最好每个建立一个进程或更多。pid区分。
|
1. 写时复制
2. Linux 下线程是轻量级进程,有篇文章叫 Linux下编程为什么多用进程少用线程,对共享资源的读写无论多线程、多进程都需要互斥。
3. 可以每个任务一个进程,“处理方式是不是主函数创建2个子进程,根据返回值区分进程,然后把3个任务的处理函数分别调用?”这地方不对了,不是3个任务的处理函数分别调用,应该是 fork + exec 的模式,exec是一簇函数,Google 一下。另外我觉得也可以多线程
2. Linux 下线程是轻量级进程,有篇文章叫 Linux下编程为什么多用进程少用线程,对共享资源的读写无论多线程、多进程都需要互斥。
3. 可以每个任务一个进程,“处理方式是不是主函数创建2个子进程,根据返回值区分进程,然后把3个任务的处理函数分别调用?”这地方不对了,不是3个任务的处理函数分别调用,应该是 fork + exec 的模式,exec是一簇函数,Google 一下。另外我觉得也可以多线程