程序与进程

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

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

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

C 程序到可执行程序

 图1 C程序的编译过程

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

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

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

可执行文件的执行过程

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

过程简单介绍

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

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

大胆的概括

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

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

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 计算机网络简介

    网路定义 :以实现资源共享为目的,一些互相连接的、独立的自治系统(能够独立运行并提供服务的系统)的集合。

    大眼瞪小眼
  • 面试-MySQL总结

    2NF:每一个非主属性完全依赖于候选码(属性组的值能唯一的标识一个元组,但是其子集不可以)。

    大眼瞪小眼
  • HTML定位简介

    定位一直是WEB标准应用中的难点,如果理不清楚定位那么可能应实现的效果实现不了,实现了的效果可能会走样。如果理清了定位的原理,那定位会让网页实现的更加完美。

    大眼瞪小眼
  • Python 基于python操纵redis入门介绍

    Redis客户端实例是线程安全的,可以直接将Redis连接实例设置为一个全局变量,直接使用。如果需要另一个Redis实例,就需要重新创建redis连接实例来获取...

    授客
  • 关于单片机的RAM

    杨奉武
  • 微信账户体系扫盲

    一个用户对于同主体微信小程序/公众号/APP的标识,开发者需要在微信开放平台下绑定相同账号的主体。开发者可通过 UnionId,实现多个小程序、公众号、甚至AP...

    薛定喵君
  • 24 小时开发微信小程序,重庆人是这样玩的 | 未来小程序

    知晓君
  • Python笔记:程序设计IPO模式

    程序设计需要按照一定的方法,这样在开发程序的时候才能事半功倍。按照一定的方法进行程序设计,可以清晰的分析问题,处理问题,解决问题。

    Altumn
  • MLK | 如何解决机器学习树集成模型的解释性问题

    前些天在同行交流群里,有个话题一直在群里热烈地讨论,那就是 如何解释机器学习模型 ,因为在风控领域,一个模型如果不能得到很好的解释一般都不会被通过的,在银行里会...

    Sam Gor
  • 云端服务开发的硬核要素

    随着云计算相关领域近几年的迅速发展,提供基于PaaS开发能力的平台越来越多,这使得很多开发者在编写后端程序的时候无需在服务器上从零构建自己的应用,无需考虑网络、...

    APICloud

扫码关注云+社区

领取腾讯云代金券