- 博客(44)
- 收藏
- 关注
原创 task_struct结构详解
在 Linux 内核中,无论是进程还是线程,到了内核里面,都叫做任务(Task),由统一的数据结构 task_struct 进行管理。task_struct 是 Linux 中的进程描述符,是感知进程存在的唯一实体。Linux 内核中通过一个双向循环链表将所有的 task_struct 串了起来,不同的操作系统中,PCB 所包含的内容也会不同。在 Linux 内核的代码世界里,task_struct被精心定义为一个结构体,其内部成员众多,宛如一个庞大而有序的信息仓库。/* 进程状态 */
2025-03-31 19:30:59
652
原创 高并发内存池并不难~
所谓池化技术,就是程序先向系统申请过量的资源,然后自己管理,以备不时之需。之所以要申请过量的资源,是因为每次申请该资源都有较大的开销,不如提前申请好了,这样使用时就会变得非常快捷,大大提高程序运行效率。在计算机中,有很多使用池这种技术的地方,除了内存池,还有连接池、线程池、对象池等。以服务器上的线程池为例,它的主要思想是:先启动若干数量的线程,让它们处于睡眠状态,当接收到客户端的请求时,唤醒池中某个睡眠的线程,让它来处理客户端的请求,当处理完这个请求,线程又进入睡眠状态。
2025-03-19 22:55:13
1019
原创 【Linux】深入理解进程管理与高效运用
进程是正在运行的程序实例,在Linux内核中,进程被称为任务,例如内核线程与用户线程等。进程是一个程序的执行实例,也就是正在执行的程序。在操作系统的眼里,进程是一个担当分配系统资源(CPU时间、内存)的实体。操作系统用一个进程控制块的数据结构(进程属性的集合)来描述进程信息,在Linux操作系统下的PCB是task_struct,程序运行时它会被装载到RAM里储存进程信息。task_struct包含标识符、状态。优先级。程序计数器、内存指针、上下文数据。I/O状态数据、记账信息等内容。
2025-03-17 14:23:19
1200
原创 论Linux进程间通信
例如,在使用管道进行通信时,进程需要明确知道哪个文件描述符是用于读,哪个是用于写,以及在读写过程中的各种规则和特殊情况的处理。通过一幅图来解释进程间通信的原理,可以看到,尽管进程之间有空间隔离,但它们都与内核相连,可以通过特殊的系统调用与内核进行沟通,从而实现与其他进程的通信。在操作系统中,内核空间是所有进程共用的,而每个进程都拥有自己的用户空间。例如,在使用共享内存进行进程间通信时,用户通过特定的系统调用接口(通信接口)请求内核空间的通信中枢为其分配一块共享内存区域,并建立起不同进程对该区域的访问路径。
2025-03-16 15:30:08
1935
原创 将VsCode变得顺手好用(1
打开【拓展】输入【Chinese】下载完成后重启Vs即可变为中文在随便一个位置新建一个文件夹,用于放置调试文件以及你未来写的代码,随便命名但切记不可用中文!!!然后进入VSCode,点击Open Folder或者点击左上角File -> Open Folder,然后打开刚刚建的文件夹,选择信任父级文件夹。点击这个图标新建一个文件夹,命名为.vscode(注意必须是这个名字!创建完成后再点击这个图标新建四个文件,文件名分别是接下来复制粘贴这四个文件的内容。
2025-02-25 19:40:48
2575
原创 【Linux进程】初悉进程
在Linux中,进程是最基本的执行单位。进程调度在整个操作系统中属于核心地位,是操作系统实现多任务处理的关键操作,确保每个进程在有限的CPU资源下有序的完成相应操作。在Linux操作系统中,同一时间下不仅仅只有一个进程在执行任务而是多个进程同时竞争有限的CPU资源。若没有进程调度操作,整个系统可能会陷入混乱,例如你正在听着歌却突然把歌停了给你播放视频。因此,进程调度尤为重要。进程调度的高效性会直接影响到系统的性能。一个高效的进程调度算法能够迅速完成大量进程间的切换,从而确保CPU资源得到最大程度的利用。
2024-12-30 23:58:16
2285
原创 【读懂Linux】基础IO
而现在知道,文件描述符就是从0开始的小整数。当我们打开文件时,操作系统在内存中要创建相应的数据结构来描述目标文件。于是就有了file结构体。表示一个已经打开的文件对象。而进程执行open系统调用,所以必须让进程和文件关联起来。每个进程都有一个指针*files, 指向一张表files_struct,该表最重要的部分就是包涵一个指针数组,每个元素都是一个指向打开文件的指针!所以,本质上,文件描述符就是该数组的下标。所以,只要拿着文件描述符,就可以找到对应的文件
2024-11-25 21:15:20
7552
原创 【C++笔试强训】如何成为算法糕手Day11
这样有两个状态的,可以用两个数组来分别表示,并且状态转移方式根据上面的变化也可以很容易的写出。面对这样一个问题——给定一定数量的苹果和桃子,以及两种不同价值组合方式的礼包(一号礼包和二号礼包),目标是最大化所能组成的礼包总价值。然而,在没有更高效的算法可以利用问题特定结构的情况下,枚举法是一个可靠的选择。这种方法的核心思想是尝试所有可能的礼包组合方式,并记录其中总价值最高的组合。:当一号礼包的数量增加到无法再增加(即使用了所有可用的苹果和桃子),或者二号礼包的数量减少到0时,枚举过程结束。
2024-10-19 14:42:06
707
原创 【C++笔试强训】如何成为算法糕手Day9
递归的思想,当台阶为一阶时有一种跳法,当台阶为二阶有两种跳法,当台阶为n阶时,可以从最后一步来考虑,如果最后一步跳一阶,前面有f(n−1)种跳法,一道简单的模拟题,有很多位数的数字可以看作字符串,将图画出来发现,当位数只有6(其中一种情况)位时都好会放在字符串结尾,因此需要限制。第二种找出顺子的规律,因题目限制顺子数仅为5个,因此顺子中最大数与最小数相减不可能大于4,再进行分类讨论防止出现相同的数字。如果最后一步跳两阶的话,前面有f(n−2)种跳法.f(0)=1 (0阶台阶有1种跳法,0阶乘=1)
2024-10-16 23:40:50
429
原创 【C++笔试强训】如何成为算法糕手Day8
要找到两个正整数A和B的最小公倍数,我们可以采用一个公式,即两数之积除以它们的最大公约数。为了求得这个最大公约数,有多种方法可供选择,其中最为人所熟知的是穷举法和辗转相除法。在这里,我们主要关注并应用这两种方法:穷举法和辗转相除法,来求解A和B的最大公约数,进而求得它们的最小公倍数。
2024-10-16 00:39:07
879
原创 【Linux阅览室】进程控制
最后,父进程派给子进程的任务完成的如何,我们需要知道。如,子进程运行完成,结果对还是不对,或者是否正常退出。一个父进程希望复制自己,使父子进程同时执行不同的代码段。例如,父进程等待客户端请求,生成子进程来处理请求。函数时非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。否则,操作系统会根据该参数,将子进程的退出信息反馈给父进程。父进程通过进程等待的方式,回收子进程资源,获取子进程退出信息。之前讲过,子进程退出,父进程如果不管不顾,就可能造成。一个进程要执行一个不同的程序。
2024-10-14 00:08:31
2701
原创 【C++笔试强训】如何成为算法糕手Day7
这道题所需要的,其实就是利用贪心算法,找出这条规律:能组成三角形的三条边中,两条最短边之和一定大于第三边。注意,是最短边,如果是任意两条边,那样会加大我们的工作量的。但贪心的点就在于,要是连两条最短边相加,都大于第三边了,那其他任意两边之和,一定也会大于第三边的。dfs方法: 设目前指针指向一个岛屿中的某一点 (i, j),寻找包括此点的岛屿边界。目标是找到矩阵中 “岛屿的数量” ,上下左右相连的 1 都被认为是连续岛屿。是一种树型的数据结构,用于处理一些不相交的合并以及查询问题。
2024-10-13 23:51:16
577
原创 【动态规划】dp之斐波那契数列模型
做题下来发现,规律较为死板,总体分为五步进行,最重要的是找出状态转移方程,写出状态转移方程的重点在于如何找出离结果最近的那几步操作。学习编程就得循环渐进,扎实基础,勿在浮沙筑高台。
2024-10-09 15:55:38
654
原创 【玩转Linux】如何快速理解进程概念
课本概念:程序的一个执行实例,正在执行的程序等内核观点:担当分配系统资源(CPU时间,内存)的实体。描述进程-PCB进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。课本上称之为PCB(process control block),Linux操作系统下的PCB是: task_struct
2024-10-07 21:39:28
2499
原创 【数学建模国赛】2024年数学建模国赛B题思路分析
第一次参加国赛,侥幸被推送国一参与评奖。在省赛区结果出来之时对一个月前的比赛进行复盘,以其取得更好的进步。第一次参加数模比赛,也是第一次写下思路,但仍觉得过于粗糙。有了这次经验之后明年再接再厉吧!
2024-10-02 18:37:21
1384
原创 【C++阅览室】类和对象
C语言是属于面向过程的编程语言,因此当我们要实现我们的需求时得逐步使用函数逐步实现,十分繁琐。C++是属于面向对象的编程语言,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。
2024-09-30 23:46:18
2423
原创 【C++笔试强训】如何成为算法糕手Day5
这是一道简单的模拟题,我们要找出三个字符(y、o、u)中最少的那个字符的数量,这个数量n表示最多能组成多少个"you"。然后,我们计算o字符的总数减去n,得到剩余的o字符数量。如果剩余的o字符少于2个,那么就不需要进一步操作。如果剩余的o字符数量是2个或更多,我们可以在结果上加1(对于2个o),加2(对于3个o),以此类推。最终的结果是n加上剩余o字符数量减去1。
2024-09-26 23:28:48
813
原创 【C++笔试强训】如何成为算法糕手Day3
。思路:本题有两种解法,一是暴力循环解法,但是时间复杂度会爆炸因此不建议用。二是滑动窗口法。我使用滑动窗口(同向双指针)法解本题。 首先分为四个步骤,一进窗口,二判断值是否满足,三更新结果,四出窗口。一:设置right右指针先进行移动,配合left左指针进行窗口判断。二:利用sum数组判断数组内数值是否超过n。三:当left+right长度小于retlen长度时更新结果四:sum-=left出窗口
2024-09-25 00:47:32
645
原创 【C++笔试强训】如何成为算法糕手Day2
这个值是一个十六进制数,转换为十进制后大约是 1061109567,这个值比 int 类型(通常是32位)能表示的最大值(INT_MAX,通常为 2147483647)要小,但足够大,可以用作一个初始的“无穷大”值,在后续的比较中被实际的最小值替换。然而,在大多数情况下,直接使用 INT_MAX(或 std::numeric_limits::max(),如果你想要更明确的类型依赖)是更安全、更清晰的选择。找到字符串2,此时计算的距离是最小的,因为后续的字符串2距离。,表示尚未找到字符串1和字符串2。
2024-09-24 12:33:57
1179
原创 【C++笔试强训】如何成为算法糕手Day1
已知不相同的数不超过10000个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结果。如果两个数组的当前元素不相等,那么我们比较这两个元素的大小。将较小元素所在数组的索引向前移动一位,因为在已排序的数组中,如果较小数组中存在与较大元素相等的元素,它必然位于当前较小元素之后。输出m行(m为n个自然数中不相同数的个数),按照自然数从小到大的顺序输出。的最后一个元素与当前相等的元素不一致,我们就将这个相等的元素添加到。的数组,该数组用于存储两个数组共有的交集元素。对应位置的值是否为1。
2024-09-23 01:12:11
1167
原创 【玩转Linux】如何简单快速理解权限?
你看上了小花,但是有不好意思直接表白,那就让你你家人找媒婆帮你提亲,所有的事情你都直接跟媒婆沟通,由媒婆转达你的意思给小花,而我们找到媒婆姓王,所以我们叫它王婆,它对应我们常使用的bash。如果目录没有-x权限,则无法对目录执行任何命令,甚至无法cd 进入目, 即使目录仍然有-r 读权限(这个地方很容易犯错,认为有读权限就可以进入目录读取目录下的文件)换句话来讲, 就是只要用户具有目录的写权限, 用户就可以删除目录中的文件, 而不论这个用户是否有这个文件的写权限.对目录来说,具有进入目录的权限。
2024-09-23 01:12:03
2274
原创 【玩转Linux】不允许你还不会Linux简单的指令
tail 命令从指定点开始将文件写到标准输出.使用tail命令的-f选项可以方便的查阅正在改变的日志文件,tail -f filename会把filename里最尾部的内容显示在屏幕上,并且不但刷新,使你看到最新的文件内容.: cp指令用于复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录, 则它会把前面指定的所有文件或目录复制到此目录中。命令完成文件重命名,此时,源文件只能有一个(也可以是源目录名),它将所给的源文件或目录重命名为给定的目标文件名。“|”表示FIFOs;
2024-09-20 14:10:35
1734
1
原创 【C++的创新性】C++11语法颠覆你的认知了吗?
在2003年C++标准委员会曾经提交了一份技术勘误表(简称TC1),使得C++03这个名字已经取代了 C++98称为C++11之前的最新C++标准名称。不过由于C++03主要对C++98标准中的漏洞 进行修复,语言的核心部分则没有改动,因此人们习惯性的把两个标准合并称为C++98/03标准。从C++0x到C++11,C++标准10年磨一剑,第二个真正意义上的标准珊珊来迟。
2024-08-26 00:23:41
2093
1
原创 【C++的剃刀】我不允许你还不会用哈希~
注意:该函数中实际调用哈希桶的插入操作,用参数key与V()构造一个默认值往底层哈希桶中插入,如果key不在哈希桶中,插入成功,返回V(),插入失败,说明key已经在哈希桶中,将key对应的value返回。
2024-08-19 02:07:14
2618
1
原创 【C++的剃刀】我不允许你还不会用红黑树~
为了后续实现关联式容器简单,红黑树的实现中增加一个头结点,因为跟节点必须为黑色,为了与根节点进行区分,将头结点给成黑色,并且让头结点的 pParent域指向红黑树的根节点,pLeft域指向红黑树中最小的节点,_pRight。
2024-08-05 14:11:37
3684
12
原创 【C++的剃刀】我不允许你还不会AVL树
最详细C++AVL树解释,二叉搜索树虽可以缩短查找的效率,但 如果数据有序或接近有序二叉搜索树将退化为单支树,查 找元素相当于在顺序表中搜索元素,效率低下。因此,两位俄罗斯的数学家G.M.Adelson-Velskii 和E.M.Landis在1962年 发明了一种解决上述问题的方法: 当向二叉搜索树中插入新结点后,如果能保证每个结点的左右 子树高度之差的绝对值不超过 1( 需要对树中的结点进行调整 ),即可降低树的高度,从而减少平均搜索长度。
2024-07-29 08:13:38
2965
22
原创 【C++之剑】我不允许你还不会多态
多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象买票半价。那么在继承中要。
2024-07-16 00:04:33
2301
29
原创 【C++阅览室】C++三大特性之继承
继承在C++中是十分重要的,它在面向对象程序设计时使代码可以复用的重要手段。继承可以允许程序员在保持原有类的特性下进行拓展,增加新的功能,这样产生的类,称为派生类。继承呈现了面向对象程序设计的层次结构,体现了由简到繁的过程。在此之前,我们接触到的都是函数的复用,继承是类设计之间的复用。目录继承的定义继承基类成员访问方式的变化基类和派生类对象赋值转换继承中的作用域派生类的默认成员函数继承与友元继承与静态成员复杂的菱形继承及菱形虚拟继承编辑继承的总结和反思下面我们看到Person是父类,也称作基类。
2024-07-12 20:32:07
3807
23
原创 【数据结构阅览室】初阶数据结构之排序
假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次 序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排 序算法是稳定的;所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置,交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动。每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的 数据元素排完。
2024-05-15 12:44:27
1479
20
原创 【C++阅览室】C++之Vector(容器)
就时间而言,这是 一个相对代价高的任务,因为每当一个新的元素加入到容器的时候,vector。从上述两个例子中可以看到:SGI STL中,迭代器失效后,代码并不一定会崩溃,但是运行结果定定不 对,如果it不在begin和end范围内,肯定会崩溃的。是表示可变大小数组的序列容器,可以使用连续储存空间存元素,这代表可以使用下标访问容器内的元素,和数组一样但又比数组高效,体现在可以自动控制容器大小。位置之后的元素会往前搬移,没有导致底层空间的改变,理论上讲迭代 器不应该会失效,但是:如果pos。
2024-05-10 17:42:24
1759
15
原创 【C++阅览室】C++之string(字符串)
1. string是表示字符串的字符串类2.该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。3. string在底层实际是:模板类的别名,4.不能操作多字节或者变长字符的序列。我们可查阅官方文档进一步了解~kw=stringstring类的常用接口说明(常用的接口)1.string类对象的常见构造函数名称功能说明string()(重点)构造空的string类对象,即空字符串(重点)用C-string来构造string。
2024-05-07 12:39:26
1381
24
原创 【C语言视角】数据结构之~二叉树
设二叉树的根节点所在层数为1,层序遍历就是从所在二叉树的根节点出发,首先访问第一层的树根节点,然后从左到右访问第2层上的节点,接着是第三层的节点,以此类推,自上而下,自左至右逐层访问树的结点的过程就是层序遍历。第一层是根结点,只有一个,所以2(1-1)=20=1。终端结点数其实就是叶子结点数,而一棵二叉树,除了叶子结点外,剩下的就是度为1或2的结点数了,我们设n1为度是1的结点数。终端结点数其实就是叶子结点数,而一棵二叉树,除了叶子结点外,剩下的就是度为1或2的结点数了,我们设n1为度是1的结点数。
2024-05-01 20:49:20
1348
18
原创 【C++视角】C++之模板(初阶)
在学习C语言是经常会遇到一类问题--写各种被频繁调用的函数,这类函数不能被修改类型而导致需要反复写,十分繁琐。在C++中,祖师爷为我们创建了一种模板,能够填充各种类型而自动生成各种类型的代码。这种也被称为泛型编程,而泛型编程的主要利用就是模板。模板:在C++中模板分有两种--类模板和函数模板。函数模板:函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。
2024-04-27 11:21:39
1217
2
原创 C++类和对象(终篇)
5. 静态成员也是类的成员,受public、protected、private 访问限定符的限制。3. 尽量使用初始化列表初始化,因为不管你是否使用初始化列表,对于自定义类型成员变量,它不属于外部类,更不能通过外部类的对象去访问内部类的成员。2. 注意内部类可以直接访问外部类中的static成员,不需要外部类的对象/类名。在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的。,参见友元类的定义,内部类可以通过外部类的对象参数来访。,不属于任何类,但需要在 类的内部声明,声明时需要加。
2024-04-26 18:58:43
1087
1
原创 Linux 环境搭建
这里的用户名密码都是在最初购买服务器的时候设置的用户名密码。阿里云或华为云 等服务器厂商处直接购买一个云服务器。这个时候就和一个公司发布一个正式的网站没有任何区别。部署在云服务器上的项目可以直接被外网访问 到,也就能让我们自己写的程序真的去给别人去使用。在这个环节我们最重要的是得到三个信息。导致环境上出现各种莫名其妙的问题。可以在控制台中找到自己买的服务器。密码建议设置的稍微复杂一 些,但是由于当前的虚拟机软件。其他的服务器厂商也是类似。同时还有一个最大的好处。点进去能够看到服务器的。
2024-04-26 18:58:25
560
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人