Linux 进程基础(二):操作系统

目录

  • 一、什么是操作系统:用户和电脑之间的「翻译官」
    • 🌐 OS 的层状结构
    • 🧩 案例解析:双击鼠标的「跨层之旅」
  • 二、操作系统的必要性探究:缺乏操作系统的环境面临的挑战剖析
    • 🔑 OS 的「管理者」属性:三大核心价值
  • 三、操作系统如何管理进程: 从「双击打开应用」看进程管理本质
    • 📊 管理的本质:用数据描述,用规则(组织)调度
    • 进程管理的三大核心任务
    • 🔄 系统调用 vs 库函数
  • 四、广义的 OS 与狭义的 OS
    • 1. 狭义的操作系统
    • 2. 广义的操作系统


一、什么是操作系统:用户和电脑之间的「翻译官」

操作系统(Operating System,简称 OS)

想象一下:当你双击桌面上的 Firefox 图标时,鼠标的物理点击是如何让浏览器「蹦」出来的?这个过程中离不开OS的作用——它是介于用户与计算机硬件之间的「超级中间人」,既能听懂人类的「操作语言」(如鼠标点击),又能指挥硬件「干活」(如让 CPU 运行程序)。

🌐 OS 的层状结构

从底层到上层,OS 的结构可以分为六层「保护壳」,各层相互协作,共同构建起操作系统的运行体系:

层级名称功能描述关键组件/示例特点/备注
硬件层构成计算机物质基础,处理0/1电信号鼠标、键盘、CPU、内存比如双击鼠标时,微动开关产生的电信号就是硬件层的「原始语言」,这是整个交互过程的起点。
内核层操作系统核心,包含驱动程序、进程调度器、内存管理器等关键组件。直接与硬件对话,翻译硬件信号驱动程序、进程调度器、内存管理器比如将鼠标的电信号转换为「鼠标左键双击事件」。
大多数基础硬件驱动(如鼠标、键盘驱动)作为内核组件或可加载模块存在于内核空间,但部分外设驱动可能在用户空间实现(如通过特定框架),具体取决于操作系统的架构设计。
系统调用层提供内核服务的官方接口open()用于打开文件、execve()用于执行程序例如,应用程序必须通过系统调用层向内核请求服务。系统调用是用户态与内核态的唯一通道,必须通过此层请求内核服务
库函数层封装系统调用简化开发。如同 「便捷工具包」C语言的fopen():封装open()避免开发者直接处理复杂内核接口,降低开发难度。
用户接口层提供用户与系统交互的桥梁图形用户界面:GUI(Windows、Linux(GNOME/KDE)、macOS)
命令行界面:CLI(Bash/Zsh)
如:鼠标点击、ls命令
支持图形化操作(拖拽/点击)与命令行操作,它将系统功能以直观易懂的方式呈现给用户
应用层承载用户直接操作的软件,用户通过点击图标、输入文字等方式与 OS 交互。浏览器、文档编辑器……存在两种状态:
• 空闲态:系统无用户程序运行时,但系统进程仍在运行维持基本服务
• 活动态:当用户运行应用程序时,应用层则成为用户实现各种功能的直接载体

🧩 案例解析:双击鼠标的「跨层之旅」

当你双击 Firefox 图标时:

  • 硬件层:鼠标发送电信号到 USB 控制器,触发硬件中断(给 CPU 发「紧急通知」)。
  • 内核层:鼠标驱动解析信号为坐标(100, 200)和点击事件,窗口管理器根据坐标找到 Firefox 图标对应的程序路径(/usr/lib/firefox/firefox)。
  • 系统调用层:内核调用execve()函数,将 Firefox 的可执行文件从硬盘加载到内存。
  • 用户接口层:接收鼠标双击事件,根据图标对应的程序路径,通过系统调用层触发程序启动,并在界面上展示应用启动的反馈。
  • 应用层:Firefox 进程启动,界面显示在屏幕上,用户得以开始使用浏览器。

系统调用:用户态与内核态的「唯一通道」,用户接口层:「交互逻辑的起点」
在上述双击案例中,用户接口层通过系统调用read()接收鼠标双击事件,并将 “鼠标双击的物理事件” 转换为 “启动特定程序” 的 逻辑命令,通过 系统调用 告知内核 “需要启动程序”。

例如: Linux:调用 fork() 创建新进程,再通过 execve() 指定加载 Firefox 的可执行文件。
Windows:调用CreateProcess() API,最终触发内核的 NtCreateUserProcess() 系统服务。

