自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Linux进程概念(四)环境地址变量

我们先来思考几个问题1.为什么函数返回值,会被外部拿到呢?函数里面定义的不都是局部变量吗2.系统如何得知我们的进程当前执行到哪行代码了?第一个问题,函数在return a时,会直接编译成mov eax 10,会将a的值放到寄存器当中。所以函数返回值是通过寄存器拿到外部的。第二个问题 cpu内部有个程序计数器(pc,eip),他会记录当前进程正在执行指令的下一行指令的地址。cpu内寄存器里面保存的都是进程相关的数据。。保存的目的,未来都是为了恢复。所以进程在切换的时候:1.保存上下文。

2025-08-17 00:05:17 1024

原创 linux进程概念(三)进程状态

通俗来讲,一个已经加载到内存中的程序叫做进程,细致来讲,那么进程是由内核数据结构PCB和对应的代码和数据组成,那么一个进程存在,其对应的代码和数据已经被加载到了内存,这个代码和数据要占用一定的内存,当存在大量的进程,那么就会有大量的内存和数据被加载到内存中,同时还会有大量的进程处于阻塞状态,阻塞状态不同于运行状态,阻塞状态是进程正在等待,S睡眠状态(sleeping):意味着进程在等待事件完成,同时也叫做可中断睡眠,浅度睡眠,即睡眠期间可以被唤醒,对应操作系统学科中的阻塞状态。

2025-07-30 20:23:45 1044

原创 Linux进程概念(五)进程地址空间

如果进程直接访问物理内存,那么看到的地址就是物理地址,而语言中有指针,如果指针越界了,一个进程的指针指向了另一个进程的代码和数据,那么进程的独立性,便无法保证,因为物理内存暴露,其中就有可能有恶意程序直接通过物理地址,进行内存数据的篡改,如果里面的数据有账号密码就可以改密码,即使操作系统不让改,也可以读取。这段空间中自上而下,地址是增长的,栈是向地址减小方向增长,里面存放函数中的临时变量,而堆是向地址增长方向增长,malloc开辟的地址空间存放在堆区,堆栈之间的共享区域,主要用来加载动态库。

2025-07-28 23:06:09 973

原创 linux进程概念(三)(fork的介绍与使用)

一般而言,fork之后的代码父子共享。当我们调用fork之后,父进程就会创建子进程,并且之后的代码部分父子进程是共享的,但是,因为fork()会由父进程和子进程分别执行return,进行两次返回,在id层面就会发生写时拷贝,导致父子进程id变成不同的值,所以后续可以通过对id进行if else判断,来对父子进程进行分流,让父子执行不同的代码块。每次运行相同的程序,他的pid会变,但他的ppid不会变,但每次登录xshell时,系统会单独创建bash进程,ppid会发生改变,即创建命令行解释的进程。

2025-07-15 11:19:26 733

原创 linux进程概念(二)——进程、PCB的概念讲解

proc系统目录中,存储着所有正在运行的进程的目录文件及其相关的进程信息,并且进程的目录文件名是以进程对应的进程编号(标识符 PID)为名称,我们使用ls查看一下这个系统目录,可以看到小编运行的程序的对应进程的标识符172099存在于其中。很明显的可以观察出,code的路径就为cwd对应的当前进程的工作目录和code文件名拼接而成,并且当前进程所有的工作都在这个路径下进行,并且产生的临时文件也在cwd对应的当前进程的工作目录下。一个操作系统,不仅仅可以运行一个进程,可以同时运行多个进程。

2025-07-11 17:34:18 891

原创 Linux进程概念(一)--冯诺依曼体系,操作系统概念

4.在操作系统进行管理,首先要先描述,即确定要对谁进行管理,那么如何确定,就是通过属性(数据),当这些属性足够多的时候,这个被管理的事物就可以被确定,在操作系统中,由于linux是使用c语言写的,用于描述事物的属性(数据)就被封装在一个struct结构体中,构成一个结构体类型,当要管理事物的时候,先使用这个结构体类型去实例化出一个对象,这个对象中包含着这个事物的属性以及指向这个事物的地址,这样对事物的管理就转化成了对这个结构体对象中数据的管理。一个程序要运行起来,必须先加载到内存中?

