自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(122)
  • 收藏
  • 关注

原创 Linux笔记---线程控制

是 POSIX 线程库(pthread)中用于创建新线程的函数。调用该函数后系统就会启动一个与主线程并发的线程,并使其跳转到入口函数处执行。

2025-06-23 17:43:34 1113 2

原创 Linux笔记---线程概念

基本定义: 线程(Thread)是操作系统能够进行运算调度的最小单位。它被包含在进程(Process)之中(或者说是进程的一部分、对进程的划分),是进程中的实际运作单位。: 一个线程必须存在于某个进程中。进程是资源分配的基本单位,线程是CPU调度的基本单位。执行:线程是程序执行流的最小单元。一个标准的单线程程序只有一个执行流(主线程)。多线程程序则在一个进程内有多个独立的执行流并发或并行地运行。

2025-05-31 20:17:10 1827 15

原创 Linux笔记---分页存储管理

操作系统如何管理有限的物理内存空间,在满足各个进程要求的前提下尽可能提高内存利用率呢?

2025-05-26 17:46:04 1179 12

原创 Linux笔记---信号(下)

功能:sigaction函数用于检查或修改与指定信号相关联的处理动作。它可以用来设置信号处理函数、信号掩码等。参数:指定要处理的信号编号,如SIGINT、SIGTERM等。:一个指向sigaction结构体的指针,用于设置新的信号处理动作。:一个指向sigaction结构体的指针,用于存储旧的信号处理动作。返回值成功时,sigaction函数返回0。失败时,它返回-1,并设置errno以指示错误。

2025-05-22 16:14:57 1597 16

原创 C++程序员疯狂星期四必备代码

遇到一个前所未有的bug,程序一启动就崩溃,有没有懂C++的大佬帮我看看,要不我可能今天一整天都搞不定了!

2025-05-22 15:20:44 177 5

原创 Linux笔记---内核态与用户态

由外部硬件设备通过中断请求线(IRQ)主动触发。

2025-05-19 16:55:27 1616 18

原创 Linux笔记---信号(中)

我们在管道那一节说过,管道的读端关闭管道会导致管道的写端退出。管道的写端退出实际上是接收到了由软件条件产生的信号SIGPIPE。这些条件包括但不限于定时器超时(如alarm函数设定的时间到达)、软件异常(如向已关闭的管道写数据产生的SIGPIPE信号)等。当这些软件条件满足时,操作系统会向相关进程发送相应的信号,以通知进程进行相应的处理。简而言之,软件条件是因操作系统内部或外部软件操作而触发的信号产生。

2025-05-14 15:43:18 942 4

原创 Linux笔记---信号(上)

信号是一种异步的信息传递方式,这意味着发送信号的进程只发送由信号作为载体的命令,而并不关心接收信号的进程如何处置这个命令(做不做、何时做、怎么做、结果如何等)。我们的程序在遇到运行时错误时会报错并退出,这就是因为程序在发生执行异常时会引发硬件异常中断,操作系统检测到之后,就会向引发异常的进程发送一个信号,进而终止进程。功能:向指定的进程发送特定的信号,并可以传递一个额外的数据值,提供了比kill函数更丰富的功能,可用于进程间的高级通信。函数用于向指定的进程或进程组发送信号,以实现进程间的通知或控制。

2025-05-12 15:05:32 1431 18

原创 Linux笔记---System V共享内存

System V共享内存是一种在Linux系统中用于进程间通信的机制。顾名思义,就是申请一段可供多个进程共享的内存,以用于进程间通信,相对于管道机制要更加直接。

2025-05-10 15:04:54 1304 12

原创 Linux笔记---进程间通信:管道

是进程间通信(IPC)的一种基础机制,主要用于在具有亲缘关系的进程(如父子进程、兄弟进程)之间传递数据,其核心特性是通过内核缓冲区实现单向或半双工的数据传输。管道是轻量级且高效的进程间通信方式,适用于简单的数据流场景,但其单向性和容量限制使其不适合复杂需求。命名管道扩展了应用范围,但需注意文件系统的依赖。

2025-04-23 22:16:32 1399 19

原创 Linux笔记---动静态库(原理篇)