至此:用户的 “双击动作” 被完整解析为操作系统可执行的 启动命令,等待内核执行。

操作系统
冯诺依曼体系
系统调用: read
返回事件数据
解析为指令
系统调用: execve
创建进程
调度执行
应用运行
驱动程序
内核
用户接口层
输入设备 - 鼠标
存储器 - 内存
运算器/控制器 - 内核调度
输出设备 - 显示器
用户双击鼠标
应用界面显示

冯・诺依曼体系与操作系统(OS)结合的视角来看,用户双击鼠标这一操作,鼠标作为输入设备,把物理动作转化为电信号,此为输入过程。操作系统的驱动程序如同数据处理的 “翻译官”,将电信号解析为内核能处理的事件数据,内核负责存储与管理这些数据。用户接口层依据系统调用从内核获取事件,把它解析为打开应用的指令,这是信息在软件层面的逻辑处理
随后,用户接口层借助系统调用向内核发起启动应用的请求,内核按照冯・诺依曼体系中控制器的角色,创建新进程,将应用程序从存储设备(如硬盘)加载到内存(存储器)中,如同将程序指令和数据存入存储器,为执行做准备。
接着,内核调度进程执行,如同控制器指挥运算器进行操作,让应用程序得以运行。
最后,应用程序将处理结果输出到显示器(输出设备),完成整个信息的输入 - 处理 - 输出循环,体现了冯・诺依曼体系结构与操作系统协同工作的原理。


二、操作系统的必要性探究:缺乏操作系统的环境面临的挑战剖析

在缺乏 OS 的情境下,计算环境将遭遇一系列严峻挑战,可归纳为以下典型场景:
场景 1:直接和硬件交互

  • 想打开文件:你需要自己写代码操作硬盘控制器,记住每个扇区的地址(比如第 1024 号扇区存了文件头)。
  • 想移动鼠标:你得解析 USB 协议,把 X/Y 轴的位移量转化为屏幕坐标(而且不同品牌鼠标的信号格式可能完全不同!)。

场景 2:资源混乱大战

  • 两个程序同时访问内存地址 0x1000:数据冲突导致崩溃。
  • 打印机正在打印文档,突然另一个程序强行占用:纸张乱码、任务卡死。

🔑 OS 的「管理者」属性:三大核心价值

  • 硬件抽象:让鼠标、键盘、硬盘等设备对用户和应用程序来说都是「统一的接口」(比如 Linux 把所有设备都视为文件,鼠标对应/dev/input/mice)。
  • 资源管理:合理分配 CPU 时间(让多个程序轮流运行)、内存空间(避免数据互相覆盖)、I/O 设备(比如打印机一次只处理一个任务)。
  • 安全隔离:用户态(应用程序)不能直接访问内核态(硬件控制),防止恶意程序破坏系统(比如病毒无法直接改写 CPU 寄存器)。

三、操作系统如何管理进程: 从「双击打开应用」看进程管理本质

回到双击 Firefox 的案例:当你点击图标时,OS 其实在做一件大事——创建一个进程。进程是「正在运行的程序实例」,而 OS 对进程的管理,本质是对「数据」的管理。

📊 管理的本质:用数据描述,用规则(组织)调度

  • 管理对象:数据
    • 每个进程都有一个「进程控制块(PCB)」,记录进程 ID(PID)、状态(运行 / 暂停 / 终止)、内存地址、CPU 使用时间等信息(相当于进程的「身份证 + 简历」)。
    • 当你打开多个程序时,OS 通过 PCB 区分不同进程,比如 Firefox 进程的 PID 是 1234,Chrome 进程的 PID 是 5678。
  • 管理方式:数据组织 + 规则执行
    • 数据组织:用链表(比如「就绪队列」存放等待 CPU 的进程)、树结构(比如进程家族树,父进程创建子进程)管理所有 PCB。
    • 规则执行:通过调度算法(比如 Linux 的 CFS 调度器)决定哪个进程优先使用 CPU,通过同步机制(比如互斥锁)避免多个进程同时修改共享数据。

