当前位置:  技术问答>linux和unix

请教一个关于多进程的问题?(主要关于进程共享数据)

    来源: 互联网  发布时间:2015-11-25

    本文导语:  下面一段简单的程序: int main() { int exp; if (fork() == 0) {    exp = 10;    printf("child exp:%dn",exp); } else {    printf("father exp:%dn",exp); } } 当我用fork调用创建一个子进程时,linux在写时为子进程复制了一份父进...

下面一段简单的程序:
int main()
{
int exp;

if (fork() == 0)
{
   exp = 10;
   printf("child exp:%dn",exp);
}
else
{
   printf("father exp:%dn",exp);
}
}
当我用fork调用创建一个子进程时,linux在写时为子进程复制了一份父进程的数据区。这时我的本意是

让子进程改变全局的exp值(也就是exp对于两个进程都是公有的),但实际上,子进程改变的是自身数据

区的exp副本的值,对父进程没有影响。也就是两个进程分别有一个exp变量。请问如何使两个进程访问的

都是同一个exp值?当然这只是个简单的例子,实际情况复杂的多,如果每个需要被多个进程访问的变量

或数据都需要通过共享内存、消息队列等方式来通讯的话,是不是太麻烦了?有没有更简单的方式?

例如,我在N个c文件,每个文件里都定义了一个变量会被若干个进程使用到,为了使每个变量对于各个进

程来说都是公共的,而不是每个进程都产生一个变量的副本,难道我要进行N次内存映射?或者在每次改

变一个变量时都要使用进程通讯方式来通知其它进程?当然,可以把这n个变量都定义成指针,然后在总

的父进程中为它们分配空间,这样每个副本得到的指针都是指向相同的空间。但还是觉得麻烦了,难道就

没有一种办法能像不同函数使用同样一个公有变量那样让不同的进程都使用一个公共的变量吗?那所谓的

进程同步还有什么用,反正每个进程都得到了一个副本,更改都是对副本进行的,并不影响其它进程。

这就是小弟的一些问题,我是个初学者,希望高手解答。我在其它一些操作系统中看到,被创建的进程可

以共享公有变量,只要做好进程同步就是了。而且linux中创建进程难道都是调用fork后,在里面跟一段

代码吗?有没有调用一个类似create函数,参数就是进程要执行的函数名之类的函数呢?

还有,我希望的是多进程,不想使用多线程的方式代替。

|
我也不是很懂,简单谈下我的理解:
1.可以用linux的线程达到方便共享的目的.这里的线程是指使用clone系统调用创建的线程,而不是使用线程库得到的.通过传递给clone适当的参数,可以使新创建的进程和父进程共享虚拟地址,所以称为轻量级的进程(作为一个独立的实体被内核调度,pthread库创建的线程对内核而言是不可见的),这样的话就可以共享exp;
2.如果调用fork的话,你把需要共享的变量组织在一个文件中,然后操作文件是不是可以方便一些,没有试过,权当参考(你说的指针的方法可行吗,我觉得不可以,有时间试一下);
3.你说的进程同步的问题,我只有windows的经验,不好说,呵呵(能力有限啊,需要努力);
至于说类似于create的调用,在内核中有内核线程的概念,参数就是需要执行的函数.如果你要在用户空间中这样作,你可以fork后,直接调用你要用的函数就可以了.由于有写时拷贝的存在,这样做效率的损失应该也不大.

期待真正的高手的回答!

|
一个程序调用fork函数,系统为一个新的进程准备了数据段,堆栈段,代码段,
首先,新进程与旧进程使用同一个代码段,因为它们的程序是相同的,
对于数据段和堆栈段,系统则复制一份给新的进程,
这样,父进程的所有数据都可以留给子进程,但是,子进程一旦开始运行,
虽然它继承了父进程的一切数据,但实际上数据却已经分开,
相互之间不再有影响了,也就是说,它们之间不再共享任何数据了。
两个进程要共享数据的话,只能使用共享内存与消息队列等来操作。