动静态库文件的构成是什么样的呢?或者说二者的内容是什么?实际上,可执行文件,目标文件,静态库文件,动态库文件都是使用ELF文件格式进行组织的。ELF(Executable and Linkable Format)文件格式是Unix系统及其衍生系统中广泛使用的可执行文件、共享库和核心转储的二进制文件格式。ELF头(ELF header):位于文件的开始位置,主要目的是定位文件的其他部分。程序头表(Program header table):列举了所有有效的段(segments)和它们的属性。

2025-04-16 20:30:36 1136 13

原创 leetcode二叉树刷题调试不方便的解决办法

在leetcode中刷题时,如果没有会员就需要将代码拷贝到本地的编译器进行调试。但是leetcode中有一类题可谓是毒瘤,那就是二叉树的题。要调试二叉树有关的题需要根据测试用例给出的前序遍历,自己构建一个二叉树,非常不方便。作为一个懒人,在此之前我的解决办法就是硬看程序,反复检查,但是确实有点折磨了。前几天在刷二叉树有关的题时心血来潮写了一个函数来帮助构建二叉树。

2025-04-05 10:52:33 506 17

原创 Linux笔记---动静态库(使用篇)

-I] :指定头文件所在目录。[-L]:指定库文件所在路径。[-l]:指定要链接的库。[-shared]:生成动态库。[-fPIC]:产生位置无关码。[-static]:使用静态链接。静态库使用ar命令进行打包:ar -rc lib[库名].a [目标文件s]将静态库与用户目标文件一起编译即可生成可执行程序。

2025-03-26 17:26:05 1731 23

原创 Linux笔记---文件系统软件部分

从这部分我们可以看出为什么 数据写入很慢,而删除却很快。因为删除数据只需要修改对应的标志信息置即可(如将inode Bitmap 和 Block Bitmap对应位置为0)。由此我们又能大概猜到回收站或数据恢复技术的原理了,只要赶在数据被覆盖之前,找到被删除数据对应的原inode和数据块即可恢复。但如果新的数据被写入到了这些存储空间那就无能为力了。所以,当重要的数据被误删时,尽可能什么都不做,赶在数据被覆盖之前交由专业人士进行恢复。

2025-03-22 16:24:23 6209 23

原创 Linux笔记---文件系统硬件部分

文件系统是操作系统用于明确存储设备(常见的是磁盘,也有基于NAND Flash的固态硬盘)或分区上的文件的方法和数据结构,即在存储设备上组织文件的方法。

2025-03-13 17:37:33 1379 29

原创 Linux笔记---自定义shell

该自定义shell并没有任何实用价值,一是因为其功能并不完善,二是因为其是建立在bash的基础之上进行的编写的成果(初始环境变量取自bash),仅具有学习价值。为了贴近真实的 shell 程序开发,我们的代码完全用C语言完成。本文通过完成一个自定义shell小项目的方式,对前面学习的知识做一个简单的总结,帮助读者深入理解有关概念(子进程,进程调度,环境变量……)。

2025-03-08 15:16:31 6539 27

原创 Linux笔记---缓冲区

在计算机系统中,缓冲区(Buffer) 是一种临时存储数据的区域,主要用于协调不同速度或不同时序的组件之间的数据传输,以提高效率并减少资源冲突。它是系统设计中的重要概念,尤其在I/O操作、网络通信、硬件交互等领域广泛应用。

2025-03-01 17:14:06 993 11

原创 Linux笔记---一切皆文件

一切皆文件”是 Linux 对系统资源的高度抽象,通过文件接口屏蔽底层差异,提供了简洁、一致的操作方式。这种设计降低了系统复杂性,使得工具、脚本和应用程序能够以统一模式处理多样化资源,是 Linux 强大灵活性的重要基石。简单来说,在Linux操作系统中,所有的资源(包括普通文件(文本、二进制文件等)、目录、设备(如磁盘、键盘)、进程信息、网络套接字、管道等)都被抽象为了文件。在用户层面上,我们可以通过对对应的文件进行操作,进而完成对这些资源的操作。

2025-03-01 15:10:28 747 1

原创 MySQL笔记---Ubuntu环境下从零开始的MySQL

