自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 win11-CapsWriter-Offline

权重扔进models。

2024-04-10 11:01:35 329

原创 gradle的配置_自用

# /etc/profile中环境变量PATH=$PATH:/opt/gradle/gradle-7.4/binexport PATH#set java environmentJAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdkJRE_HOME=/${JAVA_HOME}/jrePATH=$PATH:$JAVA_HOME/binCLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarexport JA.

2022-02-22 23:53:15 353

原创 netsh失败的使用_自用

前置:netsh interface portproxy add v4tov4 listenport=* listenaddress=220.181.38.148 connectport=* connectaddress=119.3.70.188且打开了 IP helper服务,220.181是百度,119.3.70是b站访问本地的80端口和6666端口,都不会跳转到百度页面netsh是对报文进行转换的:原来报文 -> 目标报文原侦听地址是原报文的目的地址吧, 而不是原来报文的

2022-01-09 14:06:22 1412

原创 异步IO实现和应用场景

前言学习自用,还有很多不足的地方异步IO和同步IO当网卡有了数据,DMA会把数据拷贝到内核缓冲区(内核缓冲区的哪里呢);而从内核缓冲区拷贝到用户态需要用户调用read,同步地进行异步则是注册个读完成事件,等其他用户态线程/内核进程拷贝到用户态后再提醒aio最核心的需求就是解偶submit和wait for completion, 简单地说就是在submit的时候不要阻塞, 这样用户在submit之后可以做其它事情或者继续submit新的io, 从而获得更高的cpu利用率和磁盘带宽.异

2020-09-21 10:48:52 1574

原创 条件变量为什么和mutex一起用

结论:mutex是用来保证A的23句是原子性的,如果原子性被破坏就可能会失去丢失唤醒的信号这两个线程的所有运行情况,A先和B先A先,A阻塞在con_wait里,并释放锁,B拿到锁后修改,并signal,A被唤醒后加锁解锁并继续运行 B先运行,拿到锁后设为true,发信号,后A运行,拿到锁后直接while不成立继续如果没有mutex:即下图左边的代码,右边是一种运行可能,这种情况下会con.wait一直阻塞,B的signal丢失为什么要用while一个是为了防止spurious w..

2020-08-19 11:56:56 579

原创 cpp单例模式的实现