如果数据段和堆栈都很大,一次fork就要复制一次,那么fork的开销岂不是很大?
其实一般CPU都是以“页”为单位分配空间的,
fork函数复制这两个段,只是“逻辑”上的,并非“物理”上的,也就是说,
实际执行fork时,物理空间上两个进程的绝大部分数据段和堆栈段都还是共享着的,
只有一个进程写了某个数据时,这时两个进程之间的数据才有了区别,
系统只将有区别的“页”从物理上也分开。系统在空间上的开销就可以达到最小。

要方便的使用共享变量,最好使用线程方式,但是需要考虑变量的保护问题,而
使用进程的共享内存与消息队列,就不需要用户来保护变量,因为它们已经提供了
保护。

|

前段时间写程序,就犯了这个错误。误认为fork{}中可以改变fork外的数据,哈哈。

后来改成了内存影射,觉得麻烦,多线程就应该能解决我的问题,而且调度的效率也高,就改成

了多线程。

    
 
 

您可能感兴趣的文章:

  • 高手请教!linux怎样通过pid获取进程信息,如:进程名、进程状态等?
  • 请教,进程通讯问题,除了父子进程能进行通讯外,任意两个进程都可以吗?
  • 请教--父进程监控子进程,欢迎高手进来探讨!!!
  • 请教一个关于子进程和父进程竞争的问题
  • 请教急:shell怎么实现进程监控,重启进程
  • 请教如何编程实现父进程产生多个子进程
  • 请教:进程创建和进程状态有关问题
  • 请教:在Linux下怎么样检测一个进程是否是僵尸进程??
  • 小妹请教各位大哥,在unix下,如何显示进程,和kill掉进程?
  • Linux下请教一个父进程杀死子进程的问题.
  • 各位大侠,请教一个LINUX存储管理的问题,在页换出时系统要锁住正在被换出的进程,若系统不锁住该进程,会发生什么状况?
  • 请教一个多进程编程问题
  • 请教怎么根据进程输出的日记文件内容判断来重起进程?
  • 请教:子进程关闭
  • 请教进程问题
  • 请教LINUX下建立子进程的问题(急急急)!!!
  • 请教一个父子进程控制的问题
  • 请教进程与变量的问题
  • 请教进程通信
  • 请教:如何利用shell script 去 kill 某个进程
  • 请教访问samba文件共享的问题
  • 请教POSIX 和 System V 实现的内存共享的相同及不同之处
  • 请教共享库运行时加载的问题
  • 菜鸟请教有关共享内存管理的一个问题
  • 请教裁剪操作系统时,共享库的裁剪
  • 请教一个关于linux共享库版本化的问题
  • linux 共享内存 请教
  • 请教不需要网络使虚拟机Virtual PC与主机共享的方法
  • 请教高手:关于系统共享库的升级
  • 请教linux共享上网的相关问题!!!急~~~~~~~
  • 请教一下共享内存的问题
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 请教,请教,这个问题是为什么????
  • 请教本地硬盘安装问题请教本地硬盘安装问题
  • ■请教■请教redhat最基本的问题!
  • 请教一个 shell 问题,我用下面这个 shell 语句总是失败,请教
  • 高分请教,各位大侠,请教一个问题,理论高手请进??谢谢
  • 请教Linux下pgadmin3-1.0.2的编译和安装!!高分请教!
  • 高手请教!linux怎样通过pid获取进程信息,如:进程名、进程状态等? iis7站长之家
  • 请教,请教,,,一定要看!!一定要看!!
  • 请教高手,小弟打印width=1500,height=600(A3纸)的Applet,在预览中是该区域是黑的,打印出来也是黑的,请教高手解决一下
  • :请教高手,小弟打印width=1500,height=600(A3纸)的Applet,在预览中是该区域是黑的,打印出来也是黑的,请教高手解决一下
  • 请教象我这样的硬盘应如何安装Linux,我昨天试装了,但有问题。(老问题了,也看了前面的帖子,但还是来请教,请多指教)
  • 请教这种循环的执行过程
  • 请教两个redhat9问题
  • 请教如何在指定目录下查找包含指定文字的文件
  • 请教局域网中如何通过ip地址得到主机名
  • 请教kdevelop的问题
  • 请教linux 下的adsl拨号问题.
  • 请教,如何用虚拟订机安装liux
  • 【请教】LINUX 下SNMP的MIB开发
  • 请教一个opengl的问题


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3