自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【网络编程套接字】先跳过协议理论,直接网络编程帮助理解

11。

2024-08-07 13:15:20 87

原创 【网络基础一】几乎不讲任何网络协议细节,搭建网络基本结构

计算机里因为数据经过长距离传输,所以沟通的成本就高了,距离变成,信息传输衰减是问题,传递过来的信息我得知道这信息是什么意思,所以长距离传输是需要定一些协议的。例子:你去上大学,老爹在老家有一部座机,你给家里打电话 响铃一声,2声,三声,你和老爹约定好了这三种情况都是啥意思,这个东西就叫做协议。我们实际生活中收快递,假如你买了一个洗面奶,可是你会收到多出来的快递盒子,盒子上的各种信息字段,这个多出来的信息字段就叫做协议的报头。我们认为在你家里就是一个局域网,如果你访问自己的服务器,那么就是访问广域网。

2024-08-07 13:13:23 373

原创 lambda

在该函数体内,除了可以使用其参数外,还可以使用所有捕获到的变量。[ ]:捕捉列表里面可以传值捕捉,引用捕捉,捕捉上下文中的变量放进lambda函数中使用。mutable:lambda函数里变量默认是const,次关键字取消常性,不用就不写。->returntype返回值类型:函数返回值类型,一般可以由编译器推导,可以不写。lambda的类型是一个唯一的随机值,class之类的。,可调用对象分为三种,函数指针,仿函数,lambda。():参数列表也就是普通函数的参数,不需要可以省略。

2024-04-29 17:03:06 166

原创 智慧指针底层实现及其使用注意

为什么要有智慧指针?当抛出异常时,程序会立即跳转到匹配的 catch 块,跳过 try 块中剩余的代码。因此,在 try 块中分配的资源(如动态内存、文件句柄等)可能不会被正确释放。为了避免这种情况,可以使用智能指针(如 std::unique_ptr 和 std::shared_ptr)和 RAII(Resource Acquisition Is Initialization)技术来确保资源在异常发生时得到正确清理。智能指针 说白了 就是 指针管理那他是怎么管理的呢?

2024-04-28 16:39:46 197

原创 线程安全的单例模式

先描述在组织 本质就是一套面向对象的思想,大部分语言都支持面向对象,这就是语言设计者发现都 大家使用时都一样,都需要面向对象,他不是语言必要的特征,他是计算机发展必然的阶段,大家刚开始你是你我是我,二进制,汇编,C的,VB VC。因为后面网络服务器希望它是单例的,一个服务器一旦启动了那就一个启动就行了,不需要再用它的类创建更多的对象了。另外线程池我也不想过多创建,一会总结线程池优缺点,再来谈一谈为什么要把他改成单例模式。编代码也是有方式的,发展这么多年大神们最后大家的代码都很类似,最后总结出一套模板,

2024-04-20 12:51:24 613

原创 线程池 1-17续

调系统调用也是有成本的。比如申请内存,一次多给你一点,间接减少系统调用次数。单例模式设计线程池涉及的加锁双if问题 饿汉 懒汉。所有的池化技术本质都是以空间换时间。C++类内创建线程原生线程。

2024-04-19 17:50:49 140

原创 配置vscode链接linux

4. 切换到远程资源管理器中 应该可以看到一台电脑,右键在当前窗口链接,输入你的服务器用户密码后电脑变绿说明远程连接成功。3. 选择保存远端host到本地 某位置 等待片刻后。5.一定要登陆上云服务器后再安装各种插件。1.安装 remote SSH。ssh ljh@服务器公网ip。

2024-04-06 15:27:03 291

原创 为什么uint16_t的范围是0~65535?