进程管理的三大核心任务

  1. 进程调度
  • 为什么需要调度: CPU 同一时间只能执行一个进程,但用户感觉多个程序在同时运行(比如边听歌边写文档),这靠的是 OS 让 CPU 在多个进程间快速切换(每秒切换上百次)。
  • 调度算法怎么做? 时间片轮转:给每个进程分配固定时间片(比如 10ms),时间到了就切换(适合交互式程序,比如鼠标点击响应)。
  • 优先级调度:重要进程(比如系统服务)优先运行,比如 Firefox 响应用户点击时,OS 会临时提高它的优先级,让 CPU 先处理它的事件。
  1. 进程同步
  • 案例:两个进程同时向同一个文件写入数据,如果没有同步机制,可能导致数据错乱 (比如进程 A 写入「hello」时,进程 B 插入「world」,最终文件变成「hewlorldlo」)。
  • 解决办法:
    • 互斥锁:进程 A 访问文件时加锁,进程 B 必须等待锁释放(就像上厕所关门,别人只能等)。
    • 信号量:记录可用资源数量,比如打印机同时允许 3 个进程排队,第 4 个进程必须等待。
  1. 进程通信
  • 为什么需要通信? 比如你用浏览器下载文件时,下载进程需要告诉界面进程「下载进度 60%」,这就需要进程间通信(IPC)。
  • 通信方式: 管道:单向数据流,比如ls | grep txt中,ls的输出通过管道传给grep。
  • 共享内存:多个进程直接访问同一块内存区域(速度最快,但需要同步机制避免冲突)。
  • 套接字(Socket):跨网络的进程通信(比如浏览器进程和 Web 服务器进程通过 Socket 传输数据)。

🔄 系统调用 vs 库函数

  • 系统调用:直接调用内核提供的接口(比如open()对应内核的sys_open()函数),是用户态进入内核态的「唯一通道」。双击 Firefox 时,execve()就是系统调用,告诉内核「我要运行这个程序」。
  • 库函数:对系统调用的封装(比如 C 语言的printf()最终会调用系统调用write()),目的是让程序员写代码更方便。比如你不需要记住write()的参数顺序,直接用printf(“%d”, num)即可。

库函数通常由以下几个主体提供:

  1. 编程语言标准库
    概述:每种编程语言都会定义并提供一套标准库,这些库函数是语言的重要组成部分,为开发者提供了基础且常用的功能。
  • 示例
    • C 语言:C 标准库提供了大量的库函数,像字符串处理函数 strcpy()、strlen(),数学运算函数 sin()、cos()等。这些函数由 C 语言标准委员会(如 ISO C)定义,不同的编译器(如 GCC、Clang)会按照标准实现这些库函数。
    • Python:Python 的标准库十分丰富,涵盖了文件操作、网络编程、数据处理等多个领域。例如 os 模块提供了与操作系统交互的函数,datetime 模块用于处理日期和时间。Python 解释器自带这些标准库,开发者可以直接使用。
  1. 操作系统相关库
    概述:操作系统为了方便开发者进行系统级编程,会提供一些特定的库函数。这些库函数通常与操作系统的功能紧密相关,如文件系统操作、进程管理、网络通信等。
  • 示例
    • Windows 操作系统:提供了 Windows API(应用程序编程接口),这是一系列的库函数,用于开发 Windows平台的应用程序。例如,CreateProcess() 函数用于创建新的进程,MessageBox() 函数用于显示消息框。
    • Linux操作系统:提供了丰富的系统调用封装库,如 glibc(GNU C 库)。glibc 不仅包含了 C 标准库的实现,还对 Linux系统调用进行了封装,方便开发者使用。例如,fopen() 函数是对 open() 系统调用的封装,用于文件打开操作。
  1. 第三方库
    概述:除了编程语言标准库和操作系统相关库,还有大量的第三方库可供开发者使用。这些库由不同的组织、公司或个人开发,用于满足特定的需求,如科学计算、图形处理、机器学习等。
  • 示例
    • NumPy:是 Python 的一个第三方库,用于进行高效的数值计算。它提供了多维数组对象和各种数学函数,大大提高了 Python在科学计算领域的性能。
    • OpenCV:是一个开源的计算机视觉库,提供了大量的图像处理和计算机视觉算法,可用于图像识别、目标检测、视频分析等领域。开发者可以在自己的项目中集成这些第三方库,以快速实现特定的功能。

四、广义的 OS 与狭义的 OS

1. 狭义的操作系统

定义
狭义的操作系统仅指操作系统的核心功能层,即 内核(Kernel) 及其相关底层机制,是操作系统中最核心、最底层的软件模块。

典型示例

  • Linux 内核(linux-kernel)、Windows 内核(NT Kernel)、macOS 内核(XNU)等。

