- 博客(84)
- 收藏
- 关注
原创 Linux的多线程
本文介绍了多线程编程中的线程同步与线程安全机制,主要包括互斥锁、条件变量、POSIX信号量及其封装实现。重点分析了互斥锁的原理与应用,通过票务系统示例演示了如何避免共享资源竞争;详细讲解了条件变量的等待唤醒机制及其在生产者-消费者模型中的应用;系统阐述了信号量的P/V操作及其线程同步功能。同时剖析了死锁的四个必要条件及避免方法,并探讨了STL容器和智能指针的线程安全性问题,最后通过信号处理中的死锁案例说明了线程安全与可重入性的区别。
2025-09-13 20:22:23
735
28
原创 Linux的线程概念与控制
首先Linux内核不区分"进程"和"线程",统一用task_struct管理。CPU处理的是一个个task_struct。进程1个或多个task_struct(PCB) +代码和数据线程(轻量级进程) =1个task_struct(PCB) (它通过指针共享了其所属进程的代码和数据我们之前讲的传统的进程是一个主线程。一个进程的多个task_struct(PCB),被认为是多个轻量级进程,主轻量级进程的id即lwp(light weight peocess)与进程的pid相同。
2025-08-24 16:55:02
1048
48
原创 Linux的进程信号
文章摘要:本文系统介绍了Linux信号机制,包括信号概念、产生方式(键盘、函数、系统命令等)、信号保存机制(pending和block位图)以及三种处理方式(默认、忽略和自定义捕捉)。详细讲解了signal()和sigaction()函数的使用,并探讨了操作系统运行原理(硬件/软中断、用户/内核态)。最后补充了可重入函数、volatile关键字和SIGCHLD信号处理三个实用知识点,帮助开发者更好地理解和运用信号机制进行进程控制。全文通过代码示例和原理分析,为Linux信号编程提供了全面指导。
2025-08-13 16:51:49
1479
59
原创 Linux的进程间通信
本文摘要:本文系统介绍了Linux系统中进程间通信(IPC)的两种主要方式:管道和SystemV共享内存。首先阐述了进程间通信的目的(数据传输、资源共享、事件通知、进程控制)和发展历程。重点分析了管道通信的四种情况、匿名管道和命名管道的实现原理及特性,并通过代码示例展示了基于匿名管道的进程池实现。随后详细讲解了SystemV共享内存机制,包括shmget()创建、shmat()/shmdt()挂接/分离、shmctl()控制等系统调用,以及内核中SystemVIPC资源的组织管理方式。全文采用C/C++实现
2025-08-07 21:29:33
1135
43
原创 Linux的库制作与原理
程序运行时,有了库的起始虚拟地址,我们要对加载到内存中的程序的库函数调用处进行地址修改,在内存中二次完成地址设置 (这个叫做。程序运行时,加载动态库,有了库的起始虚拟地址+方法偏移量(编译时获取),定位库中的方法。等等,修改的是代码区?不是说代码区在进程中是只读的吗?的,但是并不是这么简单的合并,也会涉及对库合并,此处不做过多追究。,表中每一项都是本运行模块要引用的一个全局变量或函数的地址。所以:虚拟地址机制,不光光OS要支持,链接器也要支持。:核心的虚拟地址分配者,写入ELF文件供OS加载。
2025-07-31 14:50:59
1902
42
原创 Linux的Ext系列文件系统
本文系统介绍了Linux文件系统的核心概念与工作机制。主要内容包括:1)磁盘物理结构(盘片、磁道、扇区)和逻辑寻址方式(CHS/LBA);2)文件系统核心概念(块、分区、inode);3)Ext2文件系统架构(DataBlocks、inodeTable、位图管理);4)目录结构与路径解析机制;5)软硬链接原理及区别。重点阐述了inode机制如何实现文件属性和内容的分离存储,以及通过目录项实现文件名到inode的映射关系。文章通过层次化的讲解,揭示了Linux文件系统从硬件抽象到逻辑组织的完整设计思路。
2025-07-17 16:42:33
1434
62
原创 Linux的基础I/O
本文系统介绍了Linux文件系统的基本概念和操作机制。首先从文件定义出发,阐述了狭义(磁盘存储)和广义(一切皆文件)的理解,并区分了文件内容和属性操作。其次回顾了C语言文件接口(fopen/fclose/读写函数)和系统调用(open/close/read/write)的差异,指出库函数最终会调用系统调用。重点解析了文件描述符(fd)的分配规则(最小可用原则)和重定向原理(通过dup2系统调用)。最后深入探讨了缓冲区的多级机制(用户级语言层缓冲区和文件内核缓冲区)及其对I/O效率的影响,通过两个典型现象(关
2025-07-11 20:37:57
1192
55
原创 自定义Shell命令行解释器
若先snprintf(oldPwd,sizeof(oldPwd),"OLDPWD=%s",cwdenv.c_str());那么,环境变量表中的OLDPWD就已经是CWD了,那么chdir(getOldPwd());这里就要了解一下:getenv(),getcwd(),putenv()了。(继承bash的,其实应该要从配置文件中获取,但比较麻烦)。(进程当前的工作路径,在/proc/pid/下可以看到),如果之前putenv(oldPwd),传的是指针,(如:cd,需要改变自己的路径),或。
2025-06-02 17:08:48
799
69
原创 Linux的进程控制
本文介绍了Linux进程管理的关键技术,包括进程创建、退出、等待和程序替换。在进程创建方面,详细讲解了fork系统调用及其常规用法;进程退出部分阐述了退出码、异常终止和常见退出方式;进程等待章节说明了父进程回收子进程的必要性及wait/waitpid方法;程序替换部分重点解析了exec系列函数的功能和区别。文章通过代码示例和原理分析,系统性地讲解了Linux进程管理的核心概念和操作方法,为理解进程控制提供了实用指南。
2025-05-25 16:53:55
2032
56
原创 Linux的进程概念
冯诺依曼体系结构是现代计算机的基础,其核心包括输入输出设备、存储器、CPU等组件。输入设备如键盘、鼠标,输出设备如显示器,存储器即内存,CPU负责运算和控制。由于输入输出设备效率低,内存作为效率与成本的平衡点,成为程序运行的必要条件。操作系统负责管理软硬件资源,通过系统调用和驱动程序屏蔽底层细节,提供统一接口。Linux系统中,进程通过PCB(进程控制块)进行管理,进程状态包括运行、阻塞、挂起等,进程优先级通过PRI和NI值调整。进程虚拟地址空间和分页机制将虚拟地址映射到物理地址,保护内存并解耦进程与内存管
2025-05-18 22:13:39
2305
79
原创 Linux的基础开发工具
作者使用的是Centos7.9。从现在开始使用普通用户(root用户权限太高,有点危险),需要更高的权限sudo即可。
2025-05-08 17:23:49
3171
79
原创 Linux的权限
但Lzc用户访问时,确定为所有者,就只看所有者对文件的权限了。,一般都要r(如:ls),w(修改),x(如:cd)。任何用户(root用户例外)不能进入其他用户的家目录。如:gcc后,会自动加x。一般只能在/home/用户名,自己家操作。如:Lzc用户有所有者和组用户的访问身份,时,目标组必须是该用户所属的组(否则需。,root可省略,切换到root用户,,root可省略,以root用户身份。,如:安装软件,需要root的权限。,即使自己是当前所有者)。,如:umask 002。(所有者,组,其他用户)
2025-04-27 16:12:29
3258
59
原创 Linux的基础指令
用于远程连接Linux服务器(本质是一个图形化工具,内部仍通过Shell与内核交互)。是用户个人文件的默认位置(路径为/home/用户名,root 用户是/root)。当然如果 >file,就是新建一个文件),把读取到的内容写入file。如:cat file | tail,显示file的后10行。:选项 -a -l,-l -a,-al,-la,都行。lesson1表示,当前在lesson1目录,,不再询问(root用户因权限过高,总是询问),包括文本,可执行程序,库,图片,视频等等。
2025-04-25 15:57:35
2453
57
原创 C++进阶——C++11_智能指针
什么是内存泄漏:内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存,一般是忘记释放或者发生异常释放程序未能执行导致的。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。内存泄漏的危害普通程序运行一会就结束了出现内存泄漏问题也不大,进程正常结束,页表的映射关系解除,物理内存也可以释放。长期运行的程序出现内存泄漏影响很大。
2025-04-15 18:10:33
1113
68
原创 C++进阶——异常
C++98中函数参数列表的后面接throw(),表示函数不抛异常,函数参数列表的后面接throw(类型1, 类型2...)表示可能会抛出多种类型的异常,可能会抛出的类型用逗号分割。,否则后面的5个资源就没释放,也资源泄漏了。如果是102号错误,这个异常不处理,出了catch子句,自动析构,再尝试发送。,这里由于异常就引发了资源泄漏,产生安全性的问题。,比如析构函数要释放10个资源,释放到第5个时抛出异常,则也。,前面申请了资源(内存、锁等),后面进行释放,但是。,(若没有移动构造,就调用拷贝构造)。
2025-04-13 15:42:18
816
50
原创 C++进阶——C++11_右值引用和移动语义_可变参数模板_类的新功能
文章摘要:本文深入探讨了C++11引入的右值引用和移动语义机制,包括左值/右值概念、引用折叠规则、完美转发实现原理,以及可变参数模板的扩展应用。重点分析了移动构造和移动赋值的实现原理及其在STL容器emplace系列接口中的应用,通过对比传统拷贝语义与移动语义的性能差异,展示了如何利用这些特性优化资源管理。文章还介绍了类的新功能如默认移动操作、成员变量初始化、final/override等现代C++特性,并提供了详细的代码示例说明其使用场景和底层机制。
2025-04-10 12:24:04
835
45
原创 C++进阶——封装哈希表实现unordered_map/set
与红黑树封装map/set基本相似,只是unordered_map/set是单向迭代器,模板多传一个HashFunc。
2025-03-29 12:03:06
1098
44
原创 C++进阶——哈希表的实现
乘法散列法对哈希表大小 M 是没有要求的,假设 M 为 1024,key 为 1234,A = 0.6180339887,A * key = 762.6539420558,取小数部分为 0.6539420558,M × ((A × key) % 1.0) = 0.6539420558 * 1024 = 669.6366651392,那么 h(1234) = 669。假设 P=17,M=6,a=3,b=4,则 h_34(8) = ((3 × 8 + 4) % 17) % 6 = 5。
2025-03-25 22:28:21
1085
41
原创 C++进阶——封装红黑树实现map和set
(整个子树已经访问完了,如果这个子树是外面的右子树,那么外面一层的子树也访问完了,直到子树是外面子树的左子树,左子树访问完了,访问中),就访问,2. 源码中的pair的<比较,比较了key和value,但是。MySet是为了兼容MyMap,所以也要实现。),相当于外层左边的子树访问完了,然后访问中。然后更新迭代器中的节点指针,返回*this。修改RBtree中的insert返回值为。,在右子树中进行,左中右,访问。1. 这里相比源码调整一下,当左为空,表示左访问完了,就是走右中左,基本相同。
2025-03-22 16:48:26
1138
32
原创 C++进阶——红黑树的实现
红黑树是一种自平衡的二叉搜索树,它在每个节点上增加了一个存储位来表示节点的颜色,可以是红色或黑色。通过对从根节点到叶子节点的路径上的节点颜色进行约束,红黑树确保没有一条路径会比其他路径长出两倍,因此它是近似平衡的。
2025-03-20 18:31:55
815
33
原创 C++进阶——AVL树的实现
AVL 树是一种自平衡二叉搜索树,满足以下性质:它是一棵空树,或者:它的左右子树都是 AVL 树。左右子树的高度差(平衡因子)的绝对值 <= 1。
2025-03-17 21:36:14
1057
19
原创 C++进阶——map和set的使用
1. set的声明如下,T就是set底层关键字key的类型。2.set默认要求key支持小于比较(升序),如果不支持或者想按自己的需求走可以自行实现仿函数传给第二个模版参数。3. set底层存储数据的内存是从空间配置器申请的,如果需要可以自己实现内存池,传给第三个参 数。4. 一般情况下,我们都不需要传后两个模版参数。5.set底层是用红黑树实现,增删查效率是O(logN)。迭代器遍历走的是搜索树的中序,所以是有序。
2025-03-15 23:37:53
1061
4
原创 C++进阶——二叉树OJ题
因为递归空间上使用的是栈,所以,我也用数据结构的栈(satck)模拟。因为递归空间上使用的是栈,所以,我也用数据结构的栈(satck)模拟。因为递归空间上使用的是栈,所以,我也用数据结构的栈(satck)模拟。:然后转向当前节点的右子树,重复同样的过程。(所以nullptr不允许插入)。(所以nullptr不允许插入)。(所以nullptr不允许插入)。2. 如何获取path?二叉树的层序遍历,一般使用。,那么就是最近的公共祖先,,找到了,就直接返回了。后序,左右中,如果先访问。,将其值加入结果中。
2025-03-14 11:49:55
1085
1
原创 C++进阶——二叉搜索树
在我写BinarySearchTree的拷贝构造时,发现为什么,_root明明是私有的。这种设计是为了支持类的封装性和实现细节的隐藏,同时。例如:拷贝构造函数需要访问被拷贝对象的内部状态。赋值运算符需要访问右操作数的内部状态。比较运算符可能需要访问两个对象的内部状态。
2025-03-09 17:58:25
708
2
原创 C++进阶——多态
1. 必须是基类的指针 或引用调用虚函数,因为只有基类的指针或引用才能既指向基类对象又指向派生类对象。2.被调用的函数必须是虚函数,一般要完成虚函数重写/覆盖,因为重写或者覆盖了,基类和派生类之间才能有不同的函数,多态的不同形态效果才能达到。注意:派生类没有完成虚函数的重写,那么多态性仍然可以工作,但仅限于使用基类的实现。public:// show 函数没有被重写// 调用 Base::showreturn 0;
2025-03-07 12:25:32
826
1
原创 C++进阶——继承
继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许我们在保持原有类特性的基础上进行扩展,增加方法(成员函数)和属性(成员变量),这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的函数层次的复用,继承是类设计层次的复用。没有继承之前public:// ...// ...protected:int _stuid;public:// ...//...protected:string _name = "张三";
2025-03-04 20:24:02
814
1
原创 C++初阶——模板进阶
【优点】1. 模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生。2.增强了代码的灵活性。【缺陷】1. 模板会导致代码膨胀问题,也会导致编译时间变长。2. 出现模板编译错误时,错误信息非常凌乱不易定位错误。
2025-02-26 20:56:37
604
1
原创 C++初阶——简单实现stack和queue
stack,queue,priority_queue是(container adaptor) ,封装一个容器,按照某种规则使用,一般不实现迭代器。
2025-02-25 17:10:46
847
1
原创 C++初阶——简单实现list
1. 简单实现std::list,重点:迭代器,模板类,运算符重载。2. 并不是,所有的类,都需要深拷贝,像迭代器类模板,只是用别的类的资源,不需要深拷贝。3. 高度相似 -> 模板。4.迭代器的种类按功能按结构(性质决定可以使用什么算法单向(Forward)双向(Bidirectional)随机(Random Access)
2025-02-23 20:01:43
400
1
原创 C++初阶——简单实现vector
简单实现std::vector类模板。相较于前面的string,vector要注意深拷贝,因为vector的元素可能是类类型,类类型元素可以通过赋值重载自己实现深拷贝。迭代器失效,其实无非是两种(现在认为):1. 迭代器更新了,但是认为用的是之前的迭代器,可以先保存值。2. 迭代器没有更新,但是认为是用更新后的迭代器,那就更新迭代器。
2025-02-20 20:30:11
497
1
原创 存储过程和触发器
存储过程是一组在数据库系统中为了完成特定功能的T-SQL语句的集合,经编译后独立存储在数据库中。当需要其功能时,只需要通过存储过程名并给出参数(如果存储过程有参数的情况)调用即可,且存储过程只在首次执行时进行编译,而不需要每次执行时重新编译,所以比单个T-SQL语句块的运行速度快。存储过程是SQL Server中一个非常有用的工具。SQL Server支持存储过程和系统过程。存储过程是独立存在于表之外的数据对象。可以由客户调用,也可以从另一个过程或触发器调用参数可以被传递和返回出错代码也可以被检验到。
2025-01-14 18:16:52
929
2
原创 T-SQL编程
目录1、T-SQL的元素1.1 标识符1. 常规标识符2. 分隔标识符1.2 变量1. 全局变量2. 局部变量1.3 运算符1. 算数运算符2. 赋值运算符3. 位运算符4. 比较运算符5. 逻辑运算符6. 字符串连接运算符7. 一元运算符8. 运算符的优先级和结合性1.4 批处理1.5 注释2、流程控制语句2.1 BEGIN…AND2.2 IF…ELSE2.3 CASE2.4 WHILE…CONTINUE…BREA
2025-01-13 17:23:27
1243
1
原创 视图和索引
视图所对应的数据不是以视图结构存储在数据库中,而是存储在视图所引用的表中。可以通过视图修改基本表。索引包含由表或视图中的一列或多列生成的键,这些键存储在一个B树中,使用索引可以快速、高效地查找与键值关联的行。
2024-12-31 21:13:15
1286
6
原创 SELECT的使用
接下来查询,我们用,在teaching数据库里的,三张表:student(sno(主码),sname,gender,sage,specialty(专业),grade(年级)),course(cno(主码),cname,credit),sc(sno(外码),cno(外码),score),(sno,cno)为主码。
2024-12-29 23:58:25
1147
3
原创 表
目录1、常用系统数据类型1. int或integer2. tinyint3. decimal[(p[,s])]或numeric[(p[,s])]4. char(n)5. varchar(n|max)6. datetime2、T-SQL创建表3、T-SQL修改表4、T-SQL表数据的操作4.1 插入数据4.2 修改数据4.3 删除数据四字节,-2^31~2^31-1的整数。1字节,0~255的整数。p:最多可以存储的十进制数字的总位数,1~38,默认18。s:小数点后面可以存储的十进制数字的最大位数,默认0。
2024-12-28 20:33:47
1116
2
原创 关系数据库
1.关系是从笛卡尔积中取出有实际意义的元组来构造的。关系是笛卡尔积的子集。2.关系中的每个元素是关系中的元组,通常用t表示。关系是元组的集合。3.n个属性称为关系的n目(度)n元关系,其元组为n元组。对于X的每一个值,都有Y唯一的具体的值与之对应,称X决定Y,或者Y依赖X,记作X→Y。
2024-12-27 14:49:11
1220
2
Python程序设计练习题突击
2024-07-03
Python程序设计知识点突击
2024-06-28
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人