Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何防止一个进程使用另一个进程使用的内存?_C_Memory Management - Fatal编程技术网

C 如何防止一个进程使用另一个进程使用的内存?

C 如何防止一个进程使用另一个进程使用的内存?,c,memory-management,C,Memory Management,假设有两个进程:一个是我自己的进程,另一个进程生成随机内存地址并修改其中的内容(我们无法控制它) 第一个流程(我自己的流程): 第二个过程(我无法控制的外部过程): 当第一个进程处于睡眠状态时,我们无法控制的第二个进程将修改进程1使用的值 如何通过仅更改第一个进程来防止第二个进程这样做 一种可能的方法是使用锁。然而,为进程1使用的每个变量使用锁将非常低效。有什么有效的方法可以解决这个问题吗?操作系统通过设计防止一个程序访问另一个程序堆栈中的内存。没有程序需要担心这一点 为了便于说明,我在Cent

假设有两个进程:一个是我自己的进程,另一个进程生成随机内存地址并修改其中的内容(我们无法控制它)

第一个流程(我自己的流程):

第二个过程(我无法控制的外部过程):

当第一个进程处于睡眠状态时,我们无法控制的第二个进程将修改进程1使用的值

如何通过仅更改第一个进程来防止第二个进程这样做


一种可能的方法是使用锁。然而,为进程1使用的每个变量使用锁将非常低效。有什么有效的方法可以解决这个问题吗?

操作系统通过设计防止一个程序访问另一个程序堆栈中的内存。没有程序需要担心这一点

为了便于说明,我在CentOS映像上运行了以下场景:

方案1:

int main() {
  char *p = "Hello World";
}
当运行时,会产生:

Dump of assembler code for function main:
   0x00000000004004f0 <+0>:   push   %rbp
   0x00000000004004f1 <+1>:   mov    %rsp,%rbp
=> 0x00000000004004f4 <+4>:   movq   $0x4005a0,-0x8(%rbp)
   0x00000000004004fc <+12>:  mov    $0x0,%eax
   0x0000000000400501 <+17>:  pop    %rbp
   0x0000000000400502 <+18>:  retq   
End of assembler dump.
L??L??D??A??H??H9?u?H?[]A\A]A^A_?ff.?
在不终止前一个进程的情况下,我们可以运行另一个访问此寄存器的C程序:

int main() {
  char * hello_world = (char *) 0x4005a0;
  printf("%s", hello_world);
}
运行时,会产生:

Dump of assembler code for function main:
   0x00000000004004f0 <+0>:   push   %rbp
   0x00000000004004f1 <+1>:   mov    %rsp,%rbp
=> 0x00000000004004f4 <+4>:   movq   $0x4005a0,-0x8(%rbp)
   0x00000000004004fc <+12>:  mov    $0x0,%eax
   0x0000000000400501 <+17>:  pop    %rbp
   0x0000000000400502 <+18>:  retq   
End of assembler dump.
L??L??D??A??H??H9?u?H?[]A\A]A^A_?ff.?
在单独的GDB会话中(与两个程序分开):

(gdb)x/s 0x4005a0
0x4005a0:
因此,我们可以在这里观察到现代内存体系结构的一些原理。操作系统正在管理程序的内存,以便您描述的场景不会发生

在程序的第二次运行中,它实际上能够打印出一些文本(胡言乱语),因为当程序运行时,实际上分配了一个虚拟地址空间,根据定义,这是操作系统提供给进程的一组虚拟地址。虽然这两个程序使用相同的虚拟地址(
0x4005a0
),但在第二个实例中,它只是空闲内存

如果一个程序要跳出这个边界,操作系统将发送经典的
SIGSEGV
,并终止该程序。操作系统会根据定义触发内存访问冲突的分段错误


因此,从编程的角度来看,显然没有什么可以做的,也不需要做的,因为这种内存管理是由操作系统处理的。您的程序在这方面是安全的,假定它运行在现代操作系统上。

您在这里谈论的是什么平台?现代操作系统不允许这样做。我是一般性地问。没有具体的平台,也没有一般的答案。如果一个程序运行在一个主机操作系统上,而这个主机操作系统并没有通过设计来防止这种情况发生,那么它可能不会提供一种方法来防止一个程序使用的内存被另一个程序破坏。大多数现代操作系统都是通过设计来防止这种情况发生的,因此无需进一步防止。
L??L??D??A??H??H9?u?H?[]A\A]A^A_?ff.?
(gdb) x /s 0x4005a0
0x4005a0:   <Address 0x4005a0 out of bounds>