01双击首先只是一次输入
当你在桌面上双击一个程序图标时, 鼠标并不知道“我要启动这个程序”。 它只是把移动、按下、松开等动作报告给电脑。
图形界面根据鼠标位置、点击次数和当前界面状态, 判断你双击的是哪一个图标,然后把“打开它”的请求交给系统继续处理。
鼠标动作
连续点击两次
图形界面判断
你点中了哪个图标
发出启动请求
请求系统打开目标程序
02系统先要找到真正的程序
桌面上的图标不一定就是程序本体。 它可能是一个快捷方式,指向磁盘上真正的可执行文件。
桌面图标
你看到和点击的入口
快捷方式 / 启动信息
告诉系统真正目标在哪里
程序文件
实际保存在 SSD / 硬盘中
03程序文件怎样变成正在运行的进程?
磁盘上的程序文件只是静态保存的数据。 要真正运行,操作系统需要为它创建一个运行中的实例。
这个正在运行的实例通常叫作进程(Process)。
程序文件
保存在磁盘里
还没有“跑起来”操作系统创建运行环境
建立进程、准备地址空间等
正在运行的进程
拥有自己的运行状态和资源
04程序怎样进入可运行状态?
创建进程以后,系统中的加载机制会根据可执行文件的格式, 为程序准备代码、数据和需要的共享库等内容。
读取可执行文件信息
知道代码和数据应该怎样安排
建立虚拟地址空间
为进程安排自己的内存视图
准备所需组件
映射程序代码、数据和共享库等
准备初始线程
让程序有可以被 CPU 调度执行的线程
05CPU 什么时候真正开始执行?
当进程和线程已经准备好以后, 操作系统的调度器会在合适的时候让线程获得 CPU 时间。
线程准备好了
已经可以运行
操作系统调度
安排它获得处理器时间
CPU 开始执行
从程序入口附近开始执行指令
从这一刻起,CPU 才是在真正执行这个程序的机器指令。 程序会继续初始化自己的数据、界面和功能。
06为什么过一会儿才看到窗口?
程序开始执行以后,还可能要做很多准备工作, 所以你通常不会在双击的那一瞬间就看到完整窗口。
程序初始化
准备配置、数据和内部组件
读取需要的资源
字体、图片、配置或其他文件
创建窗口
向图形系统请求显示界面
界面出现
窗口被组合并显示到屏幕上
07程序会一次全部搬进内存吗?
入门时常会听到一句话: “程序运行前,要从硬盘加载到内存。” 这个说法方向没错,但如果理解成“整个程序文件一次性完整复制到 RAM”就不准确了。
磁盘上的程序
物理内存中的页面
现代操作系统经常使用按需分页(Demand Paging): 某些程序页面可以等到真正需要访问时,才从存储设备调入物理内存。
你已经知道了什么
- 双击首先是鼠标输入,图形界面再把它解释为“打开程序”的请求。
- 桌面图标可能只是快捷方式,系统要先找到真正的程序文件。
- 磁盘上的程序文件和正在运行的进程不是同一个概念。
- 操作系统会创建进程、准备虚拟地址空间,并加载或映射程序需要的代码和数据。
- 程序至少需要有可执行的线程,线程获得 CPU 时间后,CPU 才真正开始执行指令。
- 程序启动后还会继续初始化资源、创建窗口,所以双击后通常要等一会儿才看到界面。
- 现代系统不一定把整个程序一次性完整复制到 RAM,很多内容可以按需调入物理内存。
下一个问题: 既然程序原本保存在 SSD / 硬盘里, 为什么运行时还要让它的代码和数据进入内存体系? 下一篇:程序为什么要从硬盘跑到内存?