2. 广义的操作系统

定义
广义的操作系统是指以内核为核心,包含用户空间所有配套软件和工具的完整软件系统,覆盖从底层硬件控制到上层用户交互的全链条。

组成部分

  1. 内核(狭义OS)
    • 同上述狭义定义,是广义OS的核心底层。
  2. 系统工具与实用程序
    • Shell:命令行交互界面(如Linux的Bash、Windows的PowerShell),解析用户命令并调用系统功能。
    • 文件管理工具:资源管理器(Windows)、文件浏览器(Linux GUI)、磁盘分区工具(如fdisk)等。
    • 系统服务:后台运行的守护进程(Daemon),如网络服务(DNS、DHCP)、日志服务等。
  3. 用户接口与图形环境
    • 图形用户界面(GUI):窗口管理器(如Linux的GNOME/KDE、Windows的Explorer)、桌面环境、图标/菜单系统等。
    • 输入输出支持:鼠标、键盘、显示器的驱动及交互逻辑,多媒体处理(音频/视频解码)等。
  4. 系统库与开发接口
    • 运行时库:对系统调用的封装(如C语言的glibc、Windows的MSVCRT),简化用户程序开发。
    • API(应用程序接口):供开发者调用的接口(如POSIX标准、Windows API),屏蔽底层硬件差异。
  5. 预装应用与服务
    • 基础应用程序(如文本编辑器、计算器、浏览器)、安全机制(权限管理、防火墙)、网络协议栈(TCP/IP、WiFi驱动)等。

典型示例

  • 完整的操作系统发行版,如 Ubuntu(内核+GNOME桌面+系统工具+预装软件)、Windows 10(NT内核+资源管理器+PowerShell+UWP应用)、Android(Linux内核+Java运行时+系统应用+图形框架)。

两者的关系可类比为“发动机”(狭义内核)与“整车”(广义OS):内核提供动力,而广义OS在此基础上构建了完整的驾驶舱、交互界面和实用功能。


END

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/79406.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第 11 届蓝桥杯 C++ 青少组中 / 高级组省赛 2020 年真题,选择题详细解释

一、选择题 第 2 题 在二维数组按行优先存储的情况下,元素 a[i][j] 前的元素个数计算如下: 1. **前面的完整行**:共有 i 行,每行 n 个元素,总计 i * n 个元素。 2. **当前行的前面元素**:在行内&#x…

1️⃣7️⃣three.js_OrbitControls相机控制器

17、相机轨道控制器 3D虚拟工厂在线体验相机轨道控制器OrbitControls 它是 Three.js 中最常用的交互控制器之一,专门用于通过鼠标/触摸控制相机围绕一个目标点(target)旋转、缩放和平移。import {OrbitControls } from three/addons/controls/OrbitControls.js; const cont…

以下是在 Ubuntu 上的几款PDF 阅读器,涵盖轻量级、功能丰富和特色工具:

默认工具:Evince(GNOME 文档查看器) 特点:Ubuntu 预装,轻量快速,支持基本标注和书签。 安装:已预装,或手动安装: sudo apt install evince功能全面:Okular&…

基于用户场景的汽车行驶工况构建:数据驱动下的能耗优化革命