其中,mysql是客户端(Client),而mysqld就是服务端(MySQL),所以在某些操作系统中或MySQL版本中,开始,关闭,重启命令的对象是mysqld。当客户端发送连接请求时,MySQL服务器会在连接层接收请求,分配一个线程来处理该连接,随后进行身份验证。:是MySQL的核心组件,负责提供各种数据库操作所需的基本功能,如SQL语法处理、事务管理、锁管理等。所谓安装数据库服务器,只是在机器上安装了一个数据库管理系统程序,这个管理程序可以管理多个数据库,一般开发人员会针对每一个应用创建一个数据库。

2025-02-28 15:43:16 1674 22

原创 编译原理复习---SSA

适用于电子科技大学编译原理期末考试复习。

2024-12-23 16:56:08 1393 1

原创 编译原理复习---寄存器分配

适用于电子科技大学编译原理期末考试复习。因为寄存器的数量有限,对于程序的运行效率又有很大的意义,所以需要研究如何分配寄存器。

2024-12-23 15:50:44 673

原创 编译原理复习---运行存储分配

重点:活动记录的组成和他们各自的含义,控制链、访问链的画法。哈工大的慕课中,关于控制链和访问链还有更多的细节,但是根据PPT的内容,我感觉考试顶多就按照下面的方式来考了:PPT中的栈比较离谱,是向上生长的,蓝色的线代表控制链,红色的线代表访问链,右部的图反应的是各过程的嵌套深度。

2024-12-22 15:41:21 848 1

原创 编译原理复习---活跃变量分析

假如流图中没有终止结点,则可从任意结点开始分析,并重复多次分析过程,直到所有结点的in集和out集都不再发生变化。假如终止结点有多个,对每一个终止结点,都要将其作为起点分析一次,同样地,分析过程可能会重复多次。

2024-12-21 21:15:01 1322 6

原创 编译原理复习---目标代码生成

适用于电子科技大学编译原理期末考试复习。

2024-12-21 19:12:47 1193

原创 编译原理复习---中间代码优化

适用于电子科技大学编译原理期末考试复习。

2024-12-21 19:12:34 1430 1

原创 编译原理复习---代码翻译为三地址码

适用于电子科技大学编译原理期末考试复习。

2024-12-21 19:12:01 2006

原创 编译原理复习---语法分析

我们先前做的文法改造,实质上就是将非LL(1)的文法改造成LL(1)的。由此可见,能够使用自顶向下的分析方法的文法就是LL(1)文法。

2024-12-21 19:09:47 1328

原创 编译原理复习---正则表达式+有穷自动机

正则表达式(Regular Expression,简称regex或regexp)是一种用于描述、匹配和操作文本模式的强大工具。它由一系列字符和特殊符号组成,这些字符和符号定义了一种搜索模式,可以用来检查一个字符串是否包含某个子串、将匹配的子串进行替换或者从字符串中提取符合条件的子串等。总结来说,正则表达式就是通过特定字符与文法符号的组合来描述一种语言的方式。正则语言 == 上下文无关文法 == 正则表达式,三者之间可以相互转换。

2024-12-20 17:06:35 787

原创 编译原理复习---基本概念+推导树

编译原理是计算机科学的一个重要分支,它涉及将高级编程语言编写的源代码转换为机器能够理解和执行的低级代码的过程。这个过程包括多个阶段,每个阶段都有特定的任务和目标。一个文法G通常被定义为一个四元组(N, Σ, P, S),其中:N是非终结符号(Nonterminal Symbols)的集合。Σ是终结符号(Terminal Symbols)的集合,Σ与N无交集。P是一组产生式。

2024-12-20 17:06:30 1213

原创 Linux笔记---系统文件I/O

函数是一个用于打开或创建文件的系统调用,C语言的fopen函数就是对该函数的封装。pathnameflagsmodeflagsO_CREATclose函数对应的自然就是fclose函数,将open函数的返回值作为参数传入即可关闭文件,就不过多解释了,重要的是open函数的使用。

2024-12-04 17:32:59 1054 8

原创 Linux笔记---进程:进程替换