因为C1n = A1n啊,所以只要是只选出一个的,不管每个位置有几种可能排列还是组合都一样。每一位密码只有两种可能,按照乘法原理你要每一位都选出来才可以,所以是 2^4=16种可能。两个可能选一个出来,应该是C12,至于A12感觉他们在这个问题上是一样的。每一位只有两种可能,每位选出一个 一共有2^16 = 65536个组合。那天我改密码,如果你的密码是例如+ - + -这样的四位密码。也就是全0 ~ 全1 则范围是 0 ~ 65535。也就是0000 0000 0000 0000。

2024-03-05 19:58:55 270

原创 【网络 】

netstat -n(显示数字)au(all udp)p(显示pid信息)查内网ip 和 以太网mac地址。netstat 网络状态。

2024-01-27 13:35:58 115

原创 1-17.同步与互斥

1.正确看待生产消费者模型的高效问题。

2024-01-17 13:15:11 411

原创 死锁 + 条件变量 + 生产消费者模型

线程第一次申请锁成功,继续再次申请,第二次申请就失败了,当前线程抱着锁就被挂起了。现象 : 代码不会继续往后推进了。一把锁有没有可能产生死锁呢?3. 剩余线程申请锁都不成功。其他线程申请都失败阻塞了。所有整个线程全部都卡住了。1.你抱着锁去休眠了。

2023-12-16 13:22:53 564

原创 【加锁 】

1.从逻辑上不对,因为你难道想让一个线程在while循环中,一个线程把票全抢完然后才能到下一个线程抢吗,下一个线程抢都没票了。线程申请锁失败了,线程阻塞等待的本质是线程等待锁资源不就绪,调度器把线程PCB阻塞后去锁的队列里进行等待。此时解锁代码没有被执行,这个线程已经走了,但是锁一直没释放,其他线程会一直阻塞。但是这里还有问题,可能一个线程抢到锁了,在抢票时发现票没了直接break。我们要把对应的资源保护起来,要保证多个线程申请的是同一把锁。没有拿到锁的线程,就必须要在指定的锁上等待。

2023-12-14 13:25:35 444

原创 线程互斥与同步

用户级线程 和 内核级线程 也就是线程实现真的是在OS内部实现,还是应用层或用户层实现。必定每一个人都要有自己独立的栈结构,让自己的调用链不受别人的。用户级执行流(用户级线程) :内核lwp = 1 : 1。新线程在执行流上和主线程是独立的,所以他们形成调用链时。站在线程角度每个线程都有自己独立的栈结构,但并不是说我。用户级线程 + 内核的LWP = Linux线程。干扰,所以每一个线程都要有自己的栈结构。这个栈不仅仅要简单的变量定义,入栈出战。所以主线程当然要有自己的调用链。下面来谈谈线程库中的栈。

2023-12-11 19:03:32 450

原创 线程控制.

因为main函数和指定函数threadRoutine 它在同一块代码被编译时一定使用代码部分不同的地址空间范围,代码区虽然是一整块,但不同函数用的不同的地址空间,注定了这两个线程执行时在代码资源上是分离的。既然他只有轻量级进程的概念的话,注定了linux os不会给我们直接提供线程的系统调用,只会给我们提供轻量级进程的系统调用!线程已经成为调度的基本单位了,每一个线程都属于同一个地址空间中,所有的线程都属于同一个进程。正是因为OS用进程内核数据结构模拟的线程,所以内核中有没有很明确的线程的概念呢?

2023-12-05 12:34:24 419

原创 线程+地址空间4

如果我今天再创建一个“进程” 不再给它创建新的地址空间,新的页表,我只创建pcb,让其指向父进程的地址空间,也指向父进程的页表(我们不管)我们以前创建子进程,父子进程在数据结构上相互独立,需要给子进程开辟新的pcb,地址空间,页表,虽然大部分都是从父进程来的。此时新的子进程就在父进程的地址空间内运行,同时把页表中对应分出来区域的映射给新的子进程就可以了。既然能创建一个,就能创建多个,只创建pcb,把一个进程的地址空间分成若干份分给子进程部分代码。此时线程的执行粒度,要比进程更细,为什么这么说?

