从操作系统的角度看进程的建立过程

进程的建立

一个进程最关键的特征就是它拥有自己独立的虚拟地址空间,这让它有别于其他的进程

这次我们通过进程的建立来看一看可执行文件的装载

很多时候一个程序被执行的同时都伴随着一个新进程的被建立,一般这种情况:创建一个进程,然后装载可执行文件并执行。
在有虚拟储存的情况下,上述过程做了三件事:
- 创建一个独立的虚拟地址空间
- 读取可执行文件头,并且建立虚拟地址空间和可执行文件之间的映射关系
- 将CPU的指令寄存器设置为可执行文件的入口地址,并启动运行

接下来我们就来逐个分析以上的过程

首先是创建虚拟地址空间

我们首先得明白虚拟空间是由一组映射函数将虚拟空间的各个页映射到相对应的物理空间的一个数据结构。
所以创建一个虚拟空间实际上并不是真的创建了一块空间,而是创建映射函数所需的数据结构

在某些操作系统下,创建虚拟地址空间实际上只是分配了一个页目录,甚至不设置页的映射关系,这些映射关系等到后面程序出现页映射错误时才进行设置

然后是读取可执行文件头,并且建立虚拟空间与可执行文件的映射关系

上面那一步的页映射关系函数是虚拟空间到物理空间的映射关系,这一步做的是虚拟空间与可执行文件的映射关系。
我们要知道,当程序执行到页错误时,操作系统将从物理内存中分配一个物理页,然后将“缺页”从磁盘中读到内存中,再设置却也的虚拟页和物理页之间的映射关系,这样程序才能顺利运行。但是很明显的是的,当操作系统检测到发生缺页错误的时候,它应当知道程序当前所需的页在可执行文件中的那个位置,这就是虚拟内存和可执行文件之间的映射关系

从某种角度上来说,我觉得这是整个装载过程中最重要的过程,也是传统意义上“装载”的过程

由于可执行文件在装载的时候实际上是被映射的虚拟空间,所以可执行文件又被叫做映像文件(Image)

在Linux中,系统将进程虚拟空间中的一个段叫做虚拟内存空间(VMA,Virtual Memory Area),在windows中将这个叫做虚拟段(Virtual Section),其实它们是一个概念。

将CPU指令寄存器设置为可执行文件的入口,启动执行

第三步是最简单的一步,操作系统通过设置CPU的指令寄存器,将控制权交给进程,由此进程开始执行。这一步看起来很简单,但在操作系统的层面看就比较复杂,它涉及到内核堆栈和用户堆栈的切换、CPU运行权限的切换。
不过从进程的角度来看,可以简单地认为操作系统执行了一个跳转指令,直接跳到了可执行文件的入口地址

总结

说点什么吧,这一篇只是简单的介绍了一下进程创建的过程,但很多细节都还没说清楚。以后会再写一些关于可执行文件的装载、进程的系统调用、操作系统的原理方面的内容

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值