Linux
未读进程控制 —— 进程创建一、fork() 函数基础1. fork() 的作用
创建子进程:通过复制父进程的地址空间生成一个新进程。
调用一次,返回两次:
父进程返回子进程的 PID(即 > 0 or 正数)。
子进程返回 0。
失败返回 -1。
1pid_t fork(void);
2. 写时拷贝(Copy-On-Write, COW)
机制:fork 时不会立刻复制父进程的所有内存页。fork() 后,父子进程 共享物理内存(共享内存页(只读)),直到一方尝试修改数据时,内核才复制该内存页。
修改时触发“页错误”
操作系统才会为该进程分配新的物理页,完成“真正拷贝”
优点:
提升效率: 减少 fork() 的开销(避免立即复制全部内存)。
节省内存开销: 节省物理内存(共享未修改的页)。
[!NOTE]
通常,父子代码共享,父子再不写入时,数据也是共享的,当任意一方试图写入,便以写时拷贝的方式各自一份副本。具体见下图:
二、代码示例示例 1:基础 fork() 使用123456789101112#include <stdio.h ...
Linux
未读程序地址空间入门程序的 地址空间 是操作系统为每个程序分配的内存区域,它决定了程序如何访问存储在计算机内存中的数据。程序地址空间包括了多个部分,每一部分有不同的用途。通过合理管理地址空间,操作系统可以有效地进行内存分配和保护。
1. 地址空间的划分程序的地址空间通常分为多个段,每个段具有不同的功能。这些段的划分通常是由操作系统定义的。下图是基于 kernel 2.6.32 和 32位平台 的典型空间布局图:
然而,一个标准的程序地址空间布局图(32 位系统)包括:
更详细点来说则是:
1234567891011121314151617181920212223242526+------------------------+ <-- 0xC0000000(内核空间起始,用户不可访问) | 内核空间 | +------------------------+ <-- 0xBFFFFFFF(用户空间结束) | 栈(Stack) | ↓ 向低地址增长 | - 主线程栈 | +------ ...
Linux 2.6内核进程调度队列(了解)
更多文章 | CSDN
更多文章 | 知乎
更多文章 | 腾讯云
Linux 2.6 内核在进程调度方面引入了 O(1) 调度器,该调度器的核心目标是保证调度决策的时间复杂度为恒定时间 O(1),即无论系统中有多少个进程,调度器的决策时间始终保持不变。这个设计对于大规模系统具有重要意义,可以有效避免调度决策的性能瓶颈。
1. 调度队列结构Linux 2.6 内核的进程调度通过多个调度队列进行管理,核心数据结构是 运行队列(Runqueue),每个 CPU 核心都维护一个独立的运行队列。运行队列(Runqueue):每个 CPU 核心维护一个独立的运行队列,队列内包含当前可运行的进程。运行队列结构主要由以下几个组件组成:
优先级数组:
活跃数组(Active Array):存放当前可运行的进程,按优先级分为 140 个队列(0~139)。
0~99:实时进程(RT进程,如硬实时任务)。
100~139:普通进程(分时进程,如用户程序)。
过期数组(Expired Array):存放已经用完时间片的进程,结构与活跃数组相同。
时间片管 ...
环境变量1. 什么是环境变量?环境变量(Environment Variables)是操作系统中用于指定系统运行环境参数的一组动态键值对。每个环境变量由一个 名称(键) 和一个 值 组成,用于存储应用程序或系统需要访问的配置信息。例如:
名称:PATH
值:/usr/bin:/usr/local/bin
环境变量的作用类似于操作系统的“配置开关”,可以影响程序的运行行为、路径搜索、资源访问等。
1. 环境变量的分类根据作用范围和修改权限,环境变量可分为两类:
1. 用户环境变量(User Variables)
作用范围:仅对当前用户生效。
用途:存储用户个性化配置(如用户专属的软件路径)。
2. 系统环境变量(System Variables)
作用范围:对所有用户和系统进程生效。
用途:存储全局配置(如系统工具路径、公共依赖库路径)。
3. 临时环境变量
作用:仅在当前终端会话或子进程中有效。
2. 和环境变量相关的命令
echo:显示某个环境变量值
export:设置一个新的环境变量
env:显示所有环境变量
unset: 清除环境变量
set:显示本地定义的 shell ...
Linux
未读进程状态和优先级
[!TIP]
相关推荐视频 | B站
一、进程状态分类Linux 中的进程状态可以通过 ps 命令或者 top 命令来查看,常见的状态码有以下几种:
状态码
名称
含义说明
R
运行(Running)
进程正在运行或处于可运行状态(等待 CPU 调度)
S
可中断睡眠(Sleeping)
进程正在等待某个事件(如 I/O、信号等),可以被信号或外部事件唤醒
D
不可中断睡眠(Uninterruptible Sleep)
进程正等待 无法被信号唤醒 的事件(如磁盘 I/O),一般出现在设备驱动程序中,例如正在等待硬件操作
T
停止(Stopped/Traced)
进程已被暂停执行,例如收到了 SIGSTOP 信号,或者在被调试时被暂停。
Z
僵尸(Zombie)
子进程已结束/终止,但父进程未回收它的资源(PID 和退出状态仍占用系统资源),导致进程表里留有“尸体”
X
死亡(Dead)
进程已彻底终止,且不会再存在于进程表中(非常短暂极少见,用户通常看不到)
特殊状态说明
僵尸进程 ...
Linux
未读深入理解 Linux 进程管理一、管理哲学/本质:先描述,再组织(校长如何管理学校?)一个操作系统不仅仅只能运行一个进程,可以同时运行多个进程。操作系统的进程管理:先描述,在组织 → 任何一个进程。在操作系统中,管理任何对象,最终都可以转化成为对某种数据结构的增删查改。想象你是一所大学的校长,管理数万名学生。你不需要认识每个学生,只需通过 学生档案系统 管理:
描述:每个学生有专属档案(学号、姓名、专业、成绩、宿舍号…)
组织:档案按学院 → 专业 → 班级形成 链表结构
管理:调整专业只需修改档案中的“专业”字段,开除学生只需删除对应档案(增删查改)
操作系统管理进程同理:
描述:为每个进程创建 task_struct(进程的“档案”)
组织:通过链表、队列等数据结构管理所有 task_struct
控制:调整优先级、终止进程等操作只需修改对应结构体
数据结构的作用
学校:学生档案链表 → 管理学生 增删查改(如入学、转班、退学)。
操作系统:进程 PCB 链表 → 管理进程的创建、调度、终止等。
二、进程的定义与核心概念1. 什么是进程?
进程 = ...
Linux
未读冯 ・ 诺依曼体系结构:计算机世界的基石在计算机科学中,冯诺依曼体系结构(Von Neumann Architecture) 是一种广泛采用的计算机架构模型,几乎所有现代计算机系统都基于此架构设计。它是由著名的数学家约翰·冯·诺依曼于 1945 年提出的,至今仍在各类计算机硬件的设计中占据主导地位。冯诺依曼体系结构的核心思想可以简单总结为:计算机由内存、CPU、输入输出设备、总线和外设组成,且指令和数据存储在同一个内存中。
1. 冯诺依曼体系结构的组成冯诺依曼体系结构主要包括以下几个基本组成部分:
CPU(中央处理单元)CPU 是计算机的大脑,负责执行程序指令和数据处理。在冯诺依曼架构中,CPU 被分为两个主要部分:
运算器(ALU):负责执行各种算术运算和逻辑运算。
控制器:负责指挥计算机其他部分的工作,协调不同部件的操作。
内存内存是冯诺依曼体系结构中存储数据和程序指令的地方。程序在执行时,首先会被加载到内存中,而后由 CPU 进行处理。
输入输出设备输入设备如键盘、鼠标、摄像头等,用于向计算机提供外部数据;输出设备如显示器、打印机、扬声器等,则用于将计算机的处理结果反 ...
STL 简介:从入门到应用全面解析一、什么是 STL?STL(Standard Template Library,标准模板库) 是 C++标准库的核心组成部分,它不仅是一个可复用的组件库,更是一个 集数据结构与算法于一体的软件框架。STL 的设计理念是“泛型编程”,通过模板技术实现代码的高度复用,使开发者无需重复造轮子即可高效完成开发。
二、STL 的版本发展
HP 版本由 Alexander Stepanov 和 Meng Lee 在 惠普实验室 开发,是 STL 的“始祖版本”,开源且允许自由使用和修改,奠定了 STL 的基础架构。
P.J.版本继承自 HP 版本,被 Windows Visual C++采用。缺点是代码可读性较差,符号命名风格独特,且不允许公开修改。
RW 版本由 Rouge Wage 公司开发,应用于 C++ Builder,同样闭源,可读性一般。
SGI 版本Silicon Graphics 公司的实现版本,被 GCC(Linux)采用,以高可读性、良好的可移植性和开放性著称,是学习 STL 源码的主要参考。
三、STL 的六大组件
容器(Cont ...
Linux
未读进度条的实现进度条是用户界面中常见的元素,用于显示任务的完成进度。通过实现一个进度条,可以学习如何在 Linux 下进行简单的用户界面设计,同时也能理解文件链接和代码维护的重要性。结合之前讲的倒计时的代码,我们正式来实现我们 Linux 下第一个小程序 —— 进度条。结合之前讲解的 Linux 文件链接 和考虑到代码的 维护性,依旧采用 头文件 .h、函数体文件 .c、main 函数文件 .c 的三个文件进行讲解:
makefile 的配置为了方便进度条的运行展示,这里给出我的 makefile 配置(第一种旨在理解编译流程,第二种全自动更方便):
1234567891011121314151617181920# 目标文件 processBar 依赖于 processBar.oprocessBar: processBar.o gcc processBar.o -o processBar# 目标文件 processBar.o 依赖于 processBar.sprocessBar.o: processBar.s gcc -c processBar.s -o processBar.o# 目标 ...
Linux 开发工具(下)Linux 项目自动化构建工具 —— make / Makefile1. 什么是 make 和 Makefile?在大型软件项目中,源代码通常散布在多个文件和目录中。为了高效地管理这些文件之间的依赖关系并实现自动化编译,Linux 提供了非常强大的工具 —— make。make 是一个自动化构建工具,它通过读取 Makefile 文件中的规则来决定如何编译和链接程序。Makefile 是一个文本文件,其中定义了项目的依赖关系和构建规则。
为什么需要 make?
自动化构建:手动编译多个源文件并管理它们之间的依赖关系非常繁琐,make 可以自动化这一过程。
增量编译:make 只会重新编译那些被修改的文件及其依赖项,从而节省编译时间。
跨平台兼容:Makefile 可以在不同的平台上使用,只需稍作修改。
2. make 的基本工作原理make 的核心功能是根据文件的修改时间自动判断哪些文件需要重新编译。具体来说,它会根据文件间的依赖关系,确保只有修改过的部分被重新编译,避免无谓的重复编译。
基本逻辑
目标文件与依赖关系 make 通过比较目标文件与 ...