自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【Linux】Socket编程接口 | 实现简单的UDP网络程序

socket API是一层抽象的网络编程接口,适用于各种底层网络协议,如IPv4、IPv6,以及后面要讲的UNIX Domain Socket。然而,各种网络协议的地址格式并不相同。

2024-04-12 22:13:18 696 1

原创 【Linux】网络基础(一)

OSI七层模型最大的优点是将服务、接口和协议这三个概念明确地区分开来,概念清楚,理论也比较完整,通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯。但是,OSI七层模型既复杂又不实用,所以后来在具体实现的时候就对其进行了调整,于是就有了我们现在看到的TCP/IP四层协议。

2024-04-12 22:00:52 1157

原创 【Linux】线程封装 | 线程互斥 | 基于阻塞队列的生产消费者模型

代码必须要有互斥行为:当代码进入临界区执行时,不允许其他线程进入该临界区。如果多个线程同时要求执行临界区的代码,并且临界区没有线程在执行,那么只能允许一个线程进入该临界区。如果线程不在临界区中执行,那么该线程不能阻止其他线程进入临界区。做到以上这三点,本质上就是给临界区加一把锁。Linux上提供的这把锁叫互斥量。

2024-03-19 16:02:14 841 3

原创 【Linux】多线程概念 | POSIX线程库

线程是比进程更加轻量化的一种执行流,线程是在进程内部执行的一种执行流,线程是CPU调度的基本单位,而进程是承担系统资源的基本实体。换言之,当我们创建进程时是创建一个task_struct、创建地址空间、维护页表,然后在物理内存当中开辟空间、构建映射,打开进程默认打开的相关文件、注册信号对应的处理方案等等。在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列”。一切进程至少都有一个执行线程。

2024-03-19 15:37:18 925

原创 【开发工具】Git模拟多人开发场景理解分支管理和远程仓库操作

这是一个模拟多人多分支协作开发的基本流程。你可以在本地多个分支之间切换,模拟不同开发者的工作,并通过合并、推送、拉取等操作进行分支集成。同时也可以在远程创建新分支,模拟其他贡献者的工作。选项不是必需的,但能自动建立分支关联关系,避免每次都要手动指定远程分支,非常方便。是两个不同的命令,它们的主要区别在于获取远程数据的方式和合并的行为。就可以了,Git会自动将本地分支推送到关联的远程分支。选项用于将当前本地分支与远程同名分支建立关联关系。因此,对于重要的项目分支,建议使用更保守的。分支,添加一些提交。

2024-03-06 18:17:24 593

原创 【开发工具】认识Git | 认识工作区、暂存区、版本库

所谓的版本控制器,就是能让你了解到一个文件的历史,以及它的发展过程的系统。• 在创建 Git 版本库时,Git 会为我们自动创建一个唯一的 master 分支,以及指向 master 的一个指针叫 HEAD。• 当对工作区修改(或新增)的文件执行 git add 命令时,暂存区目录树的文件索引会被更新。• --soft 参数对于工作区和暂存区的内容都不变,只是将版本库回退到某个指定版本。rm命令只会删除工作区的文件,对于暂存区和版本库中的内容没有影响。的内容退回为指定的版本内容,但工作区文件保持不变。

2024-03-06 18:16:23 982

原创 【C++11】lambda表达式 | 函数包装器

lambda表达式是一个可调用对象,是一个无名函数,一个lambda表达式可以被赋值给对象,或者直接使用auto类型推导。是一个通用的函数封装器,它可以包装任意可调用对象,包括函数指针、函数对象、成员函数指针以及lambda表达式。lambda表达式提高了代码的可读性。

2024-02-23 18:07:12 998 1

原创 【C++】C语言可变函数参数 | C++11可变参数模板

C语言使用stdarg.h来实现可变函数参数,通过va_listva_startva_arg和va_end宏进行操作。C++使用模板参数包来实现可变模板参数,可以利用递归、逗号表达式展开参数包处理不同数量的参数。

2024-02-23 17:54:49 977 1

原创 C语言和C++的类型转换

C语言类型强转存在缺陷:转换的可视性比较差,所有的转换形式都是以一种相同形式书写,难以跟踪错误的转换。因此标准C++为了加强类型转换的可视性,引入了四种命名的强制类型转换操作符:`static_cast`、`reinterpret_cast`、`const_cast`、`dynamic_cast`

2024-02-20 16:35:21 965 3

原创 【算法】一维、二维前缀和算法的模板

