首页 > 试题广场 >

以下说法正确的有()

[不定项选择题]
以下说法正确的有()
  • 多个进程操作同一个文件时,应该要考虑到文件的一致性问题
  • 可通过文件在不同进程间进行数据传递和共享
  • 可以通过全局变量在不同进程间传递数据
  • 一个进程可以访问到所有物理内存空间
注意C选项,不同的进程是占用不同的内存资源的。不可以通过全局变量在进程间传递数据。
发表于 2016-07-11 10:17:41 回复(0)
更多回答
进程之间地址空间独立好不好。全局变量也就只有在同一个进程内的线程之间可以共享,怎么可能在不同进程之间共享实现通讯呢
发表于 2015-09-13 20:34:09 回复(13)
 进程间是相互独立的,其实完全可以看成A、B两个进程各自有一份单独的liba.so和libb.so,相应的动态库的代码段和数据段都是各个进程各自有一份的。然后在这个基础上,由于代码段是不会被修改的,所以操作系统可以采用copy on write的优化技术,让两个进程共享同一份物理内存。这是属于在不改变系统行为的基础上,为了节省内存,的优化技术。

【举例】
#pragma data_seg()
1,#pragma data_seg()一般用于DLL中。也就是说,在DLL中定义一个共享的,有名字的数据段。最关键的是:这个数据段中的全局变量可以被多个进程共享。

否则多个进程之间无法共享DLL中的全局变量。

2,共享数据必须初始化,否则微软编译器会把没有初始化的数据放到.BSS段中,从而导致多个进程之间的共享行为失败。

3,你所谓的结果正确是一种错觉。如果你在一个DLL中这么写:

#pragma data_seg("MyData")

int g_Value; // Note that the global is not initialized.

#pragma data_seg()

DLL提供两个接口函数:

int GetValue()
{
     return g_Value;
}

void SetValue(int n)
{
     g_Value = n;
}

然后启动两个进程A和B,A和B都调用了这个DLL,假如A调用了SetValue(5); B接着调用int m = GetValue(); 那么m的值不一定是5,而是一个未定义的值。因为DLL中的全局数据对于每一个调用它的进程而言,是私有的,不能共享的。

假如你对g_Value进行了初始化,那么g_Value就一定会被放进MyData段中。换句话说,如果A调用了SetValue(5); B接着调用int m = GetValue(); 那么m的值就一定是5!

这就实现了跨进程之间的数据通信!
发表于 2015-09-11 11:22:12 回复(0)
进程间在内存里是相互独立的,全局变量在每个进程中都是独立的,所以是不能传递数据的
发表于 2017-09-07 11:33:47 回复(0)

全局变量在每个进程之间是相互独立的

发表于 2020-03-14 08:52:54 回复(0)
管道既是以文件的形式在进程间传递数据的
发表于 2019-08-21 21:43:13 回复(0)
操作系统会为每个进程分配独立的数据段和程序段,但进程相互之间不可见,自然不可以通过全局变量来传递数据,一个进程也不能访问到另一个进程的物理内存空间,CD均错
发表于 2017-08-04 16:52:23 回复(0)

管道通信 管道本质就是文件


发表于 2020-02-24 23:36:42 回复(0)
父子进程内存空间相互独立,全局变量也只能在同一进程的多个线程敏感词享。fork后子进程中是父进程的完全复制(其中有写时复制技术),不管什么变量,fork后父子进程中都是一样的,但两者之间没有关系,任何一个进程修改变量后,在另一个进程中都不能知道,更不能访问另一个进程中的变量,即使是全局变量. C错误!
发表于 2016-09-12 23:46:38 回复(0)
这里说的用全局变量在不同进程间传递数据,难道要用消息阶列或者共xiang内存?
发表于 2015-09-11 00:44:56 回复(1)
因为——使用的内存空间是不共用 的,不同的虚拟内存空间,所以C错

改成一般不推荐了?
编辑于 2015-09-14 08:43:20 回复(1)
D感觉有点歧义:1、进程在用户态可以访问虚拟空间3GB,陷入内核态就能范围范围剩下的1GB虚拟空间,理论上虚拟空间整个范围都可以范围,那物理页面自然有能力范围。2、如果多进程则,物理页面必然会被某进程虚拟空间映射掉,其他进程无法访问被映射了的物理页面,从这点来说进程又是不能访问整个物理页面的。
发表于 2023-02-03 10:05:40 回复(0)
进程之间地址空间独立好不好。全局变量也就 只有在同一个进程内的线程之间可以共享,怎 么可能在不同进程之间共享实现通讯呢
发表于 2021-03-20 09:27:39 回复(0)
可以通过全局变量在不同进程间传递数据
全局变量不是进程通信的方式
管道、信号、信号量、共享内存、套接字、消息队列
发表于 2021-01-22 09:08:59 回复(0)
<p>管道通信,本质就是文件b对,不同进程,空间独立,全局变量与内存均不共享</p>
发表于 2020-10-10 23:51:04 回复(0)
全局变量理解成信号量
发表于 2020-08-26 11:53:43 回复(0)
全局变量在每个进程间独立。
发表于 2019-10-07 12:58:34 回复(0)
进程间的通信方式有:①管道(其中命名管道FIFO通信方式类似于在进程中使用文件来传输数据②消息队列③信号量④共享内存⑤socket
发表于 2019-09-06 10:19:41 回复(0)
进程之间的内存空间是相互独立的,进程之间有着各自的数据域,进程间通信可以有许多种方式,如信号量,管道(有名管道和无名管道),共享内存等,但全局变量是不能在不同进程间传递的,全局变量的作用域只是在一个进程内有效,可以再多个线程间通信,但不能在多个进程间通信,因为数据没有共享。线程有自己的栈空间,用于保存线程自己的局部变量,线程是共享进程内的数据的,如果一个线程死掉,整个进程也就死掉了。所以说多进程的程序要比多线程的程序更加健壮。
发表于 2019-03-07 15:31:02 回复(0)

有谁可以解释一下D选项吗
发表于 2017-09-07 20:32:16 回复(0)
进程之间地址空间独立好不好。全局变量也就只有在同一个进程内的线程之间可以共享 ,怎么可能在不同进程之间共享实现通讯呢
发表于 2017-04-23 14:34:18 回复(0)