《操作系统导论》之虚拟化CPU学习笔记:进程

今天我们开始学习《操作系统导论》的第一个主题:虚拟化CPU。

虚拟化CPU的目的是为了将少量物理CPU,让用户看起来像是有无数多个CPU可用,以便能让多个进程可以同时运行。

操作系统要实现虚拟化CPU,要从三个方面要实现:抽象出"进程"的概念底层(硬件)机制支持 以及高层策略(OS对进程的调度算法)

进程是底层机制和高层策略实现的基础。所以,我们先来了解下进程相关的知识。

什么是进程

操作系统中,将运行中的应用程序叫做进程

我们在电脑桌面上或手机桌面上看到的应用列表,就是应用程序。应用程序被存储在磁盘上。如下:

将应用程序运行起来就叫做进程。比如,我们在macbook的活动监视器中看到的列表,就是正在运行中的应用程序,也就是对应应用程序的进程。通过这个列表,我们就可以看到每个进程使用的内存和CPU的占用量。如下:

操作系统为什么要抽象出"进程"这么一个概念呢?因为操作系统在分配系统资源时是以进程为基本单位的,每个分配到的系统资源(比如内存、CPU)都是独立的 ,进程与进程间的资源是不能共享的;同时进程和进程之间也就具有了隔离性

操作系统在调度时的基本单位也是进程。 所以,进程是操作系统中调度策略实现的基础。

启动一个进程需要的硬件资源

因为计算机的硬件就是要用来运行软件的。所以操作系统要创建一个进程,就必须要给该进程分配一定的硬件资源。一般一个进程所需要的硬件资源至少有内存寄存器持久设备

如何创建一个进程

我们看下操作系统是如何将一个应用程序转换成进程的。

  • 首先,用户触发应用程序,双击图标或在shell里启动一个程序。
  • 其次,操作系统将应用程序的代码和静态数据从磁盘加载到内存中。
  • 然后,操作系统为程序的运行分配栈内存、堆内存。
  • 接着,操作系统还需要执行一些和I/O相关的任务。比如在unix系统中每个进程都有3个打开的文件描述符,用于标准输入、输出和错误。
  • 最后,执行应用程序的入口函数,一般为main函数。从而开始执行应用程序。

进程相关的API

用户或应用程序如何告知操作系统来创建进程以及管理进程呢?那就是通过操作系统提供的和进程相关的一组API,即相关的函数接口。

操作系统一般会提供如下相关API:

  • 创建进程的API(create):比如双击应用程序的图标时,就会调用操作系统来创建并运行进程。
    • 销毁进程的API(destroy):和创建进程相对应,有时候会强制终止进程的运行,并释放进程所拥有的资源。
  • 等待其他进程的API(wait):比如父进程要等待子进程完成。
  • 获取进程状态的API(status):例如获取进程已运行的时长或处于什么状态等。
  • 其他一些控制进程的API:比如杀死进程、暂停进程以及恢复进程等。

进程的状态

进程在给定的时间内可能处于不同的状态。一般有3个主要的状态:

  • 运行:该状态下,进程正在处理器上运行
  • 就绪:该状态下,说明进程已准备好运行,但还没有运行。
  • 阻塞:该状态下,说明进程执行了某种操作一直在等待,直到发生其他事件才准备运行。比如向磁盘发出了I/O操作,进程被阻塞。这时其他进程就可以使用CPU了。

3个状态的转换关系如下:

数据结构

大家可能都听说过数据结构+逻辑=软件。数据结构是用来存储各种信息的,逻辑就是告诉CPU如何执行的指令。 操作系统也不例外,也需要用数据结构来存储进程相关的信息。比如每个进程所需的各种寄存器的信息、状态信息以及不同状态的进程列表结构等。

总结

操作系统抽象出了"进程"的概念,这就为后续操作系统做进程调度提供了基础。

下一篇,我们继续学习虚拟化CPU的底层机制。

欢迎关注 Go学堂 ,学习更多计算机基础和编程知识

相关推荐
章豪Mrrey nical3 小时前
前后端分离工作详解Detailed Explanation of Frontend-Backend Separation Work
后端·前端框架·状态模式
派大鑫wink5 小时前
【JAVA学习日志】SpringBoot 参数配置:从基础到实战,解锁灵活配置新姿势
java·spring boot·后端
程序员爱钓鱼5 小时前
Node.js 编程实战:文件读写操作
前端·后端·node.js
xUxIAOrUIII5 小时前
【Spring Boot】控制器Controller方法
java·spring boot·后端
Dolphin_Home5 小时前
从理论到实战:图结构在仓库关联业务中的落地(小白→中级,附完整代码)
java·spring boot·后端·spring cloud·database·广度优先·图搜索算法
zfj3215 小时前
go为什么设计成源码依赖,而不是二进制依赖
开发语言·后端·golang
weixin_462446235 小时前
使用 Go 实现 SSE 流式推送 + 打字机效果(模拟 Coze Chat)
开发语言·后端·golang
JIngJaneIL6 小时前
基于springboot + vue古城景区管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端
小信啊啊6 小时前
Go语言切片slice
开发语言·后端·golang
阿里嘎多学长7 小时前
2025-12-16 GitHub 热点项目精选
开发语言·程序员·github·代码托管