在没有前缀和的情况下,对于每个区间 [l, r],我们可能需要遍历数组并累加所有元素,这样的操作需要 O(n) 的时间。这样,在计算区间 [l, r] 的元素和时,我们只需要通过简单的减法操作得到 prefixSum[r] - prefixSum[l-1],而不需要重新遍历数组。总的来说,前缀和的优势在于提前计算出部分信息,通过存储中间结果避免了重复计算,从而显著提高了算法的效率。前缀和算法之所以能够将某些问题的时间复杂度从 O(n) 优化到 O(1),主要是因为它提供了一种有效的方式来避免重复计算。

2024-02-17 19:46:35 491 5

原创 【Linux】进程信号的保存 | 自定义捕捉

不是所有信号的处理都是立即进行的,而是在合适的时候处理,“合适的时候”是指进程从内核态返回到用户态的时候。有些信号,例如 SIGKILL,会立即终止进程。但对于其他信号,处理可能会延迟,具体取决于进程的状态以及是否被阻塞。

2024-02-17 19:01:29 1128

原创 【Linux】进程信号概念 | 核心转储 | 信号的产生

产生信号的方式可以有很多(譬如:由操作系统、其他进程,或者进程自身产生),但是向目标进程发送信号只能由操作系统发送,因为操作系统是进程的管理者,发送信号的本质是修改PCB中的信号位图。

2024-02-13 15:50:15 1244 4

原创 【C++11】右值引用 | 移动构造&赋值 | 万能引用 | 完美转发

传统的C++语法中就有`引用`的语法,而C++11中新增了的右值引用语法特性,所以从现在开始,为了与`右值引用(rvalue reference)`区分开来,我们可以称之为`左值引用 (lvalue reference)`。无论左值引用还是右值引用,都是给对象取别名。

2024-02-08 22:13:10 1094 2

原创 【Linux】文件的软硬链接

软链接:也称为符号链接,类似于 Windows 快捷方式,可以跨文件系统。硬链接:指向相同 inode 的文件副本,不能跨文件系统。

2024-02-08 10:06:02 1033 1

原创 【C++11】统一初始化 和 initializer_list

C++11扩大了用大括号括起的列表(初始化列表)的使用范围,使其可用于所有的内置类型和自定义类型。统一初始化是语法层面的,initializer_list是标准库提供的对语言层面的初始化列表的封装。

2024-02-07 01:14:37 1591 2

原创 C++11简介

C++语言已经今非昔比,几乎是一种全新语言了,我们非常需要拥抱变化,使自己适应C++的崭新时代。

2024-02-07 00:55:10 414

原创 高斯消去法 | LU分解 | PA=LU分解(MatLab)

高斯消去法、LU分解和PA=LU分解。这些算法是解线性方程组的基石,并且在各种应用领域中都有广泛的使用。代码实现的技巧使用MATLAB进行矩阵操作相对简单。

2024-02-04 23:36:17 1233 2

原创 【Linux】EXT2文件系统 | 磁盘分区&块组 | inode

我们已经学习了在内存中被打开(被加载)的文件,还有一部分是磁盘中未被打开的文件。这篇我们来谈磁盘文件。文件系统这个名词狭义上指的是磁盘文件系统,例如Linux下的ext2文件系统。

2024-02-04 23:26:46 1223

原创 【C++】异常

实际使用中很多公司都会自定义自己的异常体系进行规范的异常管理,因为一个项目中如果大家随意抛异常,那么外层的调用者基本就没办法玩了,所以实际中都会定义一套继承的规范体系。这样大家抛出的都是继承的派生类对象,捕获一个基类就可以了。

2024-02-02 21:07:23 1398 4

原创 【C语言】异常处理 | assert函数 | errno错误码

C语言传统的处理错误的方式主要包括assert终止程序和返回/设置错误码两种方式。

2024-02-02 20:49:42 1160 2

原创 利用牛顿方法求解非线性方程(MatLab)

