Linux
未读进程控制 —— 终止进程 一、进程退出场景 从我们的视角来看进程终止的场景一般就是以下三种: 代码运行完毕,结果正确(一般不关心)。 代码运行完毕,结果不正确。 代码异常终止。 但是进程也可能因多种原因终止,比如: 场景 说明 正常完成任务 程序执行完所有代码逻辑后退出 异常错误终止 遇到不可恢复的错误(如段错误、除零错误) 主动终止 调用退出函数(exit()/_exit())或通过 return 退出 被动终止 收到终止信号(如 SIGKILL、SIGTERM) 被父进程杀死 父进程调用 kill() 函数发送信号,使子进程退出。 看进程终止的角度、进程终止的原因等不同方面来解释进程的终止,虽然说法上不同,但也大同小异,我们只需要记住一点: 所有进程的退出方式都可以归为两大类:正常退出 和 异常退出,而主动或被动,是从行为发起方角度来分的。进程出现异常,本质是我们的进程收到了对应的信号!! 二、进程的退出码 我们都知道 main 函数是代码的入口,但实际上 main 函数只是用户级别代码的入口,main 函数也是被其他函数调用的,也就 ...
使用 Git 从 HTTPS 切换至 SSH 起因是我在 Linux 中使用 git push 推送经常卡住或失败,真的很烦,于是选择 切换成 SSH ,可以提高稳定性和体验,比较适合在 Linux 系统开发环境中长期使用。当然本文的方法也同样适用于 Windows。 1. 确认是否已生成 SSH 密钥对 先检查是否已有 .ssh/id_rsa 文件: 1ls ~/.ssh 如果看到了 id_rsa 和 id_rsa.pub 就说明已经有了密钥对。如果没有,就执行下面的命令生成: 1ssh-keygen -t rsa -b 4096 -C "你的邮箱" 一路回车即可生成(个人使用,建议不设密码短语,会方便些)。 2. 将 SSH 公钥添加到远程仓库平台(如 GitHub / Gitee) 1. 复制公钥内容 1cat ~/.ssh/id_rsa.pub 复制输出的整段文本(以 ssh-rsa 开头,以邮箱结尾)。对应 Windows 实际路径为 C:\Users\你的用户名\.ssh\。 2. 添加到远程平台 1. GitHub: 登录 GitHub。 点击头 ...
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 ...
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:显示本地定义 ...
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) 进程已彻底终止,且不会再存在于进程表中(非常短暂极少见,用户通常看不到) 特殊状态说明 僵尸进程 (Z)(一种比较特殊的状态) 产生 ...
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 的六 ...











