继 [计算机网络]从页面输入网址,回车到显示内容,这中间到底经历了什么 这篇文章之后,我突然发现我对计算机网络的一些知识串了起来,它们对我来说不再是一个个的单独个体.
基于这个经验,我再来梳理一下当双击某程序到它显示运行界面时,操作系统做了什么,尝试将操作系统的一些东西,也串起来.
假设:我们现在想要让操作系统运行「微信」,那么首先我们会怎么做?
-
1 ,双击微信图标.
但是打开一个程序的方式不止一种,不要限制了自己,比如也可以通过命令行键入命令的方式将它打开(不过一般不会这么做吧;
当我们双击了微信图标时,就告诉了操作系统,我希望你能帮我运行「微信」 -
2 ,此时操作系统接收到请求之后,就去磁盘上找到「微信」程序的相关信息,检测它的类型是不是可执行文件,同时通过程序首部信息确定代码和数据在可执行文件中的位置并且计算出对应的磁盘块地址.
- 看完上面的解释,你有疑问嘛?操作系统怎么检测它是不是可执行文件呢?对于 Windows 系统来说,可执行文件是 PE(Portable Executable),对于 Linux 系统来说,可执行文件是 ELF(Executable and Linkable Format),对于 Mac 系统来说,可执行文件是Mach-O(Mach Object)
-
3 ,操作系统做完第 2 步之后,就会创建一个进程,并且将「微信」的可执行文件映射到该进程结构,意思就是,这个进程负责执行「微信」程序.
-
4 ,接下来操作系统会为「微信」程序设置 CPU 上下文环境,此时我们假设这个调度程序选中了「微信」程序,那么操作系统就会跳到程序开始处
-
5 ,接下来执行「微信」程序的第一条指令.
但是它会发生缺页异常.- 为什么会发生缺页异常?
因为程序在执行时,要将代码和数据读入内存, CPU 才能执行,但此时因为内存中还没有相关数据,进而触发了硬件机制,捕获到缺页异常,将控制权交给操作系统
- 为什么会发生缺页异常?
-
6 ,操作系统此时会分配一页物理内存,同时将代码从磁盘读入内存,然后继续执行「微信」程序.
如果程序很大,一页内存不够的话,会在执行过程中重复 5,6 步骤,直至将程序全部读入内存为止 -
7 ,之后,「微信」程序执行相关函数(系统调用),在显示器上显示「微信」图标
-
8 ,操作系统接收到这个请求,然后找到显示设备,通常显示设备是由一个进程控制的,所以操作系统将要显示的「微信」图标给该进程
-
9 ,控制设备的进程告诉设备的窗口系统它要显示「微信」图标,窗口系统在确定这是一个合法的操作之后,会将「微信」图标转换成像素,将像素写入设备的存储映像区
-
10 ,视频硬件将像素转换成显示器可以接收的一组控制数据信号
-
11 ,显示器解释数据信号,激发液晶屏
此时,我们就能够在屏幕上看到「微信」的登录界面.
至此,当我们双击某个程序,到显示运行界面时,操作系统做的工作我们就比较清楚了.
这篇文章的灵感来源于:
操作系统做了什么?
以上,非常感谢您的阅读~