程序与进程

昨天复习《深入理解计算机系统》,参考了小土刀的博客,看到了进程和程序在内存中是如何组织的,虽然这张图看了很多遍但是总感觉有疑问。努力解决,参考《深入理解计算机系统》。

关于程序和进程区别的概念

  • 程序是指令和数据的集合,可以作为目标文件保存在磁盘中,或者作为段存放在内存地址空间中。
  • 进程是程序运行的一个具体的实例,程序总是运行在某个进程的上下文中。

C 程序到可执行程序

 图1 C程序的编译过程

如上图一个 C 语言程序需要经过预处理、编译器、汇编器、链接器 才可以生成一个可执行文件(程序)。

hello.s 汇编代码使用汇编器生成可重定位目标文件 hello.o。

hello.o 和它 引入的类库 printf.o 使用链接器生成可执行程序。下图可执行文件的存储格式示例

可执行文件的执行过程

当在 Shell 实行 ./hello 时,Shell 认为 hello 是一个可执行文件,于是调用驻留在存储器中称为加载器(loader)的操作系统代码来运行它。 加载器将可执行目标文件的代码和数据从磁盘读到内存,然后通过跳转到程序的第一条指令或者入口点来运行程序。

过程简单介绍

shell 执行一个程序时,父 shell 进程生成一个子进程,他是父进程的一个复制。子进程通过 execve 系统调用加载器。加载器删除子进程的虚拟内存段,并创建新的代码、数据、堆和栈段。通过将虚拟地址的页地址映射到内存中可执行文件的页地址来初始化可执行文件的内容。最后,加载器跳转到 _start 地址,调用程序的 main 函数。

通过上面的描述可以理解到为什么 “程序总是运行在某个进程的上下文中”。

大胆的概括

  • 可执行文件加载入内存(可执行文件在内存中的内存映像顺序存储)
  • 开辟进程进行虚拟内存地址的重定向(程序可以说约等于进程)
  • 执行

了解了可执行文件的存储格式,加载一个可执行文件到初始化一个进程,但是总感觉有很多疑惑没有解开、理解也可能不正确.......

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏我的博客

CI页面乱码

今天项目页面乱码 我确认了数据库读取时utf8,页面也添加 <meta http-equiv=”content-type” content=”text/html...

30860
来自专栏河湾欢儿的专栏

常用的dos命令

10320
来自专栏osc同步分享-java技术分享站

hibernate 中对象的状态

load() 和 get() User user = session.get(User.class, "1"); 如上调用get方法后,会向数据库查询id为1的...

30550
来自专栏Java成神之路

Java微信开发_03_使用测试号进行开发

今天进行自定义菜单的开发时,发现公众号没有自定义菜单的权限。于是想到用测试号,但微信服务器如何区分你要请求的是公众号还是测试号呢。

8530

如何用split命令来拆分文件

split是一个类似于grep或tail的Unix命令行实用程序。它允许您将较大的文件分成几个较小的文件。

13740
来自专栏野路子程序员

从已有安装包(vendor)恢复 composer.json

55850
来自专栏赵俊的Java专栏

Python 文件操作

29230
来自专栏七夜安全博客

BaseProxy:异步http/https代理

19640
来自专栏深度学习之tensorflow实战篇

pycharm 之模块与模块引用

首先在pycharm,创建文件的快捷键ALT+INS,可以将自己常用的模版导入 ? 其次函数的模块调用规则如下图 ? 模块引用并指导源文...

38090
来自专栏GreenLeaves

Oracle 通过数据字典查询系统信息

简介:数据字典记录了数据库系统的信息,他是只读表和视图的集合,数据字典的所有者是sys用户。注:用户只能在数据字典上执行查询操作,而维护和修改是由系统自己完成的...

20150

扫码关注云+社区

领取腾讯云代金券