2025-07-10 17:26:19 958

原创 vim的使用

如果没有天赋那就一直重复”送给各位读者还有小编自己在 Linux 系统中,一切皆文件,配置服务通常就是修改其配置文件参数。日常工作中,文档编写也离不开强大的文本编辑器。vim 作为 Linux 下最常用的文本编辑器之一,掌握其使用至关重要。

2025-06-17 21:06:32 1020

原创 Linux权限

shell的最简单定义:命令行解释器作用:1.将使用者的命令翻译给核心(kernel)处理。2.同时,将核心的处理结果翻译给使用者shell对于Linux主要是对我们的指令进行解析,解析指令给Linux内核。反馈结果在通过内核运行出结果,通过shell解析给用户。帮助理解::如果说你是一个闷骚且害羞的程序员,那shell就像媒婆,操作系统内核就是你们村头漂亮的 且有让你心动的MM小花。

2025-05-30 18:25:43 1017

原创 Linux中常见指令(下)

在运行一个非常消耗资源的find命令时,很多人都倾向于把它放在后台执行,因为遍历一个大的文件系 统可能会花费很长的时间(这里是指30G字节以上的文件系统)。-a输出所有信息,依次为内核名称,主机名,内核版本号,内核版本,硬件名,处理器类型,硬件平台类型,操作系统名称。-j 显示在当年中的第几天(一年日期按天算,从1月1号算起,默认显示当前月在一年中的天数)whereis在系统的特定路径下查找,既可以找到可执行程序,又可以找到手册,安装包之类的。-3 显示系统前一个月,当前月,下一个月的月历。

2025-05-12 11:49:45 517

原创 Linux中常见指令(上)

Linux操作特点

2025-04-24 15:32:38 748

原创 string类

size是11,capacity是15,中间默认用/0填充,resize(13)后size是13,resize(5)后会保留前五个字符。reserve价值,确定大概要多少空间,提前开好,减少扩容,提高效率。一般只会扩,不会·缩小容量。push_back只能插入一个字符,append可以插入字符串也可以插入字符串对象。,c_str()生成一个const char *指针,指向字符串的首地址。此时不支持修改,原理是把*it赋值给ch,ch是*it的拷贝。是++不是--,他的++是倒着走,因为他是反向迭代器。

2025-01-26 15:33:42 448

原创 算法--滑动窗口

利用单调性,使用“同向双指针”来优化2.进窗口right++3.判断满足就出窗口left++然后更新结果时间复杂度:最差情况只会让right指针从头移动到尾,left指针从头移动到尾部,即2n。

2025-01-12 10:40:55 263

原创 判断一个整数是否是平方数

方法一:输入一个数,遍历所有比这个数小的数,只要有其中一个数满足条件 小于该数的数 * 小于该数的数 = 该数,如3*3 = 9,那么这个数是完全平方数。方法二:输入一个数,对这个数开方后取整,√该数 * √该数 = 该数,如√9*√9 = 3*3 = 9 ,那么这个数是完全平方数。完全平方数开方后得到的应该是一个整数,而不是小数,所以使用(int)对这个开方后的数取整(3.9取整是3,3.0取整是3)这个数开方后取整得到的数,再平方,如果等于输入的数,那么该数是完全平方数。判断一个数是否是完全平方数。

2024-12-16 23:25:48 558

原创 最优二叉树(哈夫曼树)

叶子结点的权值是对叶子结点赋予的一个有意义的数值量,设二叉树具有n个带权值的叶子结点,从根节点到各个叶子结点的路径长度与相应叶子结点权值的乘机之和称为二叉树的带权路径长度。带权路径最小的二叉树称为最优二叉树,也称哈夫曼树。最优二叉树有什么特点?1.权值越大的叶子结点越靠近根节点2.只有度为0和度为2的结点,不存在度为1的结点基本思想:1.初始化:由n个权值构造n棵只有一个根结点的二叉树,得到一个二叉树集合FT1T2Tn;2.重复下述操作,直到集合F。

2024-11-16 15:53:36 1355

原创 树的性质题目