2023-12-03 20:22:20 429

原创 信号收尾.

看看sigaction结构体里面,红线是我们不关心的,里面有个sa_handler不就是之前信号捕捉的函数指针类型吗,也就是处理方法,其实也就是修改了handler表里面的方法。输入型参数act结构体里面包含了你要设置新的动作,输出型参数oact是保存老的设置以便你后续恢复。我们发现函数名和形参中结构体名一样都是sigaction,这在c/c++中允许吗?它也是信号捕捉,不仅能处理普通信号还能处理实时信号,但我们不管实时信号。这个结构体红线你都不关心,那直接用memset都清零就可以。

2023-11-30 12:04:26 444

原创 可变参数列表

demo 2:求任意多个数据中的最大值(至少一个),要求不能使用数组因为目前参数个数不确定,那么函数编写的时候,参数个数也无法确定,换句话说,函数也就没法编写不过,C提供了满足该场景的解决方案:可变参数列表。

2023-11-29 12:41:48 795

原创 信号-重谈地址空间3

信号的保存:我可能正在推高地,脑子里面记住我外卖到了,一会再去拿。信号的产生:外卖小哥给我打电话说你外卖到了。信号的处理:我打完了,下楼把外卖拿了。完成了一次信号的生命周期。

2023-11-23 17:33:45 469

原创 SystemV ipc(进程间通信)

