01双击首先只是一次输入

当你在桌面上双击一个程序图标时, 鼠标并不知道“我要启动这个程序”。 它只是把移动、按下、松开等动作报告给电脑。

图形界面根据鼠标位置、点击次数和当前界面状态, 判断你双击的是哪一个图标,然后把“打开它”的请求交给系统继续处理。

鼠标动作

连续点击两次

图形界面判断

你点中了哪个图标

发出启动请求

请求系统打开目标程序

02系统先要找到真正的程序

桌面上的图标不一定就是程序本体。 它可能是一个快捷方式,指向磁盘上真正的可执行文件。

桌面图标

你看到和点击的入口

快捷方式 / 启动信息

告诉系统真正目标在哪里

存储设备

程序文件

实际保存在 SSD / 硬盘中

03程序文件怎样变成正在运行的进程?

磁盘上的程序文件只是静态保存的数据。 要真正运行,操作系统需要为它创建一个运行中的实例。

这个正在运行的实例通常叫作进程(Process)

程序文件

保存在磁盘里

还没有“跑起来”

操作系统创建运行环境

建立进程、准备地址空间等

正在运行的进程

拥有自己的运行状态和资源

04程序怎样进入可运行状态?

创建进程以后,系统中的加载机制会根据可执行文件的格式, 为程序准备代码、数据和需要的共享库等内容。

1

读取可执行文件信息

知道代码和数据应该怎样安排

2

建立虚拟地址空间

为进程安排自己的内存视图

3

准备所需组件

映射程序代码、数据和共享库等

4

准备初始线程

让程序有可以被 CPU 调度执行的线程

05CPU 什么时候真正开始执行?

当进程和线程已经准备好以后, 操作系统的调度器会在合适的时候让线程获得 CPU 时间。

线程准备好了

已经可以运行

操作系统调度

安排它获得处理器时间

CPU 处理器

CPU 开始执行

从程序入口附近开始执行指令

从这一刻起,CPU 才是在真正执行这个程序的机器指令。 程序会继续初始化自己的数据、界面和功能。

06为什么过一会儿才看到窗口?

程序开始执行以后,还可能要做很多准备工作, 所以你通常不会在双击的那一瞬间就看到完整窗口。

1

程序初始化

准备配置、数据和内部组件

2

读取需要的资源

字体、图片、配置或其他文件

3

创建窗口

向图形系统请求显示界面

4 显示器

界面出现

窗口被组合并显示到屏幕上

07程序会一次全部搬进内存吗?

入门时常会听到一句话: “程序运行前,要从硬盘加载到内存。” 这个说法方向没错,但如果理解成“整个程序文件一次性完整复制到 RAM”就不准确了。

SSD 存储设备

磁盘上的程序

ABCDEF

物理内存中的页面

AC??

现代操作系统经常使用按需分页(Demand Paging): 某些程序页面可以等到真正需要访问时,才从存储设备调入物理内存。

你已经知道了什么

  • 双击首先是鼠标输入,图形界面再把它解释为“打开程序”的请求。
  • 桌面图标可能只是快捷方式,系统要先找到真正的程序文件。
  • 磁盘上的程序文件和正在运行的进程不是同一个概念。
  • 操作系统会创建进程、准备虚拟地址空间,并加载或映射程序需要的代码和数据。
  • 程序至少需要有可执行的线程,线程获得 CPU 时间后,CPU 才真正开始执行指令。
  • 程序启动后还会继续初始化资源、创建窗口,所以双击后通常要等一会儿才看到界面。
  • 现代系统不一定把整个程序一次性完整复制到 RAM,很多内容可以按需调入物理内存。

下一个问题: 既然程序原本保存在 SSD / 硬盘里, 为什么运行时还要让它的代码和数据进入内存体系? 下一篇:程序为什么要从硬盘跑到内存?