单例模式的意义保证全局只会创建一个对象,比如 日志模块全局只有一个,windows的任务管理器等,这样可以避免频繁的创建销毁对象,还可以避免对共享资源的多重占用,具体例子和好处坏处看参考资料[9],不赘述几种考虑几个要考虑的问题:懒加载;;线程安全生存周期的考虑;;反序列化;;反射单例;;克隆单例首先是一个唯一性,保证全部成员只能访问到一个共同的对象为了防止对象被创建多次,要把构造函数设为private,以防止被他人调用重复建立,而自己单独实现一个接口用来获取实例(可以把构造函数当作这个

2020-08-17 12:52:04 1631

原创 大数据问题

top k问题即在很多数据的情况下选出前k大的数据,数据量可上亿要分情况讨论,如果是堆排序,时间复杂度是O(lgn)级别,,比较次数和交换次数相同,平均为logn/2,可以采用插入排序的办法,只维护一个k的数组,按降序排列,只用在中间插入并删掉超过k的部分,这个时间复杂度为O(n),平均比较次数为O(n/2),移动次数是O(n/2),如果可以做成链表结构,则还能省去移动的开销,而只用在比较完成后修改指针大数据排序如果是上亿的数据,常规的办法:加载到内存并用经典算法是行不通的,内存没办

2020-08-17 10:34:38 270

原创 智能指针的实现

前言学习自用,有错麻烦提一下正文智能指针,即把指针封装为类,对外要保留指针原本的功能的接口比如解引用等,还要利用引用计数和RAII来控制对象的生命周期,之所以不手动控制一个是为了编码的方便,能在作用域到期后自动析构,另一个就是为了异常安全性,如果发生了异常,可以自动调用析构函数来释放内存引用计数控制生命周期需要根据引用计数,当引用计数为0时说明可以销毁,引用计数是针对一个对象来说的.不过计数是在智能指针中来实现的一个要注意的点是,引用计数要是多个指向同一对象的智能指针共享的,比如

2020-08-12 11:19:38 344

原创 cpp的static的实现

前言学习自用,有错麻烦提一下正文static成员变量static修饰的值会在静态区分配空间,是在编译时期就分配了空间,(那么在没运行时就占用了可执行文件的大小吧),可以把static与全局变量作比较,实际上的实现也是像全局变量一样额外放一个地方,全局变量放在全局区,静态变量放在静态区局区,不同之处就在于static的类成员是指定只能类来访问的,相当于static成员变量做了访问限制的全局变量static成员函数不同于static的成员变量,static修饰的成员函数在代码区分配内

2020-08-11 11:36:05 760

原创 cpp11的几种cast浅析

const_cast提供const与非const的转换,且只能用在引用和指针上,如const string s = "Inception"; string& p = const_cast <string&> (s); string* ps = const_cast <string*> (&s);注意const转非const,只是为了名义上的const转换,比如要函数传参把const对象传进非const属性参数里,但是实际上转换完的也是不可以修

2020-08-10 10:35:15 664

原创 linux的IO

前言学习自用,文末的参考资料都是好文,这篇还得慢慢补充正文linux IO,首先应该看一下linux IO涉及到的层次图,对于read系统调用在内核的处理,如上图所述(TODO),经过了VFS、具体文件系统,如ext2、页高速缓冲存层、通用块层、IO调度层、设备驱动层、和设备层我们可以简单的把上面归类为用户层,内核层,设备层从用户空间到内核空间再到设备层,各有一个缓存,C库的clib buffer,内核的page cache和设备层的disk cache加这些层是为了一个缓冲,用

2020-08-03 13:56:29 128

原创 进程的装载过程

编译过程预处理宏展开,略编译词法分析,语法分析,语义分析,中间代码生成,目标代码生成这一步是将中间代码编程汇编代码,这个过程中会把符号换成地址,如果是外部的符号,则留下符号作为占位符,等以后再链接修改汇编把汇编码转为机器指令静态链接有个重定位关系启动过程整个装载的过程首先操作系统会读取可执行文件的头部,检查文件的合法性,然后从头部中的“Program Header”(这个program header是什么)中读取每个“Segment”的虚拟地址、文件地址和

2020-08-03 10:41:30 326

原创 std::enable_shared_from_this 有什么意义

假如有一个stock和stockFactory类,代表股票和股票池,stockFactory里输入股票代码查询是否有stock,有则返回,没则创建并返回stock,这里用一个std::map来建立映射;而股票如果用完了要自己析构,要顺便把stockFactory里map的内容也析构掉;因为Stock采用shared_ptr来管理的,要让Stock析构的时候顺便调用stockFactory::delete(Stock),这样要在Stock的析构函数里调用,这样代码难以实现,还有另一种办法,设置shar

2020-08-02 16:58:50 341

原创 std::any的实现

前言学习自用,帮助理解,有错麻烦提一下,代码没跑过,想着知道大概思想就好..问题 为什么不用类型推断,类型推断又是什么TODO 类型擦除怎么实现的,用类的继承来实现的,为什么类的继承可以实现? 基类是不含模板参数的,派生类中才有模板参数,这个模板参数类型正是赋值的类型,在赋值时,将创建的派生类对象赋值给基类指针,基类的派生类中携带了数据类型,基类只是原始数据的一个占位符,通过多态,它擦除了原始数据类型,因此,任何数据类型都可以赋值给他,从而实现了能存放所有类型数据的目标 正文

2020-08-01 22:27:55 1592 1

原创 linux下进程和线程

前言学习自用,这篇还比较没头绪,标题和内容很难对上问题子进程能继承父进程的什么东西?不能继承父进程的什么东西?fork以后会生成一个task_struct,还会修改页表吧,每个线程还都有自己的thread_info,在栈的底部(应该是线程栈吧),其中有一个成员指针指向task_struct信号处理函数不能继承,毕竟在子进程里对应的处理函数的地址是无效的(来自APUE),未决信号集也是不能继承的,而task_struct存有被阻塞的信号集线程独立的资源linux内核并没有.

2020-07-30 16:52:32 178

原创 排序算法剖析

前言学习自用,排序算法再回顾,这里就不放代码了正文冒泡排序冒泡是从前往后相邻比较,每一次比较会把当前最大值传到后面,传到最后面以后就不用管最后面的了因为他是只比较相邻的而且是从前往后的,所以适合用在链表的排序,(因为单向链表从前往后走,且相邻之间很容易用一个next指针比较)从前往后这个特性应该代码的局部性也比较好吧?时间复杂度是O(n^2),看代码可以说是两个循环所以是O(n^2),具体推导​TODO​可以看出冒泡排序除了相邻比较以外,还会用到很多次相邻的交换没有用到任

2020-07-29 19:38:03 108

原创 mysql的buffer和log

前言现在写的还很乱,等以后再整理下,学习自用log部分log分为redo log, bin log, undo log三部分redo log数据库持久性需要把修改的内容写进磁盘中,如果这些内容在磁盘中是散布在各个位置,寻道时间则会很长,于是采用一个redo log,把这些内容先写入redo log的范围中,这样可以说就把随机写变为一个顺序写,(TODO后面会把这些redo log删掉再写入数据库吗)bin log不太清楚(binlog是什么,干什么用的,好像和主从复制有关,为什么

2020-07-28 10:40:41 502 1

原创 MyISAM和InnoDB的区别

前言学习自用,有错麻烦提一下正文InnoDB是MySQL在...版本开始的默认引擎,较大的区别是InnoDB支持事务,而MyISAM不支持事务(是没有事务的概念?这就是他只有表锁的原因?),InnoDB支持意向锁,行锁,间隙锁等,而MyISAM只支持表锁对于 他们的索引,InnoDB使用的是聚簇索引,意思是它的索引数据的物理顺序和索引列值顺序是一样的,同时聚簇索引的整列数据是放在B树叶子节点的,相比起来MyISAM的只在B树叶子节点存放数据列的指针,所以他们InnoDB的索引和数据列

2020-07-27 23:44:11 99

原创 linux下的同步机制的实现

前言学习自用,有错麻烦提一下,,现在还没写完,,以后再慢慢补充同步机制先大概列出这几种spinlock• 用在哪:比如说memory descritpor的保护,许多内核数据结构都用这个和semaphore;比如中断处理函数只能用这个不调度的spinlock,还有TODO会用到• 实现原理:关闭中断吗?原子操作• 实现原理:一般是特定的指令,不支持的CPU则用关闭中断来实现• 有atomic_32和(增加运算是啥来着)• 使用注意:int更快吧,大小也是个问题

2020-07-25 14:38:48 298

原创 SQL语句是怎么执行的

参考资料https://www.cnblogs.com/wupeixuan/p/11626024.html

2020-07-24 10:00:39 496

原创 Mysql的索引

索引索引的数据结构大多是B+树的,不是键值对结构,在非叶子节点存索引列的值,而在叶子节点存要找的数据,B树是key-value结构,可以在树中直接找到对应的值,这样更适合随机读取而B+树是B树的改进,不使用key-value结构,而是非叶子节点只存索引列,而叶子节点顺序存储数据,并把叶子节点用指针串联起来,这样非叶子节点能存的索引值更多,且因为是顺序的更适合顺序读取,比如范围查询,可以看出它相比B树在随机读取方面可能会差点,因为B+树只有到叶子节点才能命中数据,而nosql的mongoDB就是用

2020-07-23 17:03:36 161

原创 TCP握手挥手重点理解

为了保证TCP的可靠传输,TCP分别提出了8中机制: 1.确认应答机制 2.超时重传机制--超时定时器 3.滑动窗口机制 4.快速重传机制 5.流量控制机制 6.拥塞控制机制 7.延时应答机制--延时定时器 8.捎带应答机制 MSS:maximum segment size,TCP是segment, MTU:maximum transmission unit,针对数据链路层的拥塞避免算法https://www.nowcoder.com/discuss/453178T...

2020-07-23 15:25:16 165

原创 SQL语句查询优化

SQL优化(xmind里有,不熟练)如何写语句使用慢查询(怎么开启),对慢语句执行explain 尽量不要用not in这样的排除语句 索引列不要放在函数或者表达式中 尽量不要用NULL来筛选索引设计:索引字段,不要加到修改多的字段上,尽量不要加到重复过多的上面 对于group by,order by和where字段后面的条件可以考虑加索引 对于多列索引,建立联合索引,这样(a,b,c)相当于(a),(a,b)等,,其中顺序要遵循最左匹配原则 join on用到会更高效(?) 尽

2020-07-22 18:12:06 181

原创 https总结

总结对比于http,https加入了加密,认证,完整性校验是http+SSL,为了双方加密通话,用了对称加密,对称加密需要密钥交换,于是非对称加密;而为了防止中间人攻击,实际上就是为了识别公钥是来自于对方的,引入了证书体制证书体制,证书里有数字签名来保证不被篡改对于消息的完整性,采用哈希检查(摘要算法?TODO)Q:非对称加密已经很安全了,为什么还要用混合加密 A:非对称加密的速度慢,平时需要用对称加密通信SSL握手过程建立443端口连接 客户端发送随机数1和支持的加密方法 服.

2020-07-22 14:52:02 158

原创 STL重要知识

介绍下STL:STL是一个standard templeate library封装了常用的数据结构和算法,用了泛型来包装方便使用,分为六大组件,我们直接使用的是容器,迭代器和算法,迭代器分为随即迭代器,双向迭代器两种,随机迭代器会面临一个失效的问题,在使用他们的时候要一些情况要接收返回值来防止迭代器失效,容器常用的vector,它的allocator很有意思,是包括两层分配器,第二级用一个内存池来减少内存碎片,其他常用的map用红黑树来实现,常用的算法有sort.内部使用的是一个内省算法,就是多种算

2020-07-18 22:23:47 449

原创 muduo为什么不直接用MutexLockGuard

前言这篇是未完成的垃圾,别浪费时间看了问题为什么有些项目直接用的condition用的是unique_lock 为什么不直接用用muteLock正文UnassignGuard直接替换成MutexLockGuard,会导致死锁 不直接去用mutex,在上锁放锁的同时要维护pthread的holder变量参考资料为什么不直接用mutex_lock mutexLock和unique_lock区别...

2020-07-12 15:52:35 157

原创 深度探索cpp对象模型的好博客

http%3A//www.roading.org/archives/

2020-07-06 13:18:05 104

原创 数据库事务和范式理解

前言学习自用..网上大把资料,主要为了贴上自己理解.老实说标题和内容真难对的上..以后再修改下事务的ACID事务的atomicity,事务的每项操作不会存在中间状态,做了就成功,失败了就相当于没做,(为什么要有这个概念的,为了防止并发让事务存在中间态吗,有什么数据库的原子性的反例吗)consistency一致性数据库的状态要是一致的,(Q:这里说的状态一致是什么呢),A:数据库的状态的一致指的是完整性约束,完整性约束说的是数据库不能有不规范的数据,(TODO,这里的完整性约束),很多

2020-07-06 13:12:50 1164

原创 InnoDB的隔离级别实现

并发问题,丢失修改,不可重复读,幻读,脏读不可重复读 有个事务T,T读了两次数据,在两次中间有人update/delete了数据,导致T两次读的结果不一致 幻读 (在高性能mysql里把这个归为不可重复读)同上读了两次,中间有人insert了一条数据,导致两次结果不一致 脏读 即读到其他事务未提交的数据 丢失修改 两个事务先后读改再提交,导致最终结果错误(?)事务隔离级别有四种,RU,RC,RR和SI三段锁协议一段锁:在改前加X锁,T完释放,可解决丢失修改(不可以啊?)二

2020-07-05 15:17:34 244

原创 linux进程空间的内存管理

前言写的还很乱,没把全部知识点串起来,以后再来吧,另外感觉没图读起来确实不通顺..学习自用,有错麻烦提一下进程空间的分配进程空间的分配要与内核空间的分配区别开;一个进程会有相应的地址空间,这里说的进程要与磁盘上的程序(可执行文件)给区分开来,首先讲一下进程的空间结构:进程的空间结构编程语言里常说的内存五区 全局区 静态区 代码区 堆栈 而实际中进程的分为以下几段(放图TODO) data section,用来存可执行文件的已初始化全局变量,如

2020-07-01 21:00:08 407

原创 linux的VFS

前言学习自用,有错麻烦提一下正文有不同的文件系统,比如ex2,ext3,FAT,NTFS,而对于程序来说,这些文件系统的使用都是差不多的,有着相同的API,平时几乎感受不到差别,而这几个文件系统的implementation实际是千差万别的,linux是通过一层抽象来实现的而这层抽象实际上是VFS, virtual file system或者virtual filesystem switchVFS层有四个重要的数据结构,Inode,superblock,file和dentry;Inode

2020-06-27 17:33:39 195

原创 linux内核的内存管理

内核内存管理总结内核的内存分配不同于用户空间的内存分配,,balabala内核里内存的分配主要有这么几种,首先是按页来请求内存,用alloc_pages()和它的几个兄弟函数可以实现,按页分配,即直接请求返回的是一个或者多个页框;而对于页框的管理,内存中不同页会被分为不同zones,区分标准是:比如DMA能直接操作的区域,HIGH memory区域(后面再讲),每个不同的区域分别让buddy system algorithm来接管分配,buddy system algorithm,即把页分为不同大小

2020-06-26 21:57:47 231

原创 linux的high memory

线性地址这里掠过分段和分页的概念线性地址概念:线性地址是分段变换后的地址以下是啰嗦把版本的,CPU在保护模式下(保护模式是什么?),“段基址+段内偏移地址”叫做线性地址(是用分段来管理虚实地址转换吧,一直疑问分段在linux中应用),如果没开分页的话,线性地址则是物理地址;而如果开了分页,线性地址=虚拟地址,high memory这里以32位来讲,有high memory原因是CPU寻址位数不够,导致寻址空间不足,,,而64位系统下不会有high memory以linux为例子,

2020-06-24 17:26:45 237

原创 cpp的new实现

前言学习自用,目前这篇文章理解还挺初级的,等以后再改善把文末的参考资料都是好文,[1]为malloc(0),面试常问,[2]为C++placement new相关正文placement new作用:在指定内存里进行对象构造placement new应用场景: cpp里new的实现 如果有不断相同数据结构创建并被销毁,可以用placement new来代替new,这样操作系统就不会每次去找另外的空间而造成内存碎片了 空间申请有operator new和malloc两种操

2020-06-24 11:21:38 2167

原创 ET和LT的原理和区别

前言学习自用,有错麻烦提出,感谢基本知识ET和LT是IO复用的两种模式,ET早于LT出现(依据TODO)对于几种IO复用,select和poll只支持LT(?TODO)level triggered 和edge trigger,起源于电频的激发,TODOET是一次事件只会触发一次,如一次客户吨发来消息,fd可读,epoll_wait返回.等下次再调用epoll_wait则不会返回了LT是一次事件会触发多次,如一次客户端发消息,fd可读,epoll_wait返回,不处理这个fd,再

2020-06-18 23:57:57 11483 1

原创 半同步/半异步模式,半同步半反应堆reactor模式

前言看游双的书并理解,个人学习,有错麻烦提一下,感谢事件处理模式和并发模型的区别这篇要介绍的事件处理模式有reactor和proactor;而要介绍的并发模型有半同步/反应堆和半同步半异步事件处理模式,指的是...TODO事件处理模式事件处理模式,本文介绍的有两种,是reactor(反应堆)和proactor模式,(还有没有其他的呢?)同步IO模型用于实现reactor模式,异步IO模型用于实现proactor模式异步IO比如有POSIX的 AIO和linux下原生的liba

2020-06-18 21:25:29 3332 4

原创 网络编程的日志系统

前言略为什么用日志系统略,参照参考资料[1]日志系统的设计日志的格式,即每条日志的内容,见参考资料[1]和[2] 日志的级别,见参考资料[1] 日志打印位置:一般是文件,最好不要往网络中打印,这个文章只谈文件 日志作用域:全局,程序中每个位置应该都能用到 日志类的整体设计,最简单版见参考资料[1] 日志的使用:日志是被业务线程使用的,即业务线程需要调用写入日志高性能日志系统的要求每个线程,及每个控制流都应该能使用到日志系统,有以下两个选择问题1.同步写和异步写,同步即

2020-06-17 14:59:25 425

原创 服务器并发模型/方案

引言引言TODO各种模式代码TODO注意,这篇文章的用词,listening fd和connection fd对于每个模式会分析优缺点最简单的模式:iterative模式可称为iterative模式,循环模式;如下图,可以看出是一个socket编程的几个经典步骤,socket,bind,listen->accept->read->处理数据->send->close;同时也可以看出,这个只能适合短连接,因为每次只能处理一个connection fd,必须c

2020-06-14 17:57:05 632

原创 定时器的几种实现

前言此篇文章为自己总结,若有错麻烦指出,感谢引言服务器编程中一块是定时器,影响着服务器性能定时器一个作用是用于定时检测客户端连接,并踢掉非活动连接;定时器一般会把定时事件封装成定时器,并进行组织以方便管理计时在linux中,一般由<unistd.h>文件下的alarm函数和setitimer来设置定时器,到时间则发出SIGALARM,并调用指定的到期信号处理函数,signal(SIGALRM, handler);函数来设置到期事件处理函数,而这个到期事件处理函数在

2020-06-13 14:35:08 1141

原创 cpp笔试的输入输出

笔试的时候碰到奇奇怪怪的输入标准,发现自己连输入都没掌握..死在这个上..连续输入有限个数字,中间空格隔开,如2 5 4std::cin>>a>>b;一行连续输入无线个数字,中间空格隔开,如2 4 4 2 4std::cin>>num; chara= getchar() if(a=='\n')do_next();解析std::cin>>num中,>>会吸收空格或者换行符'\n',而getchar()...

2020-05-26 14:18:44 287

空空如也

空空如也

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

TA关注的人

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