地址空间(虚拟地址)

  • 操作系统在管理内存时,每个进程都有一个独立的进程地址空间,进程地址空间的地址为虚拟地址,对于32位系统,虚拟地址为2^32=4GB
  • 高位 1GB 为内核空间,地位的 3GB 为用户空间
  • 虚拟地址包含以下部分
    • Kernal Space
    • 文本段(.text) : 包含程序的可执行代码
    • 已初始化数据段(.data) : 静态变量和全局变量
    • 为初始化数据段(.bss) :
    • 堆(.stack) : 局部变量
    • 栈(.heap) : malloc

多进程

  • 不管是同一台宿主机的不同进程还是不同宿主机的不同进程,都属于多进程
  • fork()出来的子进程与父进程唯一的区别在于创建的时间点不同,并且子进程的地址空间是fork()时对父进程地址空间的复制
  • 由于进程没有共同的地址空间,不能通过操作同一个变量(地址)来通信,所以就没有“进程同步”一说了

进程通信

  • 普通文件 :多个进程操作同一文件,需要文件锁
  • 管道 : 半双工方式(数据可以在一个信号载体的两个方向上传输,但是不同同时传输)
  • 共享内存 :同一物理内存被映射到多个进程的地址空间,那就存在进程共享同一内存区域,必然需要同步机制
  • socket pair : 全双工方式
  • socket

以上方式除了最后一种,其余的都只能用于同一宿主的不同进程,最后一种能用于同一宿主的不同进程和不同宿主的不同进程

据说是腾讯的面试题:

void main(int argc, char *argv[])
{
   for(int i=0; i<2; ++i){
       fork();
       printf("g");
   }
}

问最后输出几个g?