自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 liunx线程互斥

为了实现互斥锁操作,大多数体系结构都提供了swap或exchange指令,该指令的作用把寄存器和内存单元的数据相交换,由于只有一条指令,保证了原子性,即使是多处理器平台,访问内存的,总线周期也有先后,一个处理器的交换指令执行时另一个处理器的指令只能等待总线周期。所以在一个线程执行三步操作期间,发生线程切换,其他线程对g_val变量进行操作,就会导致问题。原子性:不会被任何调度机制打断的操作,该操作有两态,要么完成,要么未完成。交换的本质:所有线程在争锁时,只有"1",交换是一条汇编-->原子的。

2024-10-24 22:30:30 688

原创 liunx线程和进程对比

线程的硬件上下文是指线程在执行过程中,CPU寄存器的当前状态。线程与轻量级进程在概念上是相似的,都表示进程内部的一个执行单元。linux中没有线程相关的系统调用,只有轻量级进程的系统调用。每个线程都有自己独立的栈结构,用于存储线程的局部变量、函数调用信息以及返回地址等。线程的栈空间是线程私有的,这意味着一个线程不能访问另一个线程的栈空间。在线程切换时,操作系统会保存当前线程的硬件上下文,并加载下一个要执行的线程的硬件上下文。线程ID,一组寄存器,栈,errno,信号屏蔽字,有限调度级。

2024-10-22 22:05:27 353

原创 共享内存详解

ftok函数是一个在Unix和Linux系统中广泛使用的函数,用于生成一个唯一的键(key),这个键通常用于IPC(进程间通信)机制,如消息队列、信号量或共享内存。如果失败,返回-1,并设置errno以指示错误。共享内存是一种允许多个进程或线程访问同一块内存区域的机制,它是最快的可用进程间通信(IPC)形式之一。共享内存被创建,如果进程结束,我们没有主动释放,则内存会一直存在,除非重启系统(成功返回一个非负整数,即该共享内存的标识码,失败返回-1。成功返回一个指针,指向共享内存的第一节,失败返回-1。

2024-09-23 11:39:12 1030

原创 命名管道详解

匿名管道应用的限制就是只能在具有共同祖先的进程间通信。如果我们想要在不相关的进程之间交换数据,可以使用使用FIFO文件来做这项工作,它被称为命名管道。命名管道是一种特殊类型的文件。命名管道其实就是一个文件。如果当前读操作打开FIFO。如果当前写操作打开FIFO。

2024-09-22 19:02:01 389

原创 匿名管道详解

pipe创建的是内存级的文件,匿名文件(管道),匿名管道只能进行血缘关系进程通讯。参数:fd文件描述符,其中fd[0]表示读端,fd[1]表示写端。返回值:成功返回0,失败返回返回错误代码。pipe函数创建一无名管道。

2024-09-16 17:22:40 556

原创 linux动静态库

在运行可执行程序时,才会去链接动态库的代码,多个程序共享使用库的代码(在可执行文件开始运行之前,外部函数的机器码由操作系统从磁盘复制到内存中,这个给过程称为动态链接)程序在编译链接时把库的代码链接到可执行文件中。程序运行的时候就不需要静态库了。另外使用ar -tv xxx.a指令可以查看静态库中的目录列表。1.首先把.c文件编译成.o文件。多个进程如何使用一个动态库。2.把.o文件生成静态库。

2024-09-16 12:28:46 456

原创 liunx文件系统

一个文件系统会被分为多个Block Group,每个Block Group中又有Super Block,GDT,Block Bitmap,inode Bitmap,inode Table,Data blocks。Super Block用于存放文件本身的结构信息,存储了block和inode的总量,未使用的block和inode数量,,block和inode的大小,最近挂载的时间,最近写入数据的时间,最近一次检验磁盘的时间,Super Block信息被破坏,可以说整个文件系统被破坏了。

2024-09-14 11:07:56 962 2

原创 AVL树插入详解

二叉搜索树可以提高搜索的效率,但是如果数据有序或者接近有序,就会退化为单边树,查找效率相当于在顺序表中查找数据,时间复杂度会退化到O(n)。AVL树解决了这个问题,通过保证每个节点的左右子树高度之差的绝对值不超过1,将时间复杂度保证在O(log2(n))左右。

2024-06-24 22:22:55 721

原创 二叉搜索树

如果该节点有左右孩子,需要使用替换法,将(最大左子树节点/最小右子树)节点的值,和该节点的值交换,然后删除最大左子树节点/最小右子树)节点。如果该节点只有左孩子,把这个节点的左孩子托付给该节点的父亲,然后删除该节点。如果该节点只有右孩子,把这个节点的右孩子托付给该节点的父亲,然后删除该节点。,因为需要通过引用指针去改变父亲节点的指向,如果调用。如果该节点没有左右孩子,直接删除该节点即可。

2024-05-21 11:47:34 385

原创 Linux中的文件描述符

在Linux系统中,文件描述符是一个非负整数,用于指代被打开的文件。程序刚刚启动的时候,默认有三个文件描述符,分别是0(代表标准输入),1(代表标准输出),2(代表标准错误)。如果此时去打开一个新的文件,它的文件描述符会是3。当我们创建文件时,操作系统要创建相应的数据结构来描述目标文件,结构体file就表示一个已经打开的文件对象。进程要调用open打开文件,需要通过PCB(task_struct)中的file*,找到指向的一张表file_struct,这个表最重要有一个。有效的提高c的使用效率。

2024-05-19 22:46:53 1258 1

原创 Liunx信号详解

我们可以使用kill -l查看系统定义的信号列表每一个信号都有一个编号和一个宏定义名称,这些宏定义放在signal.h。我们也可以使用man 7 signal 查看这些信号各自在什么条件下产生,并且默认的动作是什么。Action对应的默认动作:Term默认中止进程Ign默认忽略信号Core默认中止进程并且进行Core dump(核心转储)Stop默认停止进程Cont默认使停止的进程继续。

2024-05-01 14:50:53 90

原创 c++多态

被virtual修饰的是类成员函数成称为虚函数。

2024-02-15 15:41:25 414 1

原创 c++继承

继承可以使代码可以重复使用,这个机制使子类拥有自己和父类的属性。类似父亲和儿子的关系,父亲有十万的财产,儿子有一万的财产,等到儿子“继承”家业的时候,他就拥有了父亲的那十万财产和自己的那一万财产。继承格式下面这个代码中A是基类,也叫做父类。B是派生类,也就是子类B在继承过后,有了A中的成员变量,也有了自己类中的成员变量。

2024-02-07 17:24:51 1296

原创 c++ string模拟实现

如果开的空间比n大,开n+1空间并拷贝_str的内容到tmp中,再把原空间释放让_str指向tmp,_capcaity=n+1。将str内容拷贝过去,size+=len(strcat在_str追加str内容时不会在末尾加'\0')//如果pos=0,cur-->size_t,需要将'\0'一起移动。//如果pos=0,cur-->size_t,需要将'\0'一起移动。(尾插会把最后的'\0'覆盖,所以要将最后一位变成'\0'//本来是_str自己开空间,让tmp给_str打工。

2024-01-30 19:18:32 1514

原创 插入排序详解

如果A1比较大:让A1向前挪动一位放在A2的位置,然后让tmp和A0比较,因为A0不存在,所以直接将第一个位置赋值为tmp。插入排序就是把待排序的元素插入到已经的序列中,直到所有的元素插入完全,就得到了一个有序序列。这里使用A1,A2,A3……代表第一个数,第二个数,第三个数。3.将A3,A4……依次插入,重复类似2步骤的操作。1.可以把A1直接看成有序列表,从A2开始排序。2.把A2和A1比较,使用tmp记录A2的值。如果A1比较小:直接让第二个位置赋值为tmp。例如:下面要排序:4 ,3,7,1。

2023-12-17 15:10:23 58

原创 进程地址空间(虚拟地址)转换物理地址

进程地址空间(mm_struct)就是把虚拟内存分块进行管理,它也是被放在PCB(task_struct)中管理起来的,可以通过PCB找到对应的进程地址空间。每个进程都要一个进程地址空间(32位下[0,4G]),也就是每个进程都认为自己独享内存资源。

2023-12-15 16:31:56 777

原创 c/c++内存管理

对于自定义类型new相当于开辟空间+调用类的。

2023-11-17 21:49:49 51

原创 Linux中的make和makefile

make是类似一个批量处理的命令,它可以实现自动编译,它本身并没有编译和链接的功能,而是用类似于批量处理的方式,通过调用makefile文件中用户指定的命令来进行编译和链接的make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。好比修建一栋建筑,编写makefile的过程相当于画图纸,调用make命令相当于工程师看图纸分配任务。

2023-11-11 22:46:15 103 1

原创 c++构造函数,析构函数,拷贝构造函数

如果没有显示定义,编译器会自己生成拷贝构造函数,默认的拷贝函数会将对象内存内容直接拷贝给新的对象,这样的拷贝称为浅拷贝或者值拷贝,如果类中没有涉及到申请空间的话,可以不用写拷贝构造函数,编译器自己生成的拷贝函数就可以完成任务。如果类中涉及到了动态内存开辟,我们需要自己构造一个拷贝函数,模仿拷贝构造的原理,为s2._a开辟一个和s1._a指向空间一样大的空间,这样再调用析构函数时,指针各自释放各自申请的空间。默认生成的析构函数,行为和构造类似,内置成员不做处理,自定义成员会调用他的析构。

2023-11-10 21:50:00 66

原创 Linux文件和文件夹权限

一个文件能否被删除,并不取决于文件本身,取决于当前文件夹是否有'w'权限,如果在一个目录中共享文件,作为other没有'rwx'权限,但是other照样可以删除文件,这十分不合理。chmod g-r /home/user1/test.c ----> 给test.c文件的所属组g取消r权限。chmod u+w /home/user1/test.c ----> 给test.c文件的拥有者u增加w权限。总共r,w,x三种权限,三种权限可以任意组合。

2023-11-02 17:33:54 161 1

原创 C++类和对象

1.类的定义c语言是面向过程的语言,分析问题并把它拆分为几个过程,再通过函数调用实现,c++是面向对象的语言,分析问题并把它拆分成几个对象,再通过对象之间的交互实现class的定义和struct类似,class为定义类的关键字,ClassName为类的名字,{}中间的是类体用于定义成员变量和成员函数(类方法),注意括号{}后面需要带分号class//类体//后面需要带分号1.类方法的两种定义方法方法一:把类方法的声明和定义都放在类中ps:类的声明和定义都放在类中,编译器可能将其当成内联函数。

2023-10-28 15:21:48 62 2

原创 堆和二叉树

顺序存储的前提是完全二叉树,顺序存储就是使用数组来存储,类似顺序表的结构,因为完全二叉树的每个节点都是紧紧挨着,不会有空间的浪费,而且会有特殊的性质。二叉树这类的问题可以用递归快速解决,因为二叉树的特殊性质,二叉树可以分成根节点和左右子树,左右子树也可以分成根节点和左右子树,这个过程和递归相似,所以使用递归解决很合适。堆是一颗完全二叉树,堆分为大堆和小堆,父节点总是大于子节点的树是大堆,父节点总是小于子节点的树是小堆。子节点:一个节点具有子树的根节点,根节点称为该节点的子节点,如上图:B是A的子节点。

2023-10-14 10:54:48 151 1

原创 栈 和 队列

队列还需要指向。

2023-10-02 18:29:55 59 1

原创 顺序表和链表

如果我们想要存储数据,最常见的就是数据与数据之间一一联系,前一个数据和后一个数据相连,这种数据结构最后会像线一样连成一串,这种关系逻辑被称为线性结构,线性表根据物理结构分为顺序表和链表,顺序表的物理地址是连续的,链表的物理地址使用一根线连接。在挪动覆盖数据时注意:创建一个变量end用于遍历pos之前的元素,将end赋初值为pc->size,让pc->a[end] = pc->a[end + 1], 每次end++直到end<pc->size-1。扩容一般是以2倍空间扩容,会有一定空间的浪费。

2023-09-05 22:04:23 74

原创 (c语言)动态内存管理

结构中柔性数组成员前面必须有至少一个成员sizeof返回的结构体的大小不包括柔性数组的内存包括柔性数组成员的结构用malloc()函数进行内存的分配,并且分配的内存应该大于结构的大小typedefstructstinti;inta[];

2023-08-29 15:46:12 73 1

原创 结构体,位段,联合(c语言)

结构体成员可以是int, unsigned int, signed int或者是char(整形类型)位段的成员名后面有一个冒号和一个数字成员后面的数字单位是比特位位段和结构体相似,例如:structAchara:3;charb:4;intc:15;intd 24;

2023-08-15 23:24:25 119 1

原创 c语言字符串库函数的模拟实现

首先判断指针str2为空直接返回str1,如果str2不为空,初始化一个指针pc遍历str1所指向的字符串,每次遍历时分别使用s1和s2指针对比两个字符串是否相同。函数的形参的void*类型的,保证了可以接受各种类型的值,所以在使dest的值等于src的值要进行(char*)强转,以可以控制一个字节大小的数据。首先定义一个指针begin记住第一个字符的位置,再通过寻找'\0'的方法找到'\0'的位置,两个指针相减就是中间的字符串长度。6.memmove函数的模拟实现。5.memcpy函数的模拟实现。

2023-07-28 11:27:20 74 1

原创 c语言指针解析

1.sizeof()用于求类型或者变量的长度,strlen用于求字符串的长度,注意strlen会从给定的地址一直找下去直到遇见'\0',所以如果没有'\0',strlen求出的是随机值。会在末尾自动加上'\0',相当于存储了a b c d e f '\0' 七个元素 ,此时使用strlen求出6。下面的程序打印的结果是什么呢?下面的程序打印的结果是什么呢?下面的程序打印的结果是什么呢?下面的程序打印的结果是什么呢?

2023-07-18 23:59:39 72 1

原创 PTA6-11 求自定类型元素序列的中位数(希尔排序详解)

其中给定集合元素存放在数组A[]中,正整数N是数组元素个数。该函数须返回N个A[]元素的中位数,其值也必须是类型。

2023-07-12 23:43:29 1390 3

原创 PTA 6-10 阶乘计算升级版

其中N是用户传入的参数,其值不超过1000。如果N是非负整数,则该函数必须在一行中打印出N!的值,否则打印“Invalid input”。

2023-06-12 18:40:36 301

原创 数据在内存中的存储

(3)双精度浮点数double在内存中的存储。

2023-06-05 13:11:04 80 1

原创 c语言实现扫雷游戏

panduan1.判断是否要玩游戏2.创建game()写出游戏主体代码(1)创建两个二维数组,Mine用于存放地雷,Show用于展示在屏幕(2)初始化两个数组,Mine初始化为全'0',Show初始化为全‘*’(3)设置地雷(4)创建打印函数,用于打印展示(5)创建函数FindMine寻找地雷3.(难点)使用递归完成爆炸式清除无雷的地方。

2023-05-12 21:17:59 87 1

原创 用c语言实现三子棋

首先通过switch判断是否进入游戏,然后将switch语句放在do while语句中,如果input为0,while判断部分为假,退出循环do while。(4)在while循环中实现玩家下棋和电脑下棋的过程,分别创建PlayerBoard()和ComputerBoard()函数。(5)创建一个函数IsWin,在人或电脑走完使用flag=IsWin(),对flag的值进行判断。(2)创建函数InintBoard()初始化棋盘。(3)创建函数PrintBoard()打印棋盘。2.game()函数。

2023-05-10 17:31:34 80 1

原创 初识c语言的知识总结

int --> 整形 (要注意int的取值范围,short --> 短整形long --> 长整形long long --> 更长的整形char --> 字符型float --> 单精度浮点数double --> 双精度浮点数。

2023-04-12 15:20:56 111 1

原创 对于目前计算机学习的规划

我目前是一个大一计算机类的学生,这是我写的第一篇博客,想要通过博客去分享和记录学习计算机知识的经过,记录自己的学习轨迹,也可以以此激励自己的学习。

2023-04-02 17:13:07 134 8

空空如也

空空如也

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

TA关注的人

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