行业现状:标准工况与用户场景的割裂 全球汽车行业普遍采用WLTC工况进行能耗测试,但其与真实道路场景差异显著。据研究,WLTC工况下车辆能耗数据比实际道路低10%-30%,导致用户对续航虚标投诉激增(数据来源:东…

chili3d调试10 网页元素css node deepwiki 生成圆柱体 生成零件图片

.input是input的外框,.input input是input的内框 沙雕 全部input都换成textarea了 自己的方法用接口定义,把自己的方法pub出去,定义在内部拉出去只是取个值 这其实是mainwindow端pub回来的 窗口pub端把数据pub回 mainwindow端让mainwindow端…

Redis 启用 TLS 加密传输配置

Redis 启用 TLS 加密传输配置 一、Redis TLS 加密概述 Redis 从 6.0 版本开始原生支持 TLS 加密传输,可以保护客户端与服务器之间的通信安全,防止数据被窃听或篡改。 二、准备工作 确认 Redis 版本‌: redis-server --version确保版本 ≥…

【Linux】深入理解程序地址空间

🌟🌟作者主页:ephemerals__ 🌟🌟所属专栏:Linux 目录 前言 一、什么是程序地址空间 二、深入理解程序地址空间 1. 引例 2. 理解地址转化 3. 再谈程序地址空间 4. 补充知识 总结 前言 在现代操作系…

【深度学习-Day 5】Python 快速入门:深度学习的“瑞士军刀”实战指南

Langchain系列文章目录 01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…

解决在 Linux 中 WPS 字体缺失问题

解决在 Linux 中 WPS 字体缺失问题 安装方式 安装方式 首先下载你所需要的字体文件 在字体文件所在的目录下右键点击在命令行中打开 或 Open in Terminal sudo mkdir /usr/share/fonts/myfontssudo cp ./* /usr/share/fonts/myfonts执行命令,更新字体缓存 sudo fc…

668SJBH报刊发行系统

1 前言 随着我国信息产业的迅猛发展,手工管理方式已不适应社务管理的要求,报社的日常管理正面临着信息化的挑战,采用计算机管理以提高服务质量和管理水平势在必行。发行管理是社务管理的一个重要组成部分,是报社和客户联系的纽带…

K8S - 从零构建 Docker 镜像与容器

一、基础概念 1.1 镜像(Image) “软件的标准化安装包” ,包含代码、环境和配置的只读模板。 技术解析 镜像由多个层组成,每层对应一个Dockerfile指令: 应用代码 → 运行时环境 → 系统工具链 → 启动配置核心特性…

better_fbx 下载

目录 v6.0.5下载: better_fbx 下载 v6.0.5下载: Blender FBX模型导入导出插件 Better FBX Importer & Exporter V6.0.5V5.4.10 For Blender 2.8 | 龋齿一号GFXCamp better_fbx 下载 How To Install Launch Blender, navigate to Edit->User P…

Spring AOP 典型应用场景

AOP 典型应用场景 1. 日志记录(Logging)代码实现 2. 权限校验(Authentication)代码实现 3. 性能监控(Performance Monitoring)代码实现 4. 缓存处理(Caching)代码实现 5. 重试机制&a…

开始一个vue项目-day2

这次新增的功能有: 1、使用cookie存储token 参考网站:https://vueuse.org/ 安装包: npm i vueuse/integrations npm i universal-cookie^7 2、cookie的设置读取和删除,代码:composables/auth.js import { useCookies } from …

「Mac畅玩AIGC与多模态18」开发篇14 - 多字段输出与结构控制工作流示例

一、概述 本篇在输入变量基础上,演示如何通过执行 LLM 节点输出多个结构化字段,并传递至结束节点。开发人员将掌握如何配置结构化输出格式,实现提示词与字段的准确映射,为后续引入条件判断、循环结构等逻辑控制建立结构输出规范基础。 二、环境准备 macOS 系统Dify 平台已…

JWT解析

什么是JWT JSON Web Token (JWT) 是一种开放标准 (RFC 7519),它定义了一种紧凑且独立的方式,用于在各方之间以 JSON 对象的形式安全地传输信息。此信息可以验证和信任,因为它是经过数字签名的。…

C语言中的自定义类型 —— 结构体.位段.联合体和枚举

自定义类型 1. 前言2. 结构体2.1 结构体的声明2.2 结构体变量的定义和初始化2.3 结构体的特殊声明2.4 结构体的自引用2.5 结构体的内存对齐2.6 修改默认对齐数2.7 结构体传参 3. 位段4. 联合体5. 枚举6. 结言 1. 前言 在C语言中已经为用过户提供了内置类型,如&…

StarRocks 查询优化器深度解析

StarRocks 查询优化器概览 1. Development History of StarRocks 过去五年,StarRocks 发布了三个大版本: StarRocks 1.0:通过向量化引擎和 CBO,打造极速 OLAP 数据库。 StarRocks 2.0:通过主键模型、数据湖分析和查询…

如何提高情商?(优化版)

引言 提高情商(EQ)是一个需要长期练习和自我反思的过程,核心在于理解自己、管理情绪、共情他人并有效沟通。以下是一些具体且可操作的方法,结合理论和实际场景,帮助你逐步提升: 一、核心方法:…

Python爬虫实战:获取好大夫在线各专业全国医院排行榜数据并分析,为患者就医做参考

一、引言 在当今医疗资源丰富但分布不均的背景下,患者在选择合适的心血管内科医院时面临诸多困难。好大夫在线提供的医院排行榜数据包含了医院排名、线上服务得分、患者评价得分等重要信息,对患者选择医院具有重要的参考价值。本研究通过爬取该排行榜数据,并进行深入分析,…