通过一个C程序,看操作系统做了什么:

  一个C程序:helloworld
  这个程序的功能是调用puts函数,在标准输出设备(显示器)上显示字符串hello world
  1. (用户)要启动程序执行,用户告诉操作系统执行hello world程序(如何告知?)
  -- 命令行键入相应的命令
  -- 通过鼠标双击hello world程序的图标
  2. (操作系统)操作系统接到用户的请求之后,会根据用户提供的文件名,到磁盘上找到hello world程序的相关信息,检查其类型是否是可执行文件;并通过程序首部信息, 确定代码和数据在可执行文件中的位置并计算出对应的磁盘块地址(文件格式?)
  -- Windows:PE
  -- Linux:ELF
  3. (操作系统)为了执行这个hello world程序,操作系统创建一个新的进程,并将hello world可执行文件格式映射到该进程结构,表示由该进程执行hello world程序
  4. (操作系统)操作系统为hello world程序设置CPU上下文环境,并跳到程序开始处,准备执行这个程序,下一个指令周期,是执行hello world程序
  5. (CPU)假设调度程序正好选中hello world程序,操作系统把控制权交给了调度程序,执行hello world程序的第一条指令,发生缺页异常。程序在执行的时候,先要把程序的代码和数据读入内存,CPU才能执行,但是hello world的代码和数据还没有读入内存,所以这个时候硬件机制会捕获缺页异常,并且把控制权交给操作系统
  6. (操作系统)操作系统管理了计算机系统中的内存,比如采用页式存储方案的话,内存有很多的物理页面,操作系统的内存管理模块会分配一页空闲的物理内存,并且根据前面计算出的磁盘块地址把hello world程序的代码从磁盘读入内存,然后继续执行hello world程序,有的时候程序很大,一页内存还不够,因此在执行过程中会多次地产生缺页异常,然后从磁盘读入程序到内存
  7. (CPU)hello world程序执行puts函数(系统调用,由操作系统完成),在显示器(标准输出设备)上写(显示)一字符串
  8. (操作系统)找到要将字符串送往的显示设备,通常设备是由一个进程控制的,所以,操作系统将要写的字符串送给该进程
  9. (操作系统)控制设备的进程告诉设备的窗口系统它要显示字符串,窗口系统确定这是一个合法的操作,然后将字符串转换成像素,将像素写入设备的存储映像区
  10. 视频硬件将像素转换成显示器可接收的一组控制/数据信号
  11. 显示器解释信号,激发液晶屏
  12. 在屏幕上看到了“hello world”

  在CPU上执行一个用户程序,这个用户程序会不时地去请求操作系统的服务,因此在CPU上,时而运行的是用户程序,时而运行的是操作系统的程序
  hello world程序在执行的时候需要操作系统来创建进程,因此转到操作系统创建进程,进程创建完了以后从操作系统返回,接着执行hello world程序
  出现了缺页异常以后,控制权又转回了操作系统,操作系统分配物理内存给用户程序,然后又转向用户程序接着执行
  然后hello world程序要执行puts函数,又转向了操作系统
  这是从用户程序在执行过程不断请求操作系统服务这个角度来看程序执行的过程

  操作系统在执行过程中,通过调度选中一个程序然后执行
  程序执行过程中会不断地陷入操作系统,由操作系统完成一些服务
  然后再通过调度再选中程序再执行
  Summary
  在一个程序的执行过程中,操作系统负责了这个程序的启动过程,负责了这个程序的执行过程。同时,在执行过程中,不断地为用户程序执行提供各种各样的支持