- 博客(93)
- 收藏
- 关注
原创 Linux系统编程 -- 进程控制
本文介绍了Linux进程创建、终止和等待的相关机制。重点讲解了fork函数创建子进程的过程,包括内核分配资源、拷贝数据结构等步骤。分析了进程退出的三种场景,以及exit、_exit等终止方式的区别。详细阐述了进程等待的必要性,对比了wait和waitpid方法,特别是阻塞与非阻塞调用的差异。文章还深入探讨了如何通过status参数获取子进程退出状态,包括正常退出码和异常信号的处理。最后,通过代码示例展示了非阻塞轮询的实现方式,以及父进程在等待子进程时执行其他任务的可能性。这些机制共同保证了进程管理的灵活性和
2025-12-27 11:58:58
908
原创 Linux系统编程 -- 虚拟地址空间
本文深入探讨了Linux系统中的虚拟地址空间概念。通过C语言程序示例分析不同变量在内存中的存储位置,指出程序地址空间并非物理内存而是操作系统为进程虚拟化的地址空间。文章详细解释了虚拟地址空间的本质是一个名为mm_struct的数据结构,其中包含各内存区域的边界信息。通过父子进程案例说明了写时拷贝机制,并阐述了页表在虚拟地址与物理地址映射中的作用。最后总结了虚拟地址空间的三大优势:将无序地址有序化、保护物理内存安全、解耦进程与内存管理。全文强调理解虚拟地址空间对掌握操作系统原理和编程语言底层机制的重要性。
2025-12-19 20:22:08
983
原创 Linux系统编程 -- 命令行参数和环境变量
本文介绍了环境变量和命令行参数的基本概念及应用。环境变量是操作系统运行环境的关键参数,PATH变量定义了系统查找可执行程序的默认路径。命令行参数通过main函数的argc和argv实现程序功能选择,解释了Linux命令选项的工作原理。文章详细说明了环境变量的查看、设置和获取方法,包括通过main函数、getenv和environ三种方式。同时区分了环境变量与本地变量的区别,前者具有全局性可被子进程继承,后者仅限当前shell使用。最后介绍了内建命令的特殊性,解释了为什么某些命令不受环境变量修改影响。这些知识
2025-12-17 16:32:45
534
原创 Linux系统编程 -- 进程优先级、切换和调度
本文摘要:进程优先级是决定CPU资源分配顺序的关键机制,数值越小优先级越高。在分时操作系统中,优先级通过PRI和NI值共同决定(PRI(new)=PRI(old)+nice),其中nice值允许用户小范围调整(-20到19)。Linux采用O(1)调度算法,使用双队列结构(active/expired)避免进程饥饿,通过位图快速定位待执行进程。进程切换需要保存和恢复CPU寄存器中的上下文数据,时间片机制确保公平性。系统通过UID识别进程权限,优先级与权限本质不同:前者决定执行顺序,后者决定访问资格。
2025-12-15 14:04:23
861
原创 Linux系统编程 -- 进程(二)
本文详细讲解了Linux进程状态的原理与实现。主要内容包括:1) 进程状态本质是task_struct结构体中的整型变量;2) 三种核心状态:运行态(在调度队列)、阻塞态(等待设备资源)和挂起态(内存不足时交换到磁盘);3) Linux特有的进程状态:R运行、S可中断睡眠、D不可中断睡眠、T停止、t追踪停止、Z僵尸状态;4) 重点解释了D状态防止数据丢失的机制,以及Z状态导致的内存泄漏问题;5) 介绍了Linux内核链表的独特设计,使PCB能同时存在于多个队列。通过设备队列、调度队列等实例,阐述了进程状态变
2025-11-30 17:22:20
774
原创 Linux系统编程 -- 进程概念(一)
本文探讨了计算机系统中进程的本质和管理机制。文章提出"先描述,再组织"的管理理念,指出进程是内核数据结构(PCB)与程序代码数据的组合体。通过类比简历筛选的过程,形象解释了PCB作为进程描述的作用。详细介绍了进程的组织方式(双链表)、标识方法(pid/ppid)以及父子进程关系,强调进程的独立性通过数据结构隔离和写时拷贝技术实现。文章还演示了如何查看进程信息、修改工作目录等操作,深入解析了fork函数创建子进程的机制及其独特的两返回值特性,揭示了操作系统通过PCB管理进程的底层逻辑。
2025-10-30 18:42:01
800
原创 Linux系统编程 -- 操作系统概念
冯诺依曼体系结构是现代计算机的基础架构,由输入设备、中央处理器(CPU)、输出设备和存储器组成。CPU只能与内存直接交互,外设需通过内存与CPU通信。该架构通过分级存储解决了CPU与外设速度不匹配的问题,提高了性价比。操作系统作为管理软件,采用先描述,再组织的方式管理软硬件资源,通过系统调用和库函数为应用程序提供执行环境。这种层状结构设计实现了高内聚低耦合,便于维护和扩展。计算机管理本质上是数据管理,数据结构将现实管理模型转化为结构化数据,现代编程语言普遍采用面向对象方法,遵循先描述,再组织的原则。
2025-10-03 18:58:25
969
原创 Linux系统编程 -- 开发工具
本文介绍了Linux系统下的编程开发工具链,包括软件包管理、编辑器、编译器、构建工具和调试器的使用。首先讲解了yum包管理器的安装与使用,对比了源码安装、rpm安装和包管理器安装的优劣。随后详细介绍了vim编辑器的多模式操作和常用命令,包括文本编辑、保存退出等。在编译器部分,阐述了gcc/g++的编译流程(预处理、编译、汇编、链接)和动静态库的区别。接着讲解了make/Makefile的项目自动化构建,包括依赖关系、伪目标和变量定义。还演示了命令行进度条的实现原理。最后介绍了git版本控制的基本操作
2025-09-20 15:51:35
683
原创 Linux -- 权限的理解
Linux Shell 与权限机制解析 Shell 是 Linux 系统的命令行解释器,作为用户与内核(kernel)间的中介:#表示 root 用户提示符,$表示普通用户。Shell 通过创建子进程执行命令,保护内核安全,类似媒婆说媒的比喻。 Linux 采用多用户权限管理: 用户分为 root(超级用户)和普通用户,通过 su/sudo 切换权限 权限控制基于角色(拥有者/所属组/other)和操作(r/w/x) 文件权限通过 chmod(数字/符号模式)、chown/chgrp 修改 目录需 x 权限
2025-09-13 17:31:07
994
原创 Linux系统编程 -- 基本指令
前言声明:本文中使用的Linux操作工具为xshell,系统为ubuntu。本文会列出常用基本指令和其选项,但是指令本身并不是重点,也无需死记硬背,重点是指令背后所携带出来的linux相关知识点,即知识补充和拓展。前言linux是工程师使用比较多的系统,像windows当中我们用的更多是图形界面的操作方式,其实所谓的图形界面也只是为了让人们更好的使用操作系统罢了。在操作系统诞生之初,所有的操作系统在进行操作(例如启动任务)时,全部都是黑屏+指令。
2025-03-13 17:23:07
929
原创 C++ -- 异常
有时catch到一个异常对象后,需要对错误进行分类,其中的某种异常错误需要进行特殊的处理,其他错误则重新抛出异常给外层调用链处理。捕获异常后需要重新抛出,直接throw;就可以把捕获的对象直接抛出。C++标准库也定义了一套自己的异常继承体系库,基类是exception,所以我们日常写程序,需要在主函数捕获exception即可,要获取异常信息,调用what函数,what函数是一个虚函数,派生类可以重写。
2025-02-09 18:19:44
695
原创 C++11
C++11是C++的第二个重要版本,并且是自C++98之后总重要的一次更新。它引入了大量更改,标准化了已有实践,并改进了对C++程序员可用的抽象。在它最终由ISO在2011年8月12日采纳前,人们曾使用名称“C++ 0x”,因为它曾被期待在2010年之前发布。C++03与C++11期间花了8年时间,故而这是迄今为止最长的版本间隔。从那之后,C++就有规律的每三年更新一次。
2025-01-15 23:23:57
914
原创 C++ -- 哈希表封装实现unordered_map 和 unordered_set
本章内容分为源码看框架讲解和结构模拟实现两部分,源码框架是让我们了解容器结构在设计时的思路,模拟实现才是重点。因此如果在看源码结构式感到疑惑,不妨继续往下看,相信一切都会慢慢了解~
2024-12-16 20:04:02
806
原创 C++ -- unordered_set和unordered_map
unordered_set 的声明如下,key 就是 unordered_set 底层关键字的类型。unordered_set 默认要求 key 支持转换为整形,如果不支持或者想按自己的需求走可以自行实现支持将 key 转换成整形的仿函数传给第二个模板参数。unordered_set 默认要求 key 支持比较相等,如果不支持或者想按自己的新需求走可以自行实现支持将key比较相等的仿函数传给第三模板参数。
2024-12-05 11:22:38
1106
原创 数据结构进阶(C++) -- 红黑树的模拟实现
红黑树和AVL树一样,也是一棵二叉搜索树,相较于AVL树,它的每个节点没有平衡因子,但是增加了一个表示颜色的变量,红黑树确保没有一条路径会比其他录径长出2倍,因而是接近平衡的,虽然没有AVL树那般无限接近平衡,但也比AVL树在插入时少旋转了很多次,在综合效率上是红黑树更优。
2024-11-29 20:41:12
906
原创 数据结构进阶(C++) -- AVL树的实现
1962年,前苏联的科学家G.M.Adelson-Velsky和E.M.Landis 在论文《An algorithm for the organization of information》中发表了AVL树。AVL树是最先发明的自平衡二叉搜索树,AVL树可以是一棵空树,也可以是具备下列性质的二叉搜索树:1、它的左右子树都是AVL树。2、左右子树的高度差的绝对值不超过1。由此可见,AVL树是一棵高度平衡的二叉搜索树,通过控制高度差来控制平衡。
2024-11-24 11:16:21
1025
原创 C++标准模板库 -- map和set
set 声明如上,T就是 set 底层关键字 key 的类型。set 默认要求 T 支持小于比较(Less<T>),如果不支持或者想按自己的需求走可以自行实现仿函数传给第二个模板参数。set 底层存储数据的内存是从空间配置器申请的,如果有需要可以实现自己的内存池,传给第三个参数。但一般情况下,我们都不需要传后两个模板参数。set 底层使用红黑树实现的,增删查的效率是O(LogN),迭代器遍历是走的二叉搜索树的中序遍历,所以遍历是有序的。
2024-11-18 17:42:40
1305
原创 数据结构 -- 二叉搜索树
场景2:商场无人值守车库,入口进场时扫描车牌,记录车牌和入场时间,出口离场时,扫描车牌,查找入场时间,用当前时间减入场时间计算出停车时长,计算出停车费用,缴费后抬杆,车辆离场。场景1:校区无人值守车库,校区车库买了车位的业主才能进小区,那么物业会把买了车位的业主的车牌号录入后台系统,车辆进入时扫描车牌在不在系统中,在就允许进入,不再则不能进入。场景3:统计⼀篇文章中单词出现的次数,读取⼀个单词,查找单词是否存在,不存在这个说明第⼀次出现,(单词,1),单词存在,则++单词对应的次数。
2024-11-15 20:48:32
852
原创 Linux -- 初步认识
操作系统(Operating System,简称OS)是计算机系统中不可或缺的核心部分,它负责管理和控制计算机的硬件和软件资源,为用户提供一个良好的工作环境和交互界面。操作系统是一个大型的程序系统,它负责计算机的全部软、硬件资源的分配、调度工作,控制并协调多个任务的活动,实现信息的存取和保护。同时,操作系统还提供了用户接口,使用户能够方便地运行程序、访问文件和管理系统设置。
2024-11-12 18:56:43
774
1
原创 C++ -- 多态与虚函数
多态是一个继承关系下的类对象,去调用同一函数时产生了不同的行为。比如Student继承了Person。Person对象买票为全家,而Student对象买票则会有折扣。
2024-11-09 20:50:05
789
原创 C++ -- 继承
了解了继承出现的原因之后,我们来看看继承的定义。在上面的代码中,Person类中的成员都继承给了 Student 和 Teacher 类,我们将 Person 称为基类(父类),Student 和 Teacher 成为派生类(子类)。
2024-11-07 18:38:51
806
原创 算法每日练 -- 双指针篇(持续更新中)
常见的双指针有两种形式,一种是对撞指针(左右指针),一种是快慢指针(前后指针)。需要注意这里的双指针不是 int* 之类的类型指针,而是使用数组下标模拟地址来进行遍历的方式。
2024-11-06 11:12:44
887
原创 C++ -- 模板进阶
一个程序/项目由若干源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件链接起来形成单一的可执行文件的过程称为分离编译模式。模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生。增强了代码的灵活性。模板会导致会导致代码代码膨胀问题,也会导致编译时间变长。出现模板编译错误时,错误信息非常凌乱,不易定位错误。
2024-11-02 20:20:37
921
原创 C++标准模板库--栈和队列
优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元素)。优先级队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从特定容器的“尾部”弹出,其称为优先队列的顶部。底层容器可以是任何标准容器类模板,也可以是其他特定设计的容器类。
2024-10-31 20:21:55
1116
原创 C++标准模板库--list
list 是序列容器,允许在序列内的任何位置进行常量时间的插入和删除操作,以及两个方向的迭代。列表容器被实现为双向带头链表;双链表可以将它们包含的每个元素存储在不同且不相关的存储位置。排序是通过与前面元素的链接和后面元素的链接的每个元素的关联在内部保持的。它们与非常相似:主要区别在于对象是单链表,因此它们只能向前迭代,以换取更小和更高效。
2024-10-20 16:40:22
942
原创 C++标准模板库--vector
vector(向量)是一种序列容器,表示为可以改变大小的数组。vector中的元素使用连续的存储位置,这意味着也可以使用指向其元素的常规指针+偏移量来访问任意元素,且与数组一样高效。但与数组不同的是,vector的大小可以动态变化,容器会自动处理他们的存储空间。在其内部,vector使用动态分配的数组来存储他们的元素。当插入新元素需要增大容量时,存储空间需要重新分配,这意味着需要分配一个新数组并将所有元素移动到其中。
2024-10-18 18:03:17
1425
原创 C++标准模板库--string
STL(standard template libaray - 标准模板库)是C++标准库的重要组成部分,不仅是一个可复用的组件库,还是一个包罗了数据结构与算法的软件框架。对于STL的学习,第一步是要熟练使用STL,第二步是了解泛型技术的内涵和STL的原理并进行实操,第三步是对STL进行扩展。所以接下来的一段时间,我会将STL的各种容器和重要函数进行讲解,首先从string开始。
2024-10-09 20:45:03
1275
原创 C++必备知识--模板
在学习了函数重载之后,我们了解了不同参数的同名函数是可以构成重载的,这种方式便利了调用类型不同但功能相同的函数,使得我们编写代码更加得心应手,但是也会让我们做很多重复的工作,导致代码冗余。那么如何实现一个各种类型通用的函数呢,这就需要了解泛型编程的基础概念,我们以交换函数为例:针对这些问题,我们C++的祖师爷 Bjarne Stroustrup 创造了模板。如果在C++中能够存在一种模具,通过给模具填充不同的类型就能获得对应具体类型的代码,那将会节省大量重复不必要的工作。
2024-08-07 17:18:01
661
原创 C++必备知识--类和对象
class是类的关键字,Stack是类的名字(自己定义的),在{}中定义类的主体。C++中类的出现是为了替代C语言中的结构体,所以类的结构与结构体类似,{}之后需要加分号。类体中的内容称为类的成员,类中(声明)的变量称为类的属性或成员变量,类中的函数称为类的方法或成员函数。在C++中也兼容了C语言中结构体的用法,并将 struct 升级成了类,也就是说C++中的 struct 内也可以定义函数,但是一般情况下我们还是优先使用class。除此之外,定义在类里的成员函数默认是inline内联函数。
2024-07-30 14:43:24
1251
原创 C++入门基础
• 定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。命名空间中可以定义变量/函数/类型等。• namespace本质上是定义出了一个域,这个域跟全局域各自独立,不同域可以定义同名变量,所以上面的rand不在冲突了。• C++中的域分为函数局部域、全局域、命名空间域和类域;域影响的是编译时语法查找的一个变量/函数/类型出处(声明或定义)的逻辑,所以有了域隔离,名字冲突就解决了。
2024-07-23 15:50:20
1270
原创 MATLAB的基础知识
1. 在每行语句后面加上英文分号表示不在显示运行结果。a = 3;a = 52. 多行注释快捷键,CTRL+R。3. 取消多行注释,CTRL+T。4. 清空工作区的所有变量使用clear。5. 清空命令行窗口的所有变量使用clc。6. clc和clear一起使用,起到初始化的作用,防止之前的结果对新脚本文件(后缀名为.m的文件)产生干扰。
2024-07-20 09:33:23
1269
原创 数据结构--排序
1.元素集合接近有序,直接插入排序算法的时间效率越高。2.时间复杂度:O(N^2)3.空间复杂度:O(1)。4.稳定性:稳定。
2024-07-18 16:31:49
1258
1
原创 数据结构--二叉树(二)
链式二叉树是链式树集合中的一种,该树的每个根节点最多只有两个孩子节点,我们一般用左右孩子来称呼,在初学链式二叉树时,由于大家对链式二叉树的结构掌握还不够深入,为了降低本章的学习难度及成本,我们先手动创建一棵简易二叉树,快速进入二叉树的操作学习中,等所有基本操作大家都掌握后,我们再来了解如何创建链式二叉树。构建的二叉树结构如图;我们先来回顾一下二叉树的概念,二叉树是:1. 空树。2. 非空:根结点,根结点的左子树、根结点的右子树组成的。
2024-06-08 15:50:52
1205
原创 数据结构--二叉树
一棵二叉树是节点的一个有限集合,该集合或者为空或者由根节点加上两棵别称为左子树和柚子树的二叉树组成。从图中可以看出:1、二叉树不存在度大于2的节点。2、二叉树的子树有左右之分,次序不可颠倒,因此二叉树为有序树。
2024-06-01 11:57:49
1378
原创 数据结构--树
在本节开始之前我们先来了解一下在树的学习中,我们需要了解哪些概念。叶节点或终端节点:度为0的节点称为叶节点;如上图:B、C、H、I...等结点为叶结点。。双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的双亲节点;如上图:A是B的父结点。孩子节点或子节点:一个节点含有子树的根节点称为该节点的子节点;如上图:B是A的孩子结点。树的高度或深度:树中节点的最大层次;如上图:树的高度为4。非终端结点或分支结点:度不为0的结点;如上图:D、E、F、G...等结点为分支结点。
2024-05-27 21:08:19
759
原创 数据结构--栈和队列
栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据的插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的元素遵守后进先出LIFO(Last In First Out)的原则。压栈:栈的插入操作被称为进栈/压栈/入栈,入数据的地方为栈顶、出栈:栈的删除操作叫做出栈。出数据也在栈顶。出栈、入栈的过程我们可以想象为我们往羽毛球筒里放羽毛球和拿羽毛球,都是只能在一个口进出,是不是可以很形象的想象出来。下面我们来看一看栈是如何实现的。
2024-05-22 14:28:12
1065
原创 数据结构--顺序表和链表的区别
顺序表和链表之间各有优劣,我们不能以偏概全,所以我们在使用时要关注任务的注重点,以此来确定我们要使用两者中的哪一个。
2024-05-10 20:13:19
698
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