进程替换是指在一个正在运行的进程中,用一个新的程序替换当前进程的代码和数据,使得进程开始执行新的程序,而不是原来的程序。这种技术通常用于在不创建新进程的情况下,改变进程的行为。我们之前谈到过fork函数,这个函数可以启动一个子进程,子进程继承了父进程的代码和数据。在谈到进程替换之前,我们只能通过判断fork函数的返回值id来区分父子进程,并让二者运行不同的分支。而利用进程替换技术,我们可以将子进程的代码数据完全替换为另一个程序,实现我们所期望的,父子进程完全独立为两个不同的进程。

2024-12-04 17:32:35 1205 21

原创 Linux笔记---进程:进程等待

进程等待是指父进程通过系统调用wait或waitpid来对子进程进行状态检测与回收的功能。当子进程退出时,如果父进程不读取子进程的退出状态,子进程就会成为僵尸进程,造成内存泄漏的问题。因此,父进程需要调用wait或者waitpid确认子进程的退出信息以回收僵尸进程的资源以防止内存泄漏。

2024-12-01 21:35:29 942 13

原创 Linux笔记---进程:进程终止

exit函数和exit函数的主要区别在于_exit函数不会进行任何清理操作,而exit函数会执行必要的资源清理操作,确保程序能够优雅地终止。在实际编程中,应根据具体情况选择使用哪个函数。如果需要快速终止程序,不关心资源清理,可以使用_exit函数;如果需要在程序终止前进行一些清理工作,应该使用exit函数。

2024-12-01 21:35:14 742 14

原创 Linux笔记---进程:进程地址空间

Linux虚拟地址空间是操作系统为每个进程提供的一组虚拟地址,这些地址在进程看来是连续的,但实际上它们会被映射到物理内存的不同位置。虚拟地址空间的目的是使每个进程都认为自己独占了整个内存,从而简化内存管理和提高安全性。通过页表和MMU的配合,操作系统能够有效地管理和保护内存资源,同时提供了灵活的内存分配和共享机制。因为有地址空间的存在,所以我们在C、C++语言上new, malloc空间的时候,其实是在地址空间上申请的,物理内存可以甚至一个字节都不给你。

2024-11-29 16:12:44 1470 21

原创 Linux笔记---环境变量

环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数,是用于存储系统和程序运行时所需的配置信息的变量。这些变量可以在shell中设置,并且可以被程序和脚本访问。环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性。如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。

2024-11-25 20:32:11 1022 3

原创 Linux笔记---进程:进程切换与O(1)调度算法

由于在一个操作系统中进程的数量通常是很多的,所以并发的调度方式必不可少,在这篇文章中,我们要详细探讨进程是如何切换的。

2024-11-24 16:54:29 866 12

原创 Linux笔记---进程:进程优先级

将NI的范围限制在[-20,20)范围的目的是防止发生 "进程饥饿" ,即当各个进程的优先级差值过大时,优先级较低的进程就迟迟拿不到CPU资源。renice命令用于调整已经运行的进程的优先级。对于需要更高优先级的实时任务,可以使用SCHED_FIFO或SCHED_RR实时调度策略。这个命令将rsync进程的优先级降低了5个单位,确保它不会过多占用系统资源。这段代码将当前进程的调度策略设置为SCHED_FIFO,并设置优先级为10。这段代码获取当前进程的PID和Nice值,并将Nice值设置为5。

2024-11-24 16:53:56 1446 12

原创 Linux笔记---进程:进程状态

上图是操作系统学科中,对进程状态的分类。但是这样细致的划分是在操作系统的设计层面上做的,其中的很多细节,用户其实不必关心。

2024-11-23 19:51:49 1071 7

原创 Linux笔记---进程:初识进程

进程是操作系统中的一个核心概念,它代表了正在运行的程序的实例。每个进程都有自己的内存空间、代码、数据和系统资源。进程是操作系统进行资源分配和调度的基本单位。

2024-11-23 19:51:19 988 15

原创 Linux笔记---调试工具GDB(gdb)

GDB,全称GNU Debugger,是一个功能强大的开源调试工具,广泛用于Unix和类Unix系统,以及Microsoft Windows和macOS平台。GDB允许开发者在程序执行过程中查看内部运行情况,帮助定位和修复程序中的错误。

2024-11-17 17:50:14 3694 32

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除