- 博客(70)
- 收藏
- 关注
原创 Linux中的线程
进程地址空间是进程能够使用的资源窗口,而页表则决定了进程实际上拥有的资源。页表实际上是二级索引,以32位机器为例。内存管理的基本单位是4kb的页框。一级页表是以地址的高10位为索引,二级页表是以次高10位为2级页表,找到页框的起始地址,最后再以低12位为偏移量找到实际上的物理地址。
2025-04-14 22:07:33
706
原创 进程间通信—system v标准
System v标准的进程间通信包括共享内存,消息队列和信号量。我们着重介绍共享内存。前面我们介绍了通信的前提是:不同进程能看到同一份内存资源。前面我们介绍的管道是借助了文件系统来让不同进程看到同一份资源,我们即将介绍的共享内存是依靠在内存中创建一个共享内存区实现。
2025-03-28 22:35:15
668
原创 进程间通信-管道通信
进行数据传输,通知事件,资源共享,进程控制等,来进行进程间协同工作。因此要通信的前提是:两个进程能看到同一块内存资源,并能或读或写这块资源。
2025-03-23 10:28:29
656
原创 文件基础IO下
在C语言层面上这个缓冲区在FILE*所指向的结构体中,其中除了有fd文件描述符,还会有缓冲区buffer,用于存储数据。例如我们fflush时也要传入file*才能刷新缓冲区,fclose时也要传入file*参数才能刷其缓冲区。缓冲区存在的意义就是节省进程进行数据io的时间,可以直接将数据丢到缓冲区,让缓冲区与外设进行数据io。所以我们的fwrite,puts,fputs,fgets,等其本质是将数据拷贝到缓冲区,缓冲区定期刷新。硬件也是通过pcb内核数据结构控制的文件,其与文件的操作也是类似的。
2025-03-17 21:23:20
319
原创 linux环境变量
环境变量(environment variables)是指在操作系统中用来指定操作系统运行环境的一些参数。环境变量具有全局性,因为子程序可以继承环境变量。例如:我们输入的一个个命令行指令实际上是执行程序,那么操作系统是怎么知道我们的程序的地址的呢?是因为我们有一个PATH的环境变量,里面存储的地址就是我们命令搜索的地址。与环境变量相似的有本地变量,命令行直接输入 MY_NUM=100,这就是创建了一个本地变量,本地变量不具有全局性,只在当前进程(bash)内有效。
2025-02-11 11:09:57
893
原创 进程(1)
要回答这个问题首先我们要解答什么是程序的问题。什么是程序呢?程序本质是就是存放在磁盘上的文件。我们要运行程序,首先必须要将其加载到内存中,这样才能与cpu交互,这是冯诺依曼体系架构所决定的。程序运行起来后,就需要操作系统进行管理。管理的方法是先描述,再组织。如何描述呢?就需要PCB(process control block)进程控制块来进行描述。具体上讲就是定义一个struct task_struct结构体,该结构体中包含该进程的所有属性。如何组织呢?
2025-02-09 22:30:51
840
原创 冯诺依曼体系架构和操作系统的概念
操作系统是一款对软硬件管理的软件。其通过对软硬件进行管理,为用户提供良好的执行环境。其管理的本质是对数据进行管理;管理的方法是先描述,再组织。
2025-02-03 15:35:17
330
原创 Linux工具使用
①预处理:展开头文件,替换宏,调节编译,去注释。②编译:将代码变成汇编语言③汇编:将汇编代码变成二进制不可执行的目标文件。④链接:将多个我写的多个.cpp文件内容链接在一起,并与C++标准库链接起来。分别生成的是-i ,-s ,-o文件,选项依次是-E -S -c;演示预处理->编译->汇编->链接过程。
2025-01-30 10:47:18
917
原创 Linux权限(4)+开发工具的使用
在Linux系统的操作中,我们可以在自己的家目录下进行文件的增删查改。我们不被允许在其他人的家目录下进行文件的修改我们想要在一块公共的目录下进行文件的操作。即这个目录有777的权限。那么我们所有人都可以进入目录,查看目录文件列表,在目录内创建文件。但是问题是,我们在公共目录创建的文件它对其他人是仅可读,但当我们用其他账号来操作文件,虽然不可以修改文件,但是我们居然可以删除这个文件。
2025-01-21 10:12:43
426
原创 Linux权限
目录的默认权限111111111,意味着文件可以被执行,那么我们就可以进入目录。文件的默认权限110110110,因为不是所有的文件都可以被执行。目录权限解疑惑目录的r权限可读,意味着我们可以查看目录文件信息。目录的w权限可写,意味着我们可以在目录中创建文件目录的x权限可执行,意味着我们可以在打开进入一个目录。
2025-01-20 10:38:37
521
原创 Linux常见指令(3)
语法:find路径-选项用于在指定目录下查找文件,有可能会访问磁盘(因为查找是在内存中查找的,有可能需要加载磁盘文件到内存中)常见的选项有-name,即在指定的路径下查找文件名。
2025-01-19 10:24:45
664
原创 Linux常见指令(2)
rmdir指令与mkdir指令是相对的命令。rmdir是删除目录的指令,且只能删除空目录。也可指定模式p,当删除空目录后其父也为空的话就一并删除。rm指令是可以删除目录或者文件,默认是删除普通文件,-r则是递归删除目录及其下属所有文件-f则是force强制删除,不会询问。-i则是删除前逐一询问。
2025-01-17 11:09:45
860
原创 Linux常见指令(1)
a 列出目录下的所有文件-l列出文件的详细信息-d将目录像文件一样显示信息,而不是显示其下的文件-R列出所有的子目录下的文件(递归展开)值得注意的是,选项可以合并,例如ls -al 就是ls -a -l的合并。且ls -l 可以简化为 ll。
2025-01-15 19:40:30
376
原创 特殊类的设计
类不能被拷贝,那就意味着要将其的拷贝构造和赋值重载堵死。在C++11中可以使用delete操作符在c++98中可以将 拷贝构造函数和赋值重载只声明不定义,且放在private中,防止在类外面定义。
2025-01-13 19:39:31
605
原创 C++智能指针
C++并没有垃圾回收机制(gc),这使得我们使用new或者malloc等开出空间后,需要释放资源。但是当我们忘记释放资源,或者有异常安全问题时。就会导致资源没有被回收,我们又不能继续使用这块资源,终止导致资源泄漏问题。
2025-01-12 10:16:20
517
原创 C++异常
异常是面向对象语言处理错误的一种方式,它主要由三个关键部分组成:throw 抛出异常try 中放置可能会抛异常的代码,catch 用于捕获异常。如下代码,是我们捕获的C++中的异常。我们还可以自己设计自己的函数,并抛出异常。throw string("除数为零");try {理论上讲,throw抛出的异常我们可以任意设计但是在公司设计时,我们抛出的常常是派生类,然后用基类来捕获。这样设计可以更加的规矩,有序。
2025-01-10 20:02:55
805
原创 C++11新特性
一般在赋值符号左边的是左值,在赋值符号右边的是右值。左值能被取地址,能被赋值;右值不能被取地址,不能被赋值。常见的右值有函数的传值返回,匿名对象 ,字面常量,表达式的返回值。对左值的引用就是左值引用,对右值的引用就是右值引用。int x = 0;//左值引用//右值引用其中左值引用中const T& 也可以引用右值,右值引用中也可以引用move后的左值。move的本质就是调用了static_cast,将左值强转化为右值。右值又被分为纯右值和将亡值,将亡值指的是那些自定义类型的临时对象。
2025-01-10 11:26:48
913
原创 位图(bitmap)和布隆过滤器(bloom_filter)
1.位图-Bitmap1.位图-Bitmap1.1问题引入给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中?40亿个无符号整数大约16G的大小,用map或者set显然是无法支持海量数据的存储。那么我们能否不存储数据本身,通过映射关系存储其在(1)或者不再(0)呢?1.2概念位图,就是用二进制的bite位来存放某种状态,适用于海量数据,数据无重复。通常是判断某个数在不在的问题的解决办法。
2024-12-05 19:33:37
546
原创 哈希(Hash)
①新开一个hashtable,其vector中的容量增为原来的两倍②遍历原表,将数据data重新插入进新表,重新计算映射关系③③利用vector的swap函数,交换hashtable中的vector。步骤:①新开一个hashtable,其vector中的容量增为原来的两倍②在新的hashtable中复用insert函数进行插入,重新寻找映射位置③利用vector的swap函数,交换hashtable中的vector。②map和set的底层是用红黑树实现的,遍历是有序的,增删查改的时间复杂度为O(logN)
2024-12-02 16:58:53
732
原创 红黑树的插入
红黑树插入时,节点我们默认设置为红色节点。原因是:如果默认黑色节点插入,那么会破坏③性质,那么就很难调整。如果插入红色节点,那么有可能会破坏②性质,即使被破坏,也只是局部被破坏,方便我们调整。
2024-11-14 12:50:19
742
原创 AVL树的插入
为了方便调整,我们引入了平衡因子(balance factor)的概念(平衡因子 = 右子树的高度-左子树的高度),方便后续的检查是否符合平衡二叉树的性质。为了后续调整树节点的位置,我们还得引入_parent存储节点的父节点。如果存储的是key和val,那么我们将其放在pair键值对中进行存储.{}int _bf;
2024-11-10 13:21:56
1123
原创 set和map的使用
如果插入失败,那么返回的pair健值对的first存储的是map中已经存储的相同key值的pair的迭代器,second是bool值的0。set和map中的key值都是唯一的,而multiset和multimap中的key可以有重复的,但是mulitmap中没有重载operator[],因为可能有重复的key,那么就不知道该返回哪个val的引用。map的底层是KV模型,但是其节点是打包成pair键值对来进行存储的,pair中的first成员存储的就是key,pair成员的second存储的就是val值。
2024-11-06 22:48:37
761
原创 二叉树系列例题
函数递归问题的处理注意事项:函数递归时,把问题先简单化(内部细节就想成不递归的形式处理问题,将递归的东西作为答案),处理好边界问题,和return返回值的问题。在思考递归时,不要想内部细节问题,只想return值。
2024-11-05 13:27:30
800
原创 双指针问题解法集(一)
1.1.1题目解析有序数组,找到和为price的两个元素,只需要一个解即可。1.1.2算法原理a.解法一:两层for循环暴力枚举,时间复杂度O(空间复杂度O(1);b:解法二:利用双指针对撞,left指向最左边元素,right指向最右边元素,利用单调性原理,如果他们的和大于price,那么left++,如果和小于price,那么right--,等于price直接return。时间复杂度O(N),空间复杂度O(1)1.1.3代码实现。
2024-11-03 22:28:19
430
原创 二叉树进阶-二叉搜索树
二叉搜索树也叫二叉排序数(因为按照中序遍历是有序的),对于非空二叉树满足以下性质a.非空左子树的所有键值(key)都小于根节点的键值;b.非空右子树的所有健值都大于根节点的键值c.根节点的左右子树都是二叉搜索树。如图就是一颗二叉搜索树。
2024-11-03 15:36:13
1015
原创 C++中的多态
被virtual修饰的类的函数称为虚函数在派生类中,有一个跟基类的虚函数完全相同的虚函数(返回值类型,函数名,参数列表),则称完成了对基类虚函数的重写。注意这里继承了虚函数的声明,重写了虚函数的定义(实现)。下述代码就实现了重写public:cout << "全价" << endl;int _pid;public:cout << "半价" << endl;int _sid;在虚函数的声明后面加上=0,就表示纯虚函数。
2024-10-22 13:02:51
742
原创 C++中extern的作用(面试)
例如一个变量的定义,就是在声明的基础上,给变量分配空间。例如一个函数的定义,就是在声明的基础上,在{}内,具体实现函数。//即是声明,同时也定义了(因为编译器已经默认分了空间给a)//只是声明,并没有分配空间return 0;
2024-10-21 16:57:49
432
原创 C++继承
class 派生名:继承方式 基类名{};class的默认继承方式是private,struct的默认继承方式是public。继承方式分为public,protected,private三类。①基类中的private成员在派生类中都不可见②其他成员的访问方式 = min(继承方式,在基类中的限定方式),private<protected<public;③一般用public继承。
2024-10-20 10:45:43
1011
原创 stack - queue - priority_queue
stack的逻辑是后进先出的逻辑,意味着会发生尾差和尾删,其容器就可以选择是vector和listqueue的逻辑是先进先出,意味着会发生头删和尾插,考虑到vector头插头删的效率低,其可使用list作为容器。
2024-10-14 20:12:33
486
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人