- 博客(83)
- 收藏
- 关注
原创 线程概念和控制
• 在⼀个程序⾥的⼀个执⾏路线就叫做线程(thread)。更准确的定义是:线程是“⼀个进程内部的控制序列”• ⼀切进程⾄少都有⼀个执⾏线程• 线程在进程内部运⾏,本质是在进程地址空间内运⾏• 在Linux系统中,在CPU眼中,看到的PCB都要⽐传统的进程更加轻量化• 透过进程虚拟地址空间,可以看到进程的⼤部分资源,将进程资源合理分配给每个执⾏流,就形成了线程执⾏流如果在没有虚拟内存和分⻚机制的情况下,每⼀个⽤⼾程序在物理内存上所对应的空间必须是连续的。因为每⼀个程序的代码、数据⻓度都是不⼀样的
2025-12-03 10:06:16
842
原创 Linux进程信号(4)(捕捉信号)(几种中断以及用户态和内核态)
• main函数调⽤insert函数向⼀个链表head中插⼊节点node1,插⼊操作分为两步,刚做完第⼀步的时候,因为硬件中断使进程切换到内核,再次回⽤⼾态之前检查到有信号待处理,于是切换到sighandler函数,sighandler也调⽤insert函数向同⼀个链表head中插⼊节点node2,插⼊操作的两步都做完之后从sighandler返回内核态,再次回到⽤⼾态就从main函数调⽤的insert函数中继续往下执⾏,先前做第⼀步之后被打断,现在继续做完第⼆步。都是直接调⽤上层的函数的啊?
2025-12-02 15:30:42
525
原创 Linux进程信号(3)(保存信号)
从上图来看,每个信号只有⼀个bit的未决标志,⾮0即1,不记录该信号产⽣了多少次,阻塞标志也是这样表⽰的。因此,未决和阻塞标志可以⽤相同的数据类型sigset_t来存储, sigset_t称为信号集, 这个类型可以表⽰每个信号的“有效”或“⽆效”状态,在阻塞信号集中“有效”和“⽆效”的含义是该信号是否被阻塞,⽽在未决信号集中“有效”和“⽆效”的含义是该信号是否处于未决状态。• 函数sigfillset初始化set所指向的信号集,使其中所有信号的对应bit置位,表⽰该信号集的有效信号包括系统⽀持的所有信号。
2025-12-02 11:02:44
895
原创 Linux进程信号(2)(处理信号)
• 上⾯所说的所有信号产⽣,最终都要有OS来进⾏执⾏,为什么?OS是进程的管理者• 信号的处理是否是⽴即处理的?在合适的时候• 信号如果不是被⽴即处理,那么信号是否需要暂时被进程记录下来?记录在哪⾥最合适呢?需要,记录在PCB中• ⼀个进程在没有收到信号的时候,能否能知道,⾃⼰应该对合法信号作何处理呢?知道,一个进程在任何时候(无论是否收到信号)都非常清楚自己应该对每种合法信号作何处理。进程内部维护着一个 “信号处理函数映射表”(或称为信号处置表)。
2025-11-26 14:58:38
528
原创 linux进程信号(1)(认识信号)
前台进程在运⾏过程中⽤⼾随时可能按下Ctrl-C,Ctrl-C ⽽产⽣⼀个信号,也就是说该进程的⽤⼾空间代码执到任何地⽅都有可能收到SIGINT 信号⽽终⽌,所以信号相对于进程的控制流程来说是异步(Asynchronous)的。当快递员到了你楼下,你也收到快递到来的通知,但是你正在打游戏,需5min之后才能去取快递。在收到通知,再到你拿到快递期间,是有⼀个时间窗⼝的,在这段时间,你并没有拿到快递,但是。进程就是你,操作系统就是快递员,信号就是快递,发信号的过程就类似给你打电话。你知道有⼀个快递已经来了。
2025-11-26 10:39:49
448
原创 权限和补充指令
目录的可执行权限是表示你可否在目录下执行命令。如果目录没有-x权限,则无法对目录执行任何命令,甚至无法cd 进入目, 即使目录仍然有-r 读权限(这个地方很容易犯错,认为有读权限就可以进入目录读取目录下的文件)而如果目录具有-x权限,但没有-r权限,则用户可以执行命令,可以cd进入目录。但由于没有目录的读权限。所以在目录下,即使可以执行ls命令,但仍然没有权限读出目录下的文档。
2024-10-20 11:26:48
439
原创 vim编辑器的使用
我们最好不要在root权限下去进行vim配置,因为vim下已经有了.vimrc的配置文件,用自己私人账号去配置,这样可以让每一个用户能够配置自己的vim。ctrl + v 然后从光标位置 按 数字+shift + g,然后再按 I // ,就是从光标位置的代码一直注释到该数字那一行的代码。在底行模式下我们还可以查找指定字符,输入字符然后按回车,再按n就可以上下移动(在指定的字符上下行号移动)我们先创建一个test.c的文件,然后vim编辑test.c,就直接进入了命令模式,也就是默认模式。
2024-09-11 23:01:43
720
1
原创 Linux指令(一)
cp指令用于复制文件和目录,如同时指定两个或两个以上的目录,而且最后的目的地是一个已经存在的目录,则会把前面指定的所有文件和目录都复制到指定的目录下。mv指令是move的缩写,可以用来移动文件或者将文件改名,是linux系统下常用的命令,经常用来备份文件和目录。touch命令的选项可带文档目录的日期时间,包括存取时间和更改时间,或者创建一个不存在的文件。linux系统中,磁盘的文件和目录组成一颗目录树,每个节点都是目录或者文件。绝对路径指的是明确的唯一的路径,比如:/home/user/bin。
2024-09-10 20:44:50
1169
1
原创 类的内存对齐&&位段&&位图&&布隆过滤器&&哈希切割&&一致性哈希
类的内存对齐&&位段&&位图&&布隆过滤器&&哈希切割&&一致性哈希
2024-05-26 19:28:05
1113
21
原创 哈希表(unordered_set、unordered_map)
unordered_set、unordered_map的底层是哈希表,哈希表是一种关联式容器(与前面的二叉搜索树、AVL树、红黑树一样,数据与数据之间有很强的关联性)
2024-05-11 23:19:31
763
17
原创 C++实现AVL树
经过了解二叉搜索树的性质之后,我们也发现了它极大的缺陷,如果数字基本上都是趋于有序的情况下,那么查找效率非常低下,时间复杂度为O(n),与顺序表的查找一样,因此我们引出了二叉平衡搜索树(AVL树),该树的优势在于能够保证根节点左右子树的高度差的绝对值小于等于1,这就很好保证了查找效率O(logn),如下图就是二叉平衡搜索树的样子。
2024-04-14 18:58:48
1312
8
原创 C++实现二叉搜索树的增删查改(非递归玩法)
二叉搜索树(Binary Search Tree)又称二叉排序树(Binary Sort Tree),是一种特殊类型的二叉树,它所有的根节点大于左子树的节点,小于右子树的节点,对二叉搜索树进行中序遍历,即可得到有序的数列。二叉搜索树的时间复杂度由树的高度决定,其搜索、插入和删除的时间复杂度均为 O(log n),其中 n 是节点数。在最坏的情况下,仍然会有 O(n)的时间复杂度。二叉搜索树的时间复杂度由树的高度决定,其。查找非常简单按照流程找就行了。
2024-04-04 00:08:02
1524
23
原创 面向对象:多态
通俗来讲多态就是完成某一种行为,不同的对象会完成会产生不同的状态。比如买票,针对不同的人群有不同的购票机制,对于儿童来说怎么样,对于大学生来说怎么样,这就是不同人群产生的不同状态机制通过前面的虚拟继承我们得知在继承的父类前面加一个virtual就行了,那么虚函数也是如此,在普通函数前面加一个virtual就行了。
2024-03-30 23:42:05
818
25
原创 双指针算法:三数之和
5.取nums[i]的相反数sum,判断sum和a[left]+a[right]的大小关系,如果sum大于a[left]+a[right],那么left++,小于的话就right–,同时要满足left
2024-03-23 23:02:24
620
13
原创 STL库中的string
erase、insert和replace都需要挪动数据,效率比较低下,能不用最好不用,而且还需要扩容。pos代表的是插入的位置(字符数组的下标),str表示插入的字符串。capacity扩容时是根据字符串有效字符的个数进行扩容的,空间比较小的时候不需要动态内存的开辟,相当于_ptr浪费掉了。空间大的时候需要动态内存的开辟,相当于_buf浪费掉了。返回的都是字符串的长度,平常时我们一般都用size。这里的append有多种类型的接口,但是一般。这里的成员函数size表示的是字符串的大小。
2024-03-15 23:38:26
1053
24
原创 排序算法:快速排序(递归)
2.然后cur先向前走,如果大于key,那么继续向前走,prev,不向前走,如果小于key,那么prev和cur同时向前走(,定义right从数组下标为n-1的位置,从右向左找小于key的数,从最右边的数开始,如果。1.这里我们先把中间值定位数组中的首元素的值,设为key变量,2.定义left为从数组0下标开始找大于key的数,如果。1.首先定义一个前指针prev,和一个后指针cur。(也就是谁走到相等的位置,而那个人是停止的)引言:这里所说的快速排序有三种,第一种是。自创的,还有一种叫做。
2024-03-11 21:44:51
1517
9
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