牛顿方法(Newton's Method),也称为牛顿-拉弗森方法,是一种用于数值求解非线性方程的迭代方法。其基本思想是通过不断迭代来逼近方程的根。

2024-01-30 13:39:53 1700 2

原创 【Linux】System V 共享内存

"System V 共享内存" 是一种在类Unix操作系统中实现的共享内存机制,得名于AT&T的UNIX System V操作系统,其中引入了这种共享内存的概念。System V共享内存是System V IPC(Inter-Process Communication,进程间通信)机制的一部分,与其他System V IPC机制,如消息队列和信号量一起,提供了进程间通信的方式。

2024-01-30 13:33:43 1179

原创 利用二分法及不动点迭代求解非线性方程(MatLab)

理解二分法和不动点迭代法:通过本实验,你将更深刻地理解这两种数值方法的工作原理,优缺点,以及适用场合。收敛性分析:通过对不动点迭代公式的导数进行分析,你可以了解为什么某些迭代公式会收敛,而其他的不会。误差分析:二分法和不动点迭代法都有自己的误差范围和收敛速度,理解这些将有助于你选择更合适的方法解决实际问题。

2024-01-28 13:47:58 1304 2

原创 【Linux】命名管道

匿名管道与命名管道的区别- 匿名管道由`pipe`函数创建并打开。- 命名管道由`mkfifo`函数创建,打开用`open`- FIFO(命名管道)与 pipe(匿名管道)之间唯一的区别在它们创建与打开的方式不同,一但这些工作完成之后,它们具有相同的语义。

2024-01-28 13:38:39 1086

原创 熟悉MATLAB 环境

在这次的实验中,我深入了解了MATLAB的基础功能和环境。此外,我也体会到了为什么MATLAB在科学计算和工程领域如此受欢迎,它的向量化操作和强大的可视化工具使得处理数据和展示结果变得简单且直观。了解Matlab 数据的特点,熟悉Matlab 变量的命名规则,赋值语句及输出的格式。

2024-01-27 23:38:26 1111

原创 【Linux】进程间通信概念 | 匿名管道

进程间通信简称IPC(Interprocess communication),是操作系统中的一个重要概念,它允许不同的进程在执行过程中交换数据、共享资源、协调行为等。在多道程序设计环境下,多个进程可能需要相互通信以完成复杂的任务,而进程间通信提供了各种机制来实现这种交互。管道是Unix中最古老的进程间通信的形式。我们把从一个进程连接到另一个进程的一个数据流称为一个“管道”。

2024-01-27 23:20:25 1383

原创 【Linux】文件描述符 | 重定向 | C文件指针与fd的关系 | 用户级缓冲区

当进程用open()系统调用打开文件时,我们需要先将该文件从磁盘当中加载到内存,形成对应的struct file,将该struct file连入文件双链表,并将该结构体的首地址填入fd_array数组当中下标为3的位置,使得fd_array数组中下标为3的指针指向该struct file,最后open()返回该文件的文件描述符给调用进程即可。在Linux系统中,"一切皆文件"是一个核心概念,意味着系统中的各种资源,包括设备、套接字、管道等,都被抽象为文件,并通过文件描述符进行访问。

2024-01-26 15:51:54 1777 6

原创 【Linux】从C语言文件操作 到Linux文件IO | 文件系统调用

一个进程可以打开很多文件,所以操作系统运行时被打开的文件是很多的,操作系统当然要对这些被打开的文件做管理,管理的方式是:先描述,再组织。因此,一个文件要被打开,一定要先在内核中,形成被打开的文件对象。本文研究的文件操作的本质是:进程和内存中被打开(被加载)的文件的关系。

2024-01-26 15:30:44 1218

原创 数据结构实验5:图的基本操作

实现图的基本操作,包括:创建图的存储结构、复制已有的图、计算图的结点个数和弧/边条数、深度优先遍历序列、广度优先遍历序列、最小生成树、拓扑排序等。

2024-01-21 23:55:43 826 3

原创 【C++ | 数据结构】从哈希的概念 到封装C++STL中的unordered系列容器

尽管平衡二叉搜索树的查找方式已经很快了,但我们仍然认为该方法不够极致,理想的搜索方法:可以不经过任何比较,一次直接从表中得到要搜索的元素。这就是哈希表。

2024-01-21 23:52:23 1235

原创 数据结构实验5:哈夫曼树与哈夫曼编码

通过本次实验,我更深入地理解了哈夫曼编码的原理和实现方式,并学会了如何将算法封装。在本次实验中,我们设计了一个用于构建哈夫曼树和生成哈夫曼编码的数据结构和算法。我们进行了两组测试,分别使用不同的输入数据来测试哈夫曼树的构建和编码生成功能。从测试结果可以看出,哈夫曼树构建和编码生成功能正常工作,成功生成了有效的哈夫曼编码。在解决这个问题中,我学到了如何构建哈夫曼树和生成哈夫曼编码。2、实现哈夫曼算法,实现哈夫曼树的存储并求出哈夫曼编码。

2024-01-21 11:51:15 367

原创 数据结构实验4:二叉树的基本操作

在解决这个问题中,我学到了如何创建二叉树数据结构,并添加了根据层序遍历输入格式构造二叉树的功能。运用二叉链表实现二叉树的基本操作,包括:创建二叉树的存储结构、复制已有的二叉树、计算已有的二叉树的深度、先根序序列、中根序序列、后根序序列等。进行了两组测试,分别使用不同的输入数据来测试二叉树的构建、深度计算和遍历功能。通过这两组测试数据,我们验证了二叉树的构建、深度计算以及不同遍历方式的正确性。代码成功实现了所需的功能。实现二叉树的创建、复制、计算二叉树的深度、先根序序列、中根序序列、后根序序列等操作。

2024-01-21 11:48:52 684

原创 数据结构实验3:算术表达式求值

在这个问题中,我们主要使用了C++的标准库中的string和iterator。字符串用于存储输入的算术表达式,迭代器用于在解析过程中跟踪当前位置。it:这是一个迭代器,用于跟踪当前解析到了算术表达式的哪个位置。end:这是另一个迭代器,指向字符串的末尾,用于避免迭代器越界。termfactor:这些是整数变量,用于存储中间计算结果。在解决这个问题的过程中,我认识到递归在解析表达式这类问题上的强大能力。递归能自然地处理嵌套结构,如括号内的子表达式。

2024-01-19 23:48:52 418 1

原创 【Linux】进程地址空间

OS 为每个进程都创建独立的地址空间就相当于给每个进程都画了一张一样的"大饼",即告诉每个进程:“你享有计算机中的所有资源,整个系统内存都是你的,你快来用吧!其实就是操作系统在页表中该数据的权限属性上放置的是’r’,当你要对该数据进行修改时(写入)时,首先需要进行虚拟地址与物理地址的转化,转化的过程中操作系统发现权限为只读,所以才不可修改不可写入。将虚拟地址空间与物理内存一一对应 (映射),我们用户只能得到虚拟地址空间中的虚拟地址,当我们修改虚拟地址中的数据时,操作系统会先。,然后修改物理内存中的数据。

2024-01-19 15:39:42 1168

原创 数据结构实验2:通讯录管理

int age;这个结构用于表示每个联系人的基本信息。通讯录管理系统使用了一个自定义的数据结构,该结构包括了姓名、年龄、性别和电话号码等信息。这些信息被组织成一个联系人节点,方便存储和管理。主要的变量是链表con,它是类型的,用于存储联系人信息。链表的优势在于可以方便地插入和删除节点,适合通讯录这种需要频繁增删操作的场景。主要的变量定义在Contact类中,包括了一个链表con,用于存储联系人信息。

2024-01-18 12:09:14 852 1

原创 【Linux】进程控制

由于 exit 是C语言库函数,而 _exit 是系统调用,所以可以肯定的是 exit 的底层调用 _exit 函数,exit 是 _exit 的封装;其次,由于计算机体系结构的限制,CPU之和内存交互,所以数据会先被写入到缓冲区,待缓冲区刷新时才被打印到显示器上;而在上面的程序中,我们没用使用 ‘\n’ 进行行缓冲的刷新,可以看到,exit 最后打印了 “hello linux”,而 _exit 什么都没有打印;

2024-01-18 12:04:30 1152 1

原创 【Linux】进程的概念 进程状态 进程优先级

进程就是被加载到内存中的程序,或者被运行起来的程序就叫做进程。操作系统内核观点:进程=可执行程序+进程控制块(PCB)。优先级和权限不同,权限决定的是一件事情能不能做;优先级是在权限允许的前提下,该事情先做还是后做;

2024-01-17 22:39:14 1848 5

原创 数据结构实验1:复数的四则运算

未来,我们可以进一步探索如何优化代码、增强程序的健壮性,并扩展功能,例如实现更多的复数操作和属性。Complex是一个类,包含实部和虚部两个成员变量(float类型),包含加减乘除四种运算符的重载,也在类外定义了流插入运算符的重载,方便使用cout输出。掌握数据结构的基本概念,学会数据的组织方法,以便选择合适的数据逻辑结构和存储结构,以及相应的运算,把现实世界中的问题转化为计算机内部的表示和处理。在这次实验中,我们使用C++编写了一个简单的复数类,该类实现了复数的基本四则运算:加、减、乘和除。

2024-01-17 09:46:22 414 2

原创 【Linux系统编程】从冯诺依曼体系结构到操作系统

操作系统是一个进行软硬件资源管理的软件,是电脑第一个被加载的软件对下管理好各种软硬件资源 —— 手段对上为用户提供良好的 (安全、稳定、高效) 运行环境 —— 目的内核 kernel(进程管理,内存管理,文件管理,驱动管理)用户空间 user space(包括但不限于函数库,shell程序,系统工具,应用程序接口(API))进程管理文件系统内存管理驱动管理。

2024-01-16 20:58:43 961 1

原创 【C++】特殊类设计

介绍了如何在C++98和C++11中设计各种特殊的类。

2024-01-16 18:06:24 1169 2

空空如也

空空如也

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

TA关注的人

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