另外,在完全二叉树中,如果结点的总个数为奇数,则没有度为1的结点,如果结点总个数为偶数,只有一个度为1的结点。由后序遍历确定子树的根,后序遍历从后向前看,最后一个元素为根,和前序遍历刚好相反,从后向前看后序遍历,应该是根,右,左,根据中序遍历确定子树的左右区间。因此n0+n1+n2=1001,因为结点总个数为奇数,没有度为1的结点,n0+0+n2=1001,n0=501。D的左子树的根:G D的右子树的根:H E的右子树的根:I。A的左子树的根:B A的右子树的根:C。

2024-10-14 10:48:09 301

原创 循环队列的实现

用数组实现队列,把队头元素放在数组下标为0的一端,入队操作不需要移动元素,时间复杂度是O(1),但是出队所有元素都需要向前移动一个位置,操作时间复杂度是O(N)。设置队头队尾两个位置变量front和rear,入队时rear+1,出队时front+1,front指向队头元素的前一个位置,rear指向队尾元素的位置。但此时,整个队列会向着数组的高端移动,产生队列的单向移动性,会使低端剩余空余空间,产生“假溢出”。判满条件(obj->rear+1)%(obj->k+1)==obj->front。

2024-10-12 15:10:18 324

原创 MYSQL-创建数据库

创建数据库:create database db_name-本质是在var/lib/mysql创建一个目录。2数据库校验集--支持数据库,进行字段比较使用的,本质也是读取数据库中数据采用的编码格式。创建一个数据库database1,此时再去查看就会多一个database1数据库。数据库无论对数据做任何操作,都必须保证操作和编码必须是编码一致的。删除数据库drop database database1。对数据库的修改主要指的是修改数据库的字符集,校验规则。1数据库编码集--数据库未来存储数据。

2024-09-27 21:25:52 528 1

原创 c艹函数对象

包含头文件<functional>

2024-06-02 11:41:23 273

原创 queue容器和List容器

先进先出队列容器允许从一端新增元素,从另一端移除元素队列中只有队头和队尾才可以被外界使用,因此不允许有遍历行为,如果一定要访问对内的某个元素,只能将其前面的元素全部从队中删除,使之成为队头才可以入队操作只在队尾进行,出队操作只在队头进行。

2024-05-31 09:18:28 293

原创 Stack容器

栈的基本操作:入栈push(),出栈pop(),从栈顶删除元素pop(),判断栈空empty(),返回栈中元素个数size()因为不能遍历,想看栈中元素,要查看栈顶元素,并执行出栈操作。栈不允许遍历行为,栈容器符合先进后出,后进先出。

2024-05-29 15:05:45 173

原创 动态运行时多态

通常不允许把一种类型的地址赋值给另一种类型的指针,也不允许用一种类型的变量为另一种类型的引用赋初始值,但指向基类的指针或引用可以指向或引用派生类对象,而不必进行强制类型转换。

2024-05-26 20:28:10 233

原创 STL序列容器

当vector对象的存储空间不够时,vector对象会自动使用new运算符申请一块更大的内存空间,使用赋值运算符将原有的数据复制到新存储空间,并释放原有存储空间。注意:他不是在原有空间之后接新空间,而是找更大的内存空间,然后将原来的数据拷贝到新空间,并释放原空间。

2024-05-26 19:46:54 487

原创 指针基本概念

int *pa=&a*说明pa是指针变量int说明pa指向的对象是int类型指针变量的大小→存放的是啥→地址→地址存放需要多大的空间,指针变量大小就多大32位机器上:地址是32个0/1二进制序列,存储起来需32个比特位,4个字节64位机器上:地址是64个0/1二进制序列,存储起来需64个比特位,8个字节。

2024-04-18 21:59:52 407

原创 指针数组与指针数组

int arr1[5]//数组类型是int[5]int arr2[8]//数组类型int[8]int(*p)[10]=&arr//类型是int*[10]int *p1[10]//指针数组,p1这个数组含有十个int*类型的元素int (*p2)[10]//数组指针,p2指针变量指向int [10]

2024-04-18 18:36:05 463

空空如也

空空如也

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

TA关注的人

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