现代操作系统下的内存
现在的OS都引入了虚拟内存机制。我们说的内存空间,实际上虚拟内存空间,CPU执行PC指向的命令,PC指向的就是虚拟内存空间地址。虚拟内存机制只不过是OS为我们做了一层虚拟内存地址到物理内存地址的映射,我们不需要管具体是怎么映射的,直接用就完了。每个进程的虚拟地址空间都是一样的,所以A进程的0x300不会和B进程的0x300冲突,就好比1楼A002号房,和2楼A002号房,虽然都是A002号房,但是他们是不一样的,不会地址冲突。
引入虚拟内存最大的好处就是使应用进程变得安全了,对于OS上的应用进程,他的空间都是OS划分的,只能在自己的小天地里面折腾。他不能去别人的空间搞破坏,别人也不可能过来骚扰自己。如果木马以应用进程身份运行的话,他就不能做破坏,除非是OS级木马,直接黑掉OS,否则根本不可能进入到别人的虚拟内存空间搞破坏。
虚拟内存在安全上带来了好处,但是也带来了数据共享的问题,即进程间通信
IPC的本质——数据共享
在OS虚拟内存机制作用下,每个进程拥有独立的进程空间。尽管进程空间是各自独立的,相互之间没有任何可以共享的空间,但是至少还有一样东西是所有进程所共享的,那就是OS,因为甭管运行有多少个进程,但是它们共用OS只有一个。既然大家共用的是同一个OS,那么显然,所有的进程可以通过大家都共享第三方OS来实现数据共享。因此进程间通信的原理就是,OS作为所有进程共享的第三方,会提供相关的机制,以实现进程间数据的转发,达到数据共享的目的。
Linux OS所提供的c接口的进程间通信机制:
1)信号
2)管道(有名、无名)
3)消息队列
4)共享内存
5)信号量
信号和管道都是UNIX系统早期提供的比较原始的一种进程间通信(IPC)方式,早到Unix系统设计之初就有了。
后来Unix系统升级到第5版本时,又提供了三种新的IPC通信方式,分别是:
- 消息队列
- 信号量
- 共享内存
System V就是系统第5版本的意思,后来的Linux也继承了unix的这三个通信方式
System V IPC缺点
进程结束时,system v ipc不会自动删除,进程结束后,使用ipcs依然能够查看到。
如何删除?
方法1:重启OS,很麻烦
方法2:进程结束时,调用相应的API来删除,后面再讲
方法3:使用ipcrm命令删除
备注:
Linux服务器开发,C/C++语言是大头,但是C/C++标准库并没有提供“进程控制”和“进程间通信”的库接口,因此你的程序在windows和Linux下想要实现“进程控制”和“进程间通信”的话,必须调用系统API或者说该系统自己特有的库(不是标准库)。