前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >程序与进程

程序与进程

作者头像
_春华秋实
发布2018-09-28 14:50:50
4430
发布2018-09-28 14:50:50
举报
文章被收录于专栏:_春华秋实_春华秋实

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

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

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

C 程序到可执行程序

 图1 C程序的编译过程

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

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

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

可执行文件的执行过程

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

过程简单介绍

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

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

大胆的概括

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

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-08-27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 关于程序和进程区别的概念
    • C 程序到可执行程序
      • 可执行文件的执行过程
        • 过程简单介绍
      • 大胆的概括
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档