自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 计算机网络(tcp_socket )(一)

(1)我们之前说过客户端是不需要显示的进行bind的,因为端口号是OS自动帮我们分配的,之前UDP发消息有sendto(参数里包含IP和PORT),但是TCP用的是write和read,明显用这个接口IP和PORT传入不了。(1)TCP是通过文件描述符来实现功能的,所以TCP比UDP更像文件,且接口也是read。(1)accept:从指定文件描述符(只负责接收新的连接)中获取新的连接 / 客户端。参数一:监听文件描述符(这里的fd只负责接收新的连接)参数一:文件描述符(socket)这里跟UDP是一样的。

2025-10-18 17:45:20 785 1

原创 计算机网络(udp_socket)(一)

(1)其中第二个是网络通信,第三个是本地通信,第一个接口是通用的接口,所以接口我们使用第一个,网络通信时定义变量还是定义第二个变量,本地通信时定义第三个变量,最后传参时强转即可(这就是继承与多态的原理!(1)参数一:domain(域 / 协议家族),创建本地通信还是网络通信,参数如下(我们学习的是网络通信,也就是AF_INET,我们接下来的代码只用这个参数)(4)返回值:返回值为文件描述符(也就是它创建了一个文件,所谓的网络通信就是利用网卡这个设备,linux下一切皆文件,包括网卡)(5)谁给我发的消息?

2025-10-10 21:41:51 682

原创 C++ 11(二)

lambda 表达式语法使⽤层⽽⾔没有类型,所以我们⼀般是⽤auto或者模板参数定义的对象去接收 lambda 对象。

2025-10-10 18:40:08 830

原创 linux(sem信号量 + 线程池)

从321原则中的3(生产和消费、生产和生产、消费和消费),生产和消费我们已经完成了同步与互斥,我们现在需要新增生产和生产,消费和消费之间的互斥关系,这里需要两把锁。(1)POSIX信号量和SystemV信号量作⽤相同,都是⽤于同步操作,达到⽆冲突的访问共享资源⽬的。但POSIX可以⽤于。⽇志有现成的解决⽅案,如:spdlog、glog、Boost.Log、Log4cxx等等,我们依旧采⽤⾃定义⽇志的⽅式。(2)锁其实就是之前学的信号量的一个子集,也就是将资源整体使用,信号量其实就是资源的数目。

2025-10-04 22:00:18 871

原创 有关云服务器的一系列问题

点击进来是这个页面,如果当前云服务器刚刚购买,我们需要先重置密码(右上角)需要注意的是这里的用户名必须与上面的用户名一致,不然可能会连接不成功。这里只给出我遇到的问题,可能是由于没有下载编译器的缘故,下载后即可。(3)它会在上方提示输入,输入的内容为 ssh 用户名@公网ip。(4)输入后就已经连接好了,我们就可以在当前路径下新建了。这两行,第一行填用户名,第二行填所要连接的公网ip。(6)以上就是Xshell免密码的所有过程了。(4)打开Xshell,点击新建对话。(3)复制公网 ip。

2025-10-02 21:03:40 244

原创 Linux(线程同步与互斥)

第二行中mutex它是在内存中申请的空间,存储的是1,这句代码的意思是交换寄存器内的0和mutex内的1,这样mutex中的值就变为了0,只有第一个交换的线程的al寄存器内存的值是1,其他所有的进程交换后al寄存器内的值都是0,所以其他所有进程都必须等交换后al寄存器内值为1的线程归还锁的1才能够申请到锁。(1)在321原则中21我们都已经满足了,现在差的就是3(3种关系),由于我们的代码中生产者和消费者用的是同一把锁,所以天然的生产者和消费者互斥,所以我们只需要加线程就可以。

2025-10-02 20:35:49 779

原创 Linux(线程库和线程封装)

上图中第一行的value只存在一份,也就是每一个线程拿到的变量地址都是一样的,其中一个线程中的该值发生改变,所有线程中的都发生变化,而下面一行中的value每个线程拿到的地址都不一样,并且值不会随一个线程改变而改变(errno就是基于这种方式实现的)(2)前面我们学过线程的各种函数是依赖于库的,库也要被加载到内存中,它也会通过页表被映射到进程地址空间中的共享区,因为线程共享进程地址空间中的各种区,所以共享区也被共享,所以所有线程都能够看到线程库,所以新线程和主线程都能使用各种线程函数。

2025-10-01 12:08:36 763

原创 Linux(线程控制)

那我们现在思考一个问题,为什么thread_join的第二个返回值类型为void**,原因是当新线程退出时如果我们使用void类型,就返回不了(void它是没有大小的,OS根本不知道开辟多少空间给它),但是void*它是有大小的(32位为4字节,64位为8字节),为了能够成功传参这里采用的void**类型。第四个参数:我们给线程起的名字,这个参数就是我们传递给第三个函数指针的参数(回调函数),这个参数的类型为void*,意思是我们可以传递任意类型的参数。(4)等待线程是要等待线程退出,那要是线程不退出?

2025-09-27 16:36:14 1210

原创 linux(线程概念)

做法是我们将虚拟地址的起始地址设为0,那么页表中的第一项就代表这个虚拟地址,虚拟地址为1,页表对应第二项,⻚表中的每⼀个表项,指向⼀个物理⻚的开始地址。(2)一个虚拟地址(0xffff ffff),那么它其实是某一个字节的地址,这个虚拟地址一共有32位(4GB内存中),其中前10个bit位代表的是在页目录中的位置,中间10个bit位代表的是页表中的位置,所以虚拟地址的前20位就可以找到物理内存块(页框)的地址,后12位其实是在这4kb块内,某一个字节的偏移量,故此我们能通过一个虚拟地址找到它指向的。

2025-09-25 19:14:01 664

原创 linux(信号done)

所以OS做了一定的预防)(1)上一章我们已经了解了当我们开启电脑时,OS是首先被加载到内存中的软件,这里我们谈论的内存为4GB,其中1GB左右为内核区,3GB为用户区,用户区有用户级页表,内核区有内核级页表,对于内核区我们一般只关心系统调用。---- 不关心,我们只关心系统调用号,我们调用任何函数(库,系统调用)都是在自己的进程地址空间中调用的,因为内核级页表有且只有一份,所以无论OS如何切换进程,都能找到一个OS。(1)信号捕捉方法执行的时候,为什么要做权限切换(内核和用户),直接内核做不就行了吗?

2025-09-21 17:24:57 848

原创 linux(进程信号)

硬件理解处理信号(1)OS怎么知道键盘上有数据了?-----

2025-09-20 19:50:49 695

原创 进程之间的通信(共享内存 + 其他IPC原理)

1、共享内存本质上就是物理内存上的一块区域,我们通过将其与页表建立链接,并映射到进程的共享区,这样我们的进程就能够看到这份资源,如果我们将另一个进程也与其建立链接,那么物理内存上的这块区域就叫做共享区。3、共享内存的保护机制需要用户完成保护(我们使用信号量 / 命名管道,锁我们没学),被保护的共享资源就是临界资源,访问公共资源的代码叫做临界区。(3)两者共同使用,如果shm不存在,则创建,如果存在,出错返回 ---- 只要成功,一定是新的共享内存(不拿老的共享内存)怎么保证不同进程看到的是同一个共享内存?

2025-09-16 19:41:44 892

原创 进程之间的通信(管道)

• 数据传输:⼀个进程需要将它的数据发送给另⼀个进程• 资源共享:多个进程之间共享同样的资源。• 通知事件:⼀个进程需要向另⼀个或⼀组进程发送消息,通知它(它们)发⽣了某种事件(如进程终⽌时要通知⽗进程)。• 进程控制:有些进程希望完全控制另⼀个进程的执⾏(如Debug进程),此时控制进程希望能够拦截另⼀个进程的所有陷⼊和异常,并能够及时知道它的状态改变。如何进行通信?让不同的进程看到同一份资源某种形式的内存空间提供资源的人:操作系统• 管道是。

2025-09-10 21:23:55 895

原创 深刻理解软硬件链接

之前我们只知道 . 代表自己,但我们不知道为什么,今天就可以给大家解释了 . 其实就是对自己的一个硬链接,所以目录默认为2,新建目录为什么变为3?现在我们创建了一个目录和一个文件,默认文件硬链接数是1,这个没什么问题,但是目录默认却是2,并且我们在该目录下又建一个目录,链接数又变成3了?软链接本质上是独立的新建文件(在用户层,软链接的文件与原本文件具有相同的效应),我们可以将其理解为win上的快捷方式。1、软链接有独立的inode,软链接内容上保存的是目标文件的路径(win下的快捷方式)

2025-08-30 16:34:28 433

原创 文件与fd

2、c语言中的scanf与printf它叫做格式化输入与输出,它的作用就是将文件内的内容以固定格式来输入输出,其次计算机所谓的文本与二进制其实没有本质差别,不管我们输入的是字符,数字,符号,本质上计算机都是以二进制处理的,例如可执行文件,我们要知道可执行文件会被编译成二进制,我们向二进制文件输入文件,它会认识吗?,在系统中文件管理与权限管理是两个不同的模块,如果文件已经存在,第三个参数没有影响,但是如果我们是打开一个新的文件时,会创建一个新的文件,如果不带第三个参数,那么该文件的权限是乱码。

2025-08-23 19:15:00 745

原创 进程的深刻理解

2、阻塞:每一个硬件设备也被一个结构体所管理,这个结构体内有着该设备的准备情况,例如一个程序需要键盘读入,但是我们一直不向键盘写入,那么该runqueue里所有的进程岂不是都会卡在当前这个进程,这是不被操作系统所允许的,故此设计师就在硬件的struct device中设计一个队列,专门来存放这些还没有准备好的进程,当我们再次输入后,操作系统就会将这个进程重新放入运行队列。在runqueue中存在一个queue,这个队列存放的是每一个进程的优先级,0-100(实时进程),100-140(我们的进程),

2025-08-11 19:53:26 762

原创 计算机网络(基础概念)

计算机网络基础概念摘要 本文介绍了计算机网络的基础概念,重点围绕协议分层和TCP/IP协议族展开。主要内容包括: 协议分层:协议本质是一种约定,采用分层设计实现模块化解耦,增强可维护性。OSI七层模型从物理层到应用层各司其职,实际主要关注1-4层。 TCP/IP协议:作为通信解决方案,其分层对应不同问题域。协议栈各层通过结构化数据类型实现通信,网络代码作为操作系统的一部分运行。 网络传输流程:局域网通过MAC地址识别设备;跨网络传输依赖IP地址标识主机,路由器连接不同网络。数据封装/解包过程贯穿各协议层。

2025-07-14 14:42:24 1070

原创 计算机系统概述(2)

我们知道计算机执行的过程其实就是一串串指令执行的过程,指令的执行都是需要相应的控制信号进行控制,这时问题来了,这些控制信号什么时候发出?这些都需要相应的定时信号作为同步的,cpu产生得时钟信号就可以作为同步的定时信号,用来统一各个步骤的控制信号,在执行指令时,每个时钟周期内执行一定数量的指令操作。当我们使用cmd时他也会加载到内存中,然后我们输入.exe文件,这个文件也会加载到内存,然后会调用操作系统的系统调用服务,才能将内容显示到显示器。这里需要使用最上面七个思想中的第二个:加速经常性事件。

2025-05-26 17:00:16 71 1

原创 python基础语法(2)

基于缩进的方式表示代码块, 带来的好处就是强制要求程序猿要写明确的缩进, 来明确代码之间的相对关系. 如果缩进书写的不对, 则直接报错.在代码1 中, print(“world”) 有一级缩进, 这个语句属于 if 内的代码块, 意味着条件成立, 才执行, 条件。执行结果一定为 “123”, 而不会出现 “321” 或者 “132” 等. 这种按照顺序执行的代码, 我们称为 顺序语句.python 的 for 和其他语言不同, 没有 “初始化语句”, “循环条件判定语句”, “循环变量更新语句”, 而是。

2025-05-06 19:42:24 523 2

原创 再识动静态库、ELF加载

6、程序最终在磁盘上存储的其实是二进制,将文件内容加载到内存中时,其实是加载到内存的物理地址,文件内容也就是一句句指令,它是不是也要有自己的物理地址,所以一个程序被加载到内存中时,不光它内部有互相调用的虚拟地址,还有被加载到内存的物理地址。main函数并不是第一个执行的函数,所以它的地址并不是0,其次指令它是二进制,也有自己的长度,两个地址之间的差值就是一个指令的长度,逻辑上只需要找到起始地址,就可以运行该程序。1、首先可执行程序是有自己的格式的,它的格式我们称为ELF,上面这张就是ELF的具体组成。

2025-05-04 16:52:17 874

原创 磁盘文件系统

1、文件可以分为打开的文件和没有被打开的文件,之前我们谈的进程中的文件就是打开的文件,这一节的内容我们要讲的就是没有被打开的文件2、首先我们需要明白对于所有的文件,其实没有被打开的文件占大多数,所以对没有被打开的文件的管理是非常重要的,其次我们需要知道打开的文件是被加载到内存的,那没有被打开的文件在哪里?—很显然就是磁盘3、磁盘上的文件被打开的前提是什么?

2025-05-03 15:18:58 1233

原创 进程控制(linux)

当程序要创建子进程时,父进程就会将当前页表的执行权限全部改为只读,当子进程数据需要修改时,操作系统就会马上识别到我们当前操作是对只读区域进行修改(触发系统错误),然后系统进行缺页中断进行系统检测,然后系统判断发生写时拷贝,然后系统再申请内存、发生拷贝、、、、6、我们上面已经知道了当我们使用execl时,该进程的代码和数据就已经全部被替换,那要是我们让子进程去执行execl这一操作,父进程仍然完成自己的操作,例如命令行提示,这不就是一个简单的shell嘛。如,子进程运行完成,结果对还是不对,

2025-04-21 14:37:06 1156 2

原创 python基础语法的学习(1)

a = 10创建变量的语句非常简单, 其中a 为变量名. 当我们创建很多个变量的时候, 就可以用名字来进行区分.= 为赋值运算符, 表示把 = 右侧的数据放到 = 左侧的空间中.注意: 变量的名字要遵守一定规则.硬性规则(务必遵守)1.变量名由数字字母下划线构成.2.数字不能开头.3.变量名不能和 “关键字” 重复.4.变量名大小写敏感. num 和 Num 是两个不同的变量名.软性规则(建议遵守)1.变量名使用有描述性的单词来表示, 尽量表达出变量的作用.

2025-04-15 20:31:26 728

原创 动态规划算法

https://www.luogu.com.cn/record/2081482932.2 数字三角形https://www.luogu.com.cn/record/2081590913、基础线性dp线性dp 是动态规划问题中最基础、最常⻅的⼀类问题。它的特点是状态转移只依赖于前⼀个或前⼏个状态,状态之间的关系是线性的,通常可以⽤⼀维或者⼆维数组来存储状态。我们在⼊⻔阶段解决的《下楼梯》以及《数字三⻆形》其实都是线性 dp,⼀个是⼀维的,另⼀个是⼆维的。https://www.luogu.co

2025-04-12 16:27:55 1381

原创 Linux下的环境变量和命令行参数

5、子进程也有地址空间,子进程直接继承父进程的页表,代码与数据,所以子进程也会直接映射父进程的物理地址,在不修改时物理地址也会共享,但一旦发生写入,操作系统会申请一个同样大小的物理空间,然后操作系统直接更改子进程页表里的物理地址,但虚拟地址不会发生变化(写时拷贝机制)4、一个进程的地址空间由自己的struct mm_struct(虚拟地址),但总归这个程序的数据还是要存放于内存当中,所以操作系统引入页表,页表左边存放着虚拟地址,右半部分存放着物理地址,程序员对虚拟地址的操作会映射到物理地址。

2025-03-25 22:55:34 1160 1

原创 冯洛伊曼和OS概念

2、阻塞:每一个硬件设备也被一个结构体所管理,这个结构体内有着该设备的准备情况,例如一个程序需要键盘读入,但是我们一直不向键盘写入,那么该runqueue里所有的进程岂不是都会卡在当前这个进程,这是不被操作系统所允许的,故此设计师就在硬件的struct device中设计一个队列,专门来存放这些还没有准备好的进程,当我们再次输入后,操作系统就会将这个进程重新放入运行队列。在runqueue中存在一个queue,这个队列存放的是每一个进程的优先级,0-100(实时进程),100-140(我们的进程),

2025-03-15 15:38:44 1063 1

原创 数据结构--算法篇

单调栈,顾名思义,就是具有单调性的栈。它依旧是⼀个栈结构,只不过⾥⾯存储的数据是递增或者递减的。这种结构是很容易实现的(如下⾯的代码),但重点是维护⼀个单调栈的意义是什么?单调栈解决的问题单调栈能帮助我们解决以下四个问题:• 寻找当前元素左侧,离它最近,并且⽐它⼤的元素在哪;• 寻找当前元素左侧,离它最近,并且⽐它⼩的元素在哪;• 寻找当前元素右侧,离它最近,并且⽐它⼤的元素在哪;• 寻找当前元素右侧,离它最近,并且⽐它⼩的元素在哪。虽然是四个问题,但是原理是⼀致的。

2025-03-14 22:56:11 1200

原创 搜索算法总结

搜索,是⼀种枚举,通过穷举所有的情况来找到最优解,或者统计合法解的个数。因此,搜索有时候也叫作暴搜。搜索⼀般分为深度优先搜索(DFS)与宽度优先搜索(BFS)。

2025-03-11 19:24:32 1007

原创 基础算法总结

模拟,顾名思义,就是题⽬让你做什么你就做什么,考察的是将思路转化成代码的代码能⼒。这类题⼀般较为简单,属于竞赛⾥⾯的签到题(但是,万事⽆绝对,也有可能会出现让⼈⾮常难受的模拟题),我们在学习语法阶段接触的题,⼤多数都属于模拟题。当数据的值特别⼤,各种类型都存不下的时候,此时就要⽤⾼精度算法来计算加减乘除:• 先⽤字符串读⼊这个数,然后⽤数组逆序存储该数的每⼀位;• 利⽤数组,模拟加减乘除运算的过程。⾼精度算法本质上还是模拟算法,⽤代码模拟⼩学列竖式计算加减乘除的过程。

2025-03-06 23:40:56 1087

原创 Linux下的git与gdb

协作:首先在gittee新建仓库然后点击克隆/下载然后复制HTTPS里的网址将远端仓库拉取到本地:进入这个目录之后.git就是隐藏的本地仓库(里面包含的是所有的修改记录).gitignore:后缀过滤,远程仓库只提交源文件(.c/.cpp/.h)当我们需要提交代码到本地仓库时:但是这个时候其实还并未直接添加到git里,而是先添加到临时仓库里查看当前git仓库状态当我们需要将临时仓库里的文件提交到git需要我们称为日志信息/提交日志信息那我们如何将本地仓库提交到远程仓库:需

2025-03-05 20:29:04 936 1

原创 _make_进度条

去掉前面的lib和后缀,剩下的就是什么的库静态链接,相当于我们将库中的这一个方法下载到本地链接使用,例如一个文件如果使用静态库中的一个方法,那么就会将文件与库方法结合形成一个新的文件动态链接,相当于这个方法在库(共享库)中存着,我们需要使用再去库中找它,但是共享库一旦缺失会导致全部程序无法执行。

2025-03-03 09:20:43 995

原创 Linux开发工具

1、在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序.2、但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放在一个服务器上, 通过包管理器可以很方便的获取到这个编译好的软件包, 直接进行安装.3、软件包和软件包管理器, 就好比 “App” 和 “应用商店” 这样的关系.4、yum。

2025-02-27 22:41:32 1112

原创 Linux下的权限

在两个普通用户需要进行文件交互时,我们需要在 / 目录下的一个叫做tmp目录下操作(不能在私人账号下操作),这个时候我们需要打开other的rwx权限,但此时别人也可以删除我们所拥有的文件,2、系统确定用户时,只会匹配一次,也就是如果自己为拥有者,但关闭了拥有者的读写权限后,就算所属组里也有自己,也不会让自己读写。那么现在就出现一个问题,如果普通用户只需要自己的密码就可以提权为root,那么岂不是人人root?例如:安装软件,需要root权限-----所有软件其实只安装了一份,允许大家使用。

2025-02-26 19:32:45 993

原创 linux基本指令(2)

less /var/log/messages 跟more功能一样,但它支持向上翻找(推荐),/内容,自动定位包含该内容的那一页日志。2、echo “内容” > test.c :将指定内容写入指定文件,如果该文件不存在,会创建文件并写入,再次写入时,先清空,再写入。more /var/log/messages 只打印满一屏幕日志,如果需要继续查看,点击回车。echo ‘内容’ >/dev/pts/0 向0号终端设备写入内容,也就是在0号设备打印。cat /var/log/messages 查看日志。

2025-02-23 17:07:46 717

原创 linux基本指令(1)

指令1

2025-02-22 11:33:31 884

原创 linux初识

用于Debian的所有Binary软件包都可以安装到Kali Linux上,而Kali的魅力或威力就来自于此。Fedora是一款非常好的发行版,有庞大的用户论坛,软件库中还有为数不少的软件包。Ubuntu侧重于它在这个市场的应用,在服务器、云计算、甚至一些运行Ubuntu Linux的移动设备上很常见。毫无疑问,Kali Linux是一款渗透测试工具,或者是文明黑客(我不想谈论恶意黑客)青睐的操作系统。,此时任何选项都接收即可,在输入密码时,如果出现密码框是灰色的,那么此时我们需要在云服务器上重置密码。

2025-02-22 09:10:14 714

原创 蓝桥杯准备训练(lesson5 ,c++)

上⾯⽰例中, There are %d apples\n 是输出⽂本,⾥⾯的 %d 就是占位符,表⽰这个位置要。printf() 的第⼆个参数就是替换占位符的值,上⾯的例⼦是整数 3 替换 %d。上⾯⽰例中, %s 表⽰代⼊的是⼀个字符串,所以 printf() 的第⼆个参数就必须是字符串,这个例。++ 是⼀种⾃增的操作符,⼜分为前置 ++ 和后置 ++ , – 是⼀种⾃减的操作符,也分为前置 –⼦是 zhangsan。占位符的第⼀个字符⼀律为百分号 % ,第⼆个字符表⽰占位符的类型, %d 表⽰这。

2024-12-10 20:07:13 3580 53

原创 蓝桥杯准备训练(lesson4 ,c++)

意识到数据类型的取值是有其范围的,那么我们在编程的时候就要选择合适的数据类型,才能得到正确的结果。在写代码时候,⼀定会涉及到计算。上⾯⽰例中,尽管变量 x 的类型是 float (浮点数),但是 6 / 4 得到的结果是 1.0 ,⽽不是。链接:https://ac.nowcoder.com/acm/contest/18839/1031。链接:https://ac.nowcoder.com/acm/problem/21990。• / 除法的操作符,除数不能为0,如果除数为0,程序会崩溃的。

2024-12-07 20:23:38 4579 74

原创 蓝桥杯准备训练(lesson3 ,c++)

常量与变量

2024-12-06 11:41:39 1788 9

原创 蓝桥杯准备训练(lesson2 ,c++)

数据类型介绍

2024-12-04 17:58:29 2680 55

空空如也

空空如也

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

TA关注的人

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