什么是流程?
正在运行的程序有哪些资源?
该博客上撰写的文章是出于教学目的而创建的。 另外,文章中的信息可能不正确,请谨慎。
可执行文件是存储在磁盘上的代码和数据。 操作系统将这个可执行文件加载到内存中并附加执行所需资源的状态称为进程。
换句话说,程序是一个文件,进程是正在运行的程序的一个实例。
一个进程有什么
流程不仅仅包含代码。
- 独立的虚拟地址空间
- 可执行代码和全局数据
- 动态分配堆
- 线程使用的堆栈
- 打开文件和套接字信息
- 安全权限和进程身份
高地址
┌──────────────┐
│ 堆栈 │ 线程的函数调用和局部变量
├──────────────┤
│ │
│ 堆 │ 动态分配如new、malloc等
├──────────────┤
│ 数据/BSS │ 全局变量、静态变量
├──────────────┤
│ 代码 │ 执行命令
└──────────────┘
低地址
实际的安排和详细区域可能会根据操作系统和可执行文件类型的不同而有所不同,但是具有不同用途的内存区域的流程是相同的。
进程之间是相互隔离的
即使进程 B 获取了进程 A 使用的指针,它也无法访问相同的数据。 这是因为每个进程都有自己的虚拟地址空间,内核通过页表将其与真实内存连接起来。
这种隔离意味着如果一个浏览器出错,它不会立即破坏其他程序的内存。
进程需要一种相互通信的方式
由于内存是独立的,进程之间必须使用IPC(进程间通信)来交换数据。
- Pipe
- Shared Memory
- Socket
- Message Queue
共享内存速度很快,但同时访问时需要同步。 套接字和消息方法有明确的界限,但可能会产生数据复制和通信成本。
进程不仅仅是一段执行代码。 操作系统更接近于一个管理内存、文件、权限和一个或多个线程的资源容器。