如果今天创建了一个共享内存,OS就会为我们创建struct shmid_ds结构,我们就把第一个字段struct ipc_perm shm_perm地址放入到数组当中,消息队列和信号量同理都把第一个字段地址放入数组中(这个道理就像你创建一个都是Int类型的结构体你看看第一个整形的结构体地址和结构体地址一不一样?数组中保存的是ipc_perm的地址,该如何访问共享内存or消息队列 shmid_ds 和msgid_ds中的其他属性呢?,OS中也是用数组来管理的,数组中保存了struct ipc_perm*

2023-11-22 13:02:35 210

原创 共享内存.

因为不能让进程直接malloc,你这样申请了那这块空间就是你的,会破坏了进程的独立性。OS帮助申请内存,通过页表挂接到进程地址空间中,给应用层返回起始虚拟地址。到了共享内存了支持双向通信能读也能写,但是一般都是一个读一个写。上面的操作都是进程直接做的吗?直接由操作系统来做。进程间通信的本质是:先让不同的进程,看到同一份资源!如果要释放共享内存:去关联,释放共享内存。要想通信先看到同一个份资源,则。3、共享内存的特性,扩展代码。我们要把这句话奉若圭臬一般。

2023-11-21 16:00:48 107

原创 打开文件 和 文件系统的文件产生关联

2、如果4KB文件你只要100字节,你能保证你下一次不用这文件上下文的其他数据吗?反正拿100字节还是4KB效率差不多,因为估摸着你后面的字节大概率也要用。物理内存和磁盘交互的单位是4KB,磁盘中未被打开的文件数据块也是4KB,所以磁盘中页帧也是4KB,内存中叫页框。把数据交换的物理内存也要花4KB?1、和磁盘交互比较慢,一共4KB每次要1KB的效率不如一气直接4KB,因为磁盘只需要定位一次。我这个文件可能没有4KB,就一个字节,但不好意思加载4KB。我这个文件4KB,想修改1字节,也得加载4KB。

2023-11-16 20:24:02 154

原创 进程间通信

进程代表的就是用户,一般而言“资源”从创建,使用,释放–OS不允许用户直接访问内部的资源,所以都是调用–系统调用接口!e.基于文件级别的通信方式–管道(既不属于system V也不属于posix)一般操作系统,会有一个独立的通信模块—隶属于文件系统—IPC通信模块。这个进程独有,破坏进程独立性。d.我们进程访问这个空间,进行通信,本质就是访问操作系统!a.进程间通信的本质:必须让不同的进程看到同一份"资源"从底层设计,从接口设计,都要由操作系统独立设计。假设一个进程提供,这个资源属于谁?

2023-11-16 17:28:35 131

原创 动静态库-进程地址空间的第二讲

gcc去默认路径/usr/include里面去找。但是mymath.h根本不在这里面,所以就报错了。

2023-11-14 14:22:27 119

原创 文件系统.

如果一个文件没有被打开呢?终极目标: inode 和 软硬连接。3、获取的问题(属性 +文件内容)之前谈论的是一个被打开的文件!1、认识硬件 --- 磁盘。2、对硬件进行抽象理解。文件系统 :Ext2。

2023-11-08 16:04:28 130

原创 用户缓冲区概念

先看现象,printf / fprintf / fwrite 一定封装了write , 但是执行代码看到大家都是去掉\n 和close(1),库函数无法打印,write可以。如果执行这两句代码你会发现程序会等待一会最后结束时打印出来,这是因为缓冲区的存在,printf把。你不是说的库函数封装了write,怎么打印不出来?

2023-11-07 14:31:22 110

原创 重定向-缓冲区

尝试用这个代码 关闭0,1,2文件描述符,看看有什么现象?关闭哪个,你打开的文件fd应该就是哪个。从0下标开始,寻找最小的没有没使用的数组位置,它的下标就是新文件的文件描述符。文件描述符对应的分配规则是什么?

2023-11-03 18:31:26 144

原创 文件fd.

-----0S要不要管理这些被打开的文件呢?—先描述,在组织 — 在内核中,一个被打开的文件都必须有自己的文件打开对象,包含文件的很多属性。没有被打开的文件非常多。一定要先把属性加载到内存,内容要不要被加载取决于要不要对文件做修改,理想情况是都被加载。3.打开的文件: 谁打开?----本质是研究进程和文件的关系!根据冯诺依曼原理,文件被打开,必须先被加载到内存!一个进程可以打开多个文件,则进程与打开文件数量关系为。2.文件分为打开的文件 和 没打开的文件。则操作系统内部,一定存在大量的被打开的文件!

2023-11-02 12:12:58 141

原创 进程替换..

1、我们用自己的进程封装了内置指令ls,并且代码中execl 后 printf 的after并没有打印出来。1、单进程版 – 最简单的先看看程序替换。3、多进程版 – 验证各种程序替换借口。2、谈进程替换的原理。5、自定义shell。

2023-10-29 20:24:57 120

原创 进程等待..

我们要通过进程等待,获得子进程的退出情况—知道我布置给子进程的任务,它完成的怎么样了—要么关心,也可能不关心—可选的。通过系统调用wait/waitpid,来进行对子进程进行状态检测与回收的功能!僵尸进程无法被杀死,需要通过进程等待来杀掉它,进而解决内存泄漏问题—必须解决的。代码:父进程通过调用wait/waitpid进行僵尸进程的回收问题!wait返回值为等待成功的子进程pid,如果小于0说明等待失败了。进程,现在有多个子进程需要通过循环+wait。

2023-10-26 17:29:38 163

原创 地址空间收尾-进程控制

父进程的环境变量也是由bash继承下来的,必定有页表帮助我们从虚拟到物理的映射,创建子进程的页表时也会将对应父进程的地址空间中环境变量的对应映射建立好,所以即便不传对应的env参数,子进程也能获得环境变量信息。我们的PCB对象数据结构本身和进程地址空间也要在物理内存中放的哦,操作系统内核中的数据结构一定要映射到地址空间内核空间中。子进程为什么能继承父进程的环境变量呢?通过打印地址实验可以发现,进程的环境变量在栈区之上。0G-2G是给用户使用的。3G-4G是给操作系统的。

2023-10-25 13:33:11 95

原创 多态2........

那要是两个套在一起呢?那也是各是各的,你解决你的数据冗余二义性,我解决我的多态问题。多态和虚继承都在内存中产生了额外的东西,但是他们两个没有一点关系!虚函数的virtual和虚继承腰部的virtual没有一点关系!

2023-10-23 15:06:07 132

原创 进程地址空间

内存寻址的最基本单位是字节。

2023-10-19 16:32:49 128

原创 C++11 -

这是list模拟实现迭代器的==和!=重载时,while( it!= lt.end() ) 时 lt.end()传值返回产生了临时空间。3、无论是强制类型转换还是隐式类型转换,都会开辟临时空间,因为不能修改原本变量的值,所以形参要加上const,因为临时空间具有常性。把aa拷贝给临时空间,如果是很大的对象并且进行深拷贝,消耗会很大。临时空间具有常性,什么时候会产生临时空间呢?eax和xmm0到底算不算临时空间呢?2、表达式的返回值是一个临时变量。

2023-09-24 19:58:03 82

原创 RBTree-红黑树

最长路径 只能往黑的里面塞红的,塞黑的就会与性质4冲突,则最长路径就是一黑一红相间的路径,还只能塞一个红,两个红会违反性质3.控制住这几条性质,我们就控制住了红黑树最长路径不超过最短路径的2倍,达到近似平衡。按这颗树来举例估算AVL树和红黑树之间的性能差距,为什么说红黑树反而更优呢?但你要控制高度超2/3很难去控制,红黑树通过颜色控制而不是高度差。红黑树认为AVL树太严格控制平衡了,旋转的过程是要付出代价的。红黑树能做到最长路径不超过最短路径的2倍,达到近似平衡。11条路径,根到空节点算一条路径。

2023-09-15 11:31:49 62

原创 AVLTree-平衡二叉树

AVL树是解决二叉搜索树极端情况下的单支树问题,具有以下性质即可做到增删改查都是log(N).AVL树首先得是一颗二叉搜索树:1.它的左右子树都是AVL树2.左右子树高度之差(简称平衡因子)的绝对值不超过1(-1/0/1)平衡因子 = 右子树的高度–左子树的高度。

2023-09-15 11:28:53 69

原创 Stack-queue

stack和queue使用了container适配器,因为它觉得我不需要自己实现一个容器来实现而直接用现成的stack和queue并没有迭代器,因为本来就是后进先出,先进先出,怎么可能让迭代器随便访问呢?适配器讲的全一点是容器适配器,对容器进行封装改造控制适配出栈和队列并且stl中的栈采用这种适配器,可以做到链式栈和数组栈秒切换,那这么神奇怎么做到的?模板!

2023-09-04 19:47:47 107

原创 Linux-环境变量

环境变量是系统提供的一组name=value形式的变量,不同的环境变量有不同的用户,通常具有全局属性。

2023-08-23 20:24:01 477 1

原创 linux-进程

一个计算机能够正常运行,就必须遵守冯诺依曼体系数据流向为什么不把Cpu直接怼到输入设备和输出设备中间,非要加个内存呢?答:因为根据木桶原理,如果这样设计,导致最终效率会由外设的效率为主,而外设非常慢。并且Cpu 的存储空间非常小,就注定了外设会拖慢cpu那么按照冯诺依曼体系结构,这种依然串行的结构,输入设备把数据拷到内存,内存在拷到cpu,输出同理,好像也没快多少?

2023-08-19 13:43:12 1507

原创 map-set使用

map和set一样不允许修改key,但是需要修改value,所以不敢像set一样全用const迭代器,他是利用pair里面的const key修饰。你一开始得用查找find看在不在map里,如果不在那就插入第一个水果,如果在,那就要让计数++。现在有方括号,你就可以利用Insert的查找,它的V()就是0,第一次插入不就对0++变成1了。2、key不在树里面,返回pair插入需要插入的是一个pair , pair 是什么?那我该如何创建一个pair?

2023-08-10 15:09:56 73

原创 模板进阶-coming soon

/

2023-08-09 23:07:44 114

空空如也

空空如也

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

TA关注的人

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