一.操作系统&五大硬件单元

1.冯诺依曼结构(基础认知)

  • 五大部件:
    输入设备、输出设备、存储器、运算器、控制器(后两者组成CPU)
  • 核心特点:
    指令和数据同一存储
    按顺序执行
  • 本质:
    所有软件最终都是在内存中运行的(CPU不直接和硬盘、键盘打交道,所有数据必须先加载到内存。)

2.操作系统目的

  • 操作系统本质是一个“管理软件”,核心目标:
    管理硬件资源
          CPU(调度)
          内存(分配)
          磁盘(文件系统)
    为用户提供接口
          系统调用(System Call)
          shell命令
    总结:OS=管理资源+提供接口
  • 管理的本质:“先描述,再组织”
    描述:用C语言的结构体(如struct)把资源(如进程)的属性记下来
    组织:用链表、红黑树等数据结构把这些结构体串起来,方便管理和查找

3.库函数vs系统调用

在这里插入图片描述
在这里插入图片描述

二.进程概念

1.什么是进程

  • 程序运行起来的实例
  • 操作系统通过PCB(进程控制块)管理进程
  • linux的PCB就是task_struct

2.PCB包含什么(描述信息)

  • 进程ID(PID)
  • 程序计数器(PC)
  • 寄存器信息
  • 内存信息
  • 文件描述符
  • 状态(运行/阻塞等)
    PCB=进程的“身份证+全部信息“

三.进程控制

1.进程创建

  • fork()函数:
    功能:创建一个子进程
    特点:
    ① 调用一次,返回两次
          父进程中返回子进程的PID(>0)
          子进程中返回0
          如果子进程创建失败,父进程返回-1
    写时拷贝:虽然子进程看似复制了父进程的数据,但最初它们共享物理内存。只有当某一方试图修改数据时,系统才会真正分配新内存进行拷贝,这是一种优化技术。
  • vfork()函数:
          子进程和父进程共享地址空间
          子进程先执行,直到子进程调用exec或exit退出时,父进程才运行
          风险:容易破坏父进程
  • 创建流程:
          · 分配PCB
          · 分配资源
          · 初始化上下文
          · 加入调度队列

2.进程终止

  • 正常退出:
    ① exit():一个库函数,会执行一些清理工作(如刷新缓冲区),然后调用系统调用退出。
    ② _exit():一个系统调用,直接清理进程,不刷新缓冲区。
  • 异常退出:如段错误、指令错误等,通常由信号导致。
  • return:在main函数中,return相当于调用exit。

3.进程等待

  • 干什么:父进程等待子进程结束,并回收其资源(主要是PCB)
  • 如何等待:
          wait:阻塞等待任意一个子进程结束
          waitpid:可以指定等待某个子进程,也可以非阻塞等待

四.进程状态

Linux内核中,进程的状态定义在task_struct的state字段中。

1.Linux的七种进程状态

  • R(Running):进程正在运行或在就绪队列中等待
  • S(Sleeping):可中断睡眠(最常见)
  • D(Disk Sleep):不可中断睡眠(通常在等IO)
  • T(Stopped):被信号暂停(如Ctrl+Z)
  • t(Tracing stop):被调试器暂停
  • Z(Zombie):僵尸进程
  • X(Dead):已死亡(基本看不到)

2.状态转换

在这里插入图片描述

3.僵尸进程

  • 定义:子进程退出了,但父进程没有调用wait()或waitpid()来获取它的退出状态而变成的一种进程。
  • 危害:进程的资源(如内存、文件描述符等)已经释放,但task_struct还存在,占用内核资源,如果产生大量僵尸进程,会导致系统无法创建新进程。
  • 解决方法:父进程调用wait()或waitpid(),或捕捉信号 SIGCHLD。

4.孤儿进程

  • 定义:父进程先退出,子进程还在运行。
  • 处理:孤儿进程会被1号进程(init或systemd)“收养”,由1号进程负责回收它的资源。

5.守护进程

  • 定义:长期在后台运行,脱离终端控制,默默提供某种服务的进程。
  • 例子:守护进程名称通常以d结尾,例如sshd(负责ssh连接)、httpd(负责Web服务)

五.环境变量

1.概念

用于存储系统或用户配置信息的变量,以键值对形式存在,通常具有全局属性(如PATH、HOME)。

2.相关命令

Bash:
env:查看当前环境变量,或为单次命令临时设置环境
export:将变量“导出”,使其能被后续的子进程继承

3.函数接口

C:
getenv():获取环境变量的值;
setenv():设置环境变量;
unsetenv():删除环境变量;

4.特性

子进程继承父进程的环境变量,本质在用户空间。

六.虚拟地址空间

1.什么是虚拟地址空间

虚拟地址空间是一个mm_struct结构体,是操作系统向进程描述一个完整的、连续的线性地址空间。
进程看到的地址都是“假内存”,而真实的地址由内存管理,给进程营造一种假象,认为自己独占了整块连续的内存。

2.为什么要使用虚拟地址空间

  • 提高内存利用率
          通过分页机制,将不连续的物理内存碎片拼凑起来给进程使用,让进程感觉内存是连续的。
          程序没运行到的代码不需要加载到内存,节省空间。

  • 增加访问控制
          操作系统可以在页表或段表中设置权限位。例如将代码段设为“只读/可执行”。
          如果程序试图写入代码段(比如病毒注入),CPU会直接拦截并报错(段错误),保护系统安全。

  • 实现进程隔离
          每个进程都有自己独立的虚拟地址空间,互不干扰。
          进程A崩溃不会导致进程B也崩溃,也不会破坏OS内核的数据。

3.如何通过虚拟地址找到物理内存

  • 分段式内存管理
          原理:将内存划分为不同的逻辑段,如代码段、数据段、堆栈段。每个段有基地址和界限。
          寻址:逻辑地址 = 段基址 + 偏移量。
          缺点:容易产生外部碎片(内存空隙太多,无法利用)。
  • 分页式内存管理
          原理:将虚拟内存和物理内存都切割成固定大小的块(通常为4KB),虚拟的叫“页”,物理的叫“页帧”。
          寻址:通过页表来建立虚拟页号和物理页帧号的映射关系。
          优点:解决了外部碎片问题,内存利用率高。
  • 段页式内存管理
          原理:结合上述两者。先分段(逻辑划分),段内再分页(物理管理)。
          流程:逻辑地址 -> 段表 -> 页表 -> 物理地址。

七.程序替换

1.含义

  • 概念:用一个新的程序替换进程正在运行的程序。
  • 关键点:进程ID不变,原程序数据清空,替换为新程序数据。

2.如何替换

在Linux/Unix系统中,程序替换是通过exec系列函数实现的。

  • 常见函数

C:
execl
execlp
execle
execv
l:参数以列表形式传递。
v:参数以指针数组形式传递。
p:可以使用环境变量PATH来查找可执行文件。
e:可以传递新的环境变量。

  • 特点:
    不创建新进程
    替换当前进程代码和数据
    PID不变
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