- 博客(60)
- 收藏
- 关注
原创 Binder机制总结笔记
binder驱动中管理着一个全局的binderprocs链表,这个链表中的每一个binderproc结构都对应用户空间中的一个binder进程,每一个binder进程里面只有一个IProcessState对象,这是单例模式保证的。获取服务类似于注册服务的相反的过程。每一个binder的server进程注册之后,内部都会有一个binder线程池,先注册一个binder的线程,之后server进程也可以注册新的线程,或者binder驱动检测到当前没有空闲的线程的时候,那就会在线程池中新注册一个线程。
2023-10-28 10:17:52
378
原创 Command集合
git merge –no-ff -m “注释” 分支名 不使用快进模式合并分支。git merge 分支名 合并分支名的提交到当前分支上。git reflog 查看提交的版本号。常用命令:nginx -s start。通过端口号查看对应进程是否启动。查看php7.0-fpm状态。在开机时启用nginx服务。在开机时禁用nginx服务。显示nginx服务的状态。启动php7.0-fpm。重启php7.0-fpm。查看mysql的状态。redis 设置密码。
2023-10-28 09:57:30
270
原创 OpenGLSurfaceView的使用经验
回调surfaceCreate的时候会进行初始化操作,创建顶点的着色器来告诉openGL顶点的数据和面的着色器来传入颜色信息,然后调用ShaderHelper来编译着色器并连接到program并验证,然后会获取着色器程序内一些需要用到去修改绘制内容的变量id,比如顶点位置,颜色之类的;再设置render的模式,因为carlife的实时性要求比较高,因此就使用RENDERMODE_CONTINUOUSLY不断的刷新,还有一种是RENDERMODE_WHEN_DIRTY,是调用render的时候再刷新。
2023-10-28 09:55:34
296
原创 架构整洁之道摘录
软件架构规则和其他变量完全⽆关。软件设计的终极⽬标是⽤最⼩的成本来满⾜构建和维护系统的需求。程序设计重要的是软件架构的灵活性⽽不是先实现功能。软件系统的第⼀价值体系是系统⾏为,第⼆价值体系是系统架构。
2023-10-28 09:51:54
702
原创 JNI 概述
JNI全称 Java Native Interface,Java本地化接口。主要的作用是为Java层和C/C++ Native层的接口调用提供桥梁。在Android系统中,NDK将JNI进行了封装,用于在Java层调用native层复杂的算法以及音视频解码等。
2023-10-15 09:20:43
147
原创 C++面试难点系列-lamda表达式
lamda表达式是C++11中使用最频繁的特性之一。主要是其比较灵活易用。lamda表达式主要有以下特点:1、声明式的编程风格,匿名定义目标函数和对象,不需要再重新写一个函数;2、避免代码膨胀和分散;3、在需要的时间和地点实现功能闭包,程序更灵活。
2023-06-11 12:17:42
916
原创 C++面试难点系列-智能指针
智能指针作为C++管理内存的重要工具,在现代C++中被广泛使用。在智能指针未出现之前,指针的管理一直存在许多的问题,很容易出现野指针、指针悬挂,踩内存等问题。野指针指的是指针指向的内存被释放,但是指针未置空,导致代码再次调用的时候指向一块非法内存。指针悬挂指的是多个指针指向一块内存,当其中一个指针将内存释放之后,其他指针不知道资源被释放,就会处于悬挂的状态。上面两种问题都有可能造成踩内存的情况,当一块内存被释放之后,可能会被其他分配的内存占用,这时候原来的指针调用的时候还会误以为这是之前的内存而导致问题。
2023-06-04 21:46:00
741
原创 C++面试难点系列-左右值/const引用
做一个简单的开篇,这部分主要介绍的是C++面试中经常会遇到的难点,左右值引用和const引用。后续还会讲一些其他的C++需要掌握,但是又比较难讲明白的知识点,帮助自己以及大家巩固这些理论基础知识。
2023-05-28 21:07:36
1705
原创 Shell脚本笔记(5)- 本的条件语句
脚本的条件语句条件测试语句的格式格式test <条件>[ <条件> ]一般情况下通用[[ <条件> ]][]升级版,支持正则表达式(( <条件> ))不熟悉的话直接man test查看文件测试语句man test大概有以下这些针对于文件的操作 FILE1 -ef FILE2 FILE1 and FILE2 have the same device and i
2022-04-22 08:00:00
166
原创 Shell脚本笔记(4)- 运算符
算术运算符运算不支持浮点数letlet a=1+2n1=1n2=2let n3=n1+n2exprexpr 后带的表达式需要加空格expr使用运算时,*需要加上转义符*expr 1 + 1expr 1 \* 1bc需要计算浮点数的时候使用bcecho 1+5 |bcecho 9/6 |bc -l (输出支持浮点数)awk支持浮点数多个运算之间加上逗号隔开awk 'BEGIN{print 1/3,2**10}'案例实现简单的计算器,输入两个参数,然后输
2022-04-17 15:08:24
780
原创 Shell脚本笔记(3)- 变量子串
变量子串格式:${变量}主要的作用:变量子串的效率要比相应的命令执行的效率高man bash 参考 parameter| 内容 parameter 变量 | 含义 || 基本 | — || ${para} | 返回变量的内容 || ${#para} | 返回变量para的长度 || 按照范围cut截取 | || ${para:offset} | 在para中。从位置offset之后开始截取字符串 || 删除 | || ${para#word} | 从para开头删除最短匹配wo
2022-04-17 14:53:18
1345
原创 Shell脚本笔记(2)-特殊变量
特殊变量应用场景提高书写脚本以及脚本执行效率可以更加简单方便的判断服务状态,文件状态以及进程特殊重要变量-位置符号含义应用$0脚本的名字脚本执行错误,给出错误提示或帮助$n(n数字)脚本的第几个参数命令行中参数传递给脚本,在脚本中使用$#脚本参数的个数,一共几个参数脚本开头,判断参数是否正确$*取出所有的参数,加上"":相当于一个整体一个参数循环或者数组$@取出所有的参数,加上"":每个参数独立循环或者数组$0一般用在
2022-04-17 14:51:57
741
原创 C++特性-lambda表达式
lambda表达式基础概念lambda表达式是c++11新增的一种匿名函数定义的方式,主要的形式是:[capture](para)specifies->returntype{body}capturecapture是捕获的外部变量列表,使用逗号分隔,外部变量可以通过传值或者引用。lambda表达式的body和这些外部变量组成闭包,外部变量则成为了这个闭包的成员变量。比如下面这个lambda表达式经过编译器展开之后就会变成如下形式:int sum = 0;std::vector<in
2022-04-16 15:37:22
910
原创 Shell脚本笔记(1)-脚本变量
shell脚本执行的方式 1. sh/bash执行 bash test.sh 2. 脚本上加上执行权限 +x ./test.sh 3. source 或者 . 这两种方法也可以用在使得环境变量生效shell脚本变量 变量命名时需要注意点:不以数字开头,推荐使用驼峰命名或者是单词之间加_ 变量的分类:环境变量、局部变量、特殊变量:匹配脚本参数 服务状态 特殊替换 环境变量 KaTeX parse error: Expected 'EOF', got '#' at position
2022-04-13 21:33:39
238
原创 C++性能优化:系统体系结构相关性
前言这一章主要的内容和C++编程可能是没有什么关系,主要是硬件的一些问题。内存层次对于性能的讨论最终都会落在内存以及使用内存上面。算法的复杂性主要取决于使用的内存的大小和类型,我们现在所面临的问题就是计算很快速但是访问很慢。在一般的计算机内存层次中有五个层级:寄存器、L1(芯片内缓存)、L2(芯片外缓存)、主存(以各种变体出现的随机访问器:DRAM、SDRAM、RAMBUS、SyncLink等)和磁盘存储器。现在大多数的硬盘都是两个内存组成,一个小而快、一个大而慢。内存访问的趋势是依赖访问时间和
2022-03-28 23:25:58
1282
原创 C++性能优化:代码优化
代码优化本章主要讲的是比较广泛的一些编程中遇到的降低性能的操作,并且改正的方法。比如说我们会遇到冗余计算的问题。在一次循环中,每次都需要计算一个值,这样可以将这个值的计算放到循环外面;再比如需要在两个不同的函数中调用同一个函数,结果相同。这样的话我们可以静第一次调用得到的结果用参数传递给另一个函数,而不需要在另一个函数中再执行一遍。(代码)缓存其实这一点讲的和上面的有些类似。在循环中有些可以确定的结果可以先写到循环外面,把结果缓存到局部变量,然后在循环中直接读取局部变量的值。预先计算预先计算和
2022-03-27 16:22:37
2511
原创 c++性能优化:引用计数
引用计数和自然界一样,玻尔兹曼熵法同样适用于代码世界。小型的软件在面对的用户不断增加的新功能就会需要不断迭代。这样的迭代就会带来代码的混乱,评断代码的混乱标准是衰变率。与混乱的软件有关的主要难题就是代码的内存讹误,也就是会发生代码的内存泄漏,指针的过早删除等等。但是在c++中使用一种机制来尽可能的避免使用指针带来的以上问题,它就是引用计数。引用计数的基本思想就是将指针的控制从客户放到对象本身,当没有对象使用这个指针的时候就把这个指针删除。引用计数有时还会被说成是一种性能优化,我们来看一下一个对象在复制
2022-03-27 16:09:42
1515
原创 c++性能优化:标准模板库
这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar
2022-03-27 10:52:59
822
原创 C++性能优化:可伸缩性
可伸缩性提高C++代码性能的几种方法主要有缩短代码执行路径、添加处理器、升级处理器的速度。但是往往添加处理器也很难就是达到好的效果,有很多原因会导致添加的处理器数量和速度提升的倍数不成线性关系,比如单个处理器变为双处理器,但是执行速度就不一定会快2倍。单处理器的体系结构中,主要是包含处理器、主存以及快速缓存。但多线程执行时主要通过抢占式的线程调度方式,看起来是并发,实际是cpu在轮流执行这几个线程。SMP体系结构SMP体系结构中有多个同样的cpu,多个线程可以同时执行。线程在没有特殊写明的情况下不会
2022-03-03 23:17:58
283
原创 c++性能优化:内联技巧
条件内联 编译,配置,调试等与内敛有关的消极因素会将内联的时间点尽量后移,一般都是大部分调试完之后才会考虑内联部分。理想情况是内联关系在配置的结果上的,而且大多数的编译器也可以使用编译开关来阻止内联,但有些编译器不支持的话那只能使用条件编译的方式来控制内联。 但一个隐患是配置如果修改需要频繁的在服务于性能的内联和服务于测试的外联,但我们可以使用预处理的方式避免问题的产生。 以下就是条件编译的例子 ; inline void.
2021-10-14 23:17:37
1083
原创 c++性能优化:单线程内存池
前言本章主要讲的是单线程内存池的构建。我们都知道,内存频繁的分配和释放会导致程序性能的降低,主要的原因是内存管理上的消耗,以及有些应用程序会在使用的过程中以某种特殊的方式使用内存,导致会出现不需要内存的地方出现性能的损失。我们可以通过自己定义内存管理的方式达到管理内存的目的,防止程序对于内存的滥用。内存管理器的设计是多维的,主要考虑两个方面,第一个是内存的大小固定还是可变,第二个是单线程还是多线程。本章讨论的管理器主要是单线程方面的。版本0 new()和delete()从原理上说,默认的内存管理器是通
2021-09-21 16:15:15
403
原创 c++性能优化:临时对象
前言对于性能来说,实际上许多的问题都需要和出现的频率以及本身执行一次的开销挂钩,有些问题虽然看似比较开销较大,但是很少会执行到,那么也不会对程序有着非常大的影响;同样的一个很小的开销的函数执行很频繁,同样会对程序的执行效率有很大的影响。这一章中作者主要是根据临时对象来阐述这样一个观点。对象定义先看下文章中提到的例子:class Rational{friend Rational operator + (const Rotional& a, const Rotional& b.
2021-09-12 15:10:51
199
原创 c++性能优化:返回值优化
返回值优化前言这一章主要讲的是返回值优化,这个优化通常会交给编译器实现,用于加快源代码执行,通过对源代码进行转化并消除对象实现的。按返回值构造以下的例子主要是complex实现复数的类:插入代码这个类的操作符函数,比如加法的函数如下:代码以上可以看出,加法的结果是返回值返回的。实际上编译器内部会进行操作a=b+c这样的结果,a会被编译器临时构造出来,b和c都是引用传递,因此两个参数的函数会被临时创建为三个参数。同样的调用的时候也会发生变化,需要传递三个参数,这个就是返回值优化的步骤之一。
2021-09-06 08:23:05
497
原创 c++性能优化-虚函数
虚函数目录虚函数前言一、虚函数的构造二、模版和继承1.引入库2.读入数据总结前言性能优化的目的是为了让程序变得高效,但同时也不能丧失程序的可维护性和可扩展性。本章总结主要是关于虚函数方面的性能优化的要点一、虚函数的构造 虚函数想必大家都比较了解。虚函数的引入为c++提供了多态性,为实现面向对象编程奠定了基础。但是仔细分析一下,虚函数的额引入必然也会带来一些开销。比如,虚函数实现的一个重要的指针vptr,正是这个指针使得父类能够正确的找到子类继承的函数;其次,我们必须先得到指向函数表的指针
2021-08-29 14:18:26
1079
原创 c++性能优化-构造函数和析构函数
构造函数和析构函数目录构造函数和析构函数前言一、继承二、合成三、缓式构造四、冗余构造总结前言 正常的情况来说,构造函数和析构函数应该是消耗性能比较少的地方,我们在学习基础的c++编程的时候,书上基本都会写构造函数和析构函数需要尽量的简洁,不能承担复杂的计算工作或者是逻辑工作。事实也确实如此,如果将大量的计算放到构造函数和析构函数,整个类都会比较臃肿,其他类引用时也会有更多的不方便。所以,构造函数和析构函数大多数的情况下主要是负责的初始化和清除资源的操作。一、继承 继承和合成都是在对象设计
2021-07-25 16:03:24
848
原创 c++性能优化笔记-跟踪实现下的性能隐患
跟踪实现下的性能隐患我们在调试代码的时候,会有很多不同的手段。像我的话最常使用的是打日志Log,通过Log可以很清晰的判断出代码的逻辑,再进一步的深入查找问题出现的根源。其实还有很多其他的方法,比如墓碑文件,看Trace等等。实现记录日志以及记录代码执行相关的Trace是我们整个项目组成不可或缺的一部分,有的时候往往Log打得好,问题查得更快,整个项目也会更加的健壮。但是,我们在项目中往往会忽视这些Trace代码带来的性能消耗。由于工作中的项目,几十万甚至几百万的代码量,程序员的Log为了形成统一的风
2021-07-04 21:39:19
206
原创 C/C++面试相关问题
本人之前从事的是嵌入式相关行业,主要是数字座舱相关操作系统底层以及中间层的开发,主要是基于Android、qnx、以及linux,语言的话用的比较多的是c/c++、java、python这些。最近面试的一些总结如下。...
2021-06-20 15:06:04
337
原创 Android 面试遇到问题
面试遇到的问题:1.c++ 11 新特性,常用的const int b = 10;auto a = b;const类型auto不会转,因此还是a的类型还是int型。智能指针shared_ptr:class A{shared_ptr& B();};怎样在函数B中返回智能指针A所有的新特性的都需要自己实践一遍2.从操作系统内存的角度讲一下进程和线程的区别3.select和epoll的并发量选择4.c++ 定义对象和new的区别定义对象的话不需要手动释放内存,析构函数自动释放
2021-06-14 14:19:37
1053
2
原创 网络IO原理汇总:五种IO模型
网络IO一直都是网络通信的基础,经过多年的演变,现在也衍生出了很多种不同的通信方式,今天就大概说明一下每种方式的原理以及优劣。阻塞IO这是最容易理解的一种IO模型,顾名思义,用户层调用了系统IO之后需要阻塞等待内核的回复。这样虽然说消息的准确性比较高,但是在高并发的场景下,如果一个消息一直未收到,那么就会一直阻塞,及其影响通信的效率。...
2021-03-15 23:48:49
523
原创 redis源码解析:skiplist
最近学习Redis源码,存储结构相关的知识,在这边总结一下一些重要的知识点。如果有说的不对的地方,希望大家帮忙指正。Redis的基本数据结构Redis是一种key-value的数据库存储系统,简称为k-v。key-value形式的存储结构,一般会使用红黑树或者hash表来存储。红黑树的时间复杂度为O(logn),hash表则是O(1)。Redis内部是有维护一个hash表的,说到hash表,肯定会第一时间想到有相应的hash算法,Redis中的key如果是字符串的话,一定需要通过hash算法将字符串h
2021-03-11 20:18:38
139
原创 内存池解析
今天来大概记录一下内存池的原理。内存池实际上就是将内存集中在一起,需要取内存的时候到内存中取。主要是用在需要频繁的请求,需要不断的操作内存进行malloc和free,这样会形成内存的碎片化。那么我们应该如何去实现一个内存池?首先内存池其实需要封装成一个组件,能够在不同的项目中进行复用。因此就需要确定内部的基础结构以及api,并且需要测试函数确认自己的模块正确。内存池的结构定义:内存中一页是4k,因此一般小于4k的话就属于小块内存,大于4k的话属于大块内存。如果当前的内存是小块内存的话,比较难办的一个
2021-02-21 21:19:41
300
原创 线程池源码剖析
线程池源码剖析欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdo
2021-02-18 15:43:26
132
原创 设计模式精讲
把之前设计模式的文章总结了一下,供大家学习。C++实现设计模式(1)- 设计模式简介https://my.oschina.net/u/3690276/blog/3086072C++实现设计模式(2)- 模板方法https://my.oschina.net/u/3690276/blog/3109268C++实现设计模式(3)- Strategy模式https://my.oschina.net/u/3690276/blog/3109361C++实现设计模式(4)- 观察者模式https://m
2021-02-10 23:25:00
154
原创 Linux总结篇
Linux总结篇系列-第一篇 指路篇:https://zhuanlan.zhihu.com/p/303994412Linux总结篇系列-第二篇 数据结构篇:https://zhuanlan.zhihu.com/p/304044744Linux总结篇系列-第二篇 问答篇:https://zhuanlan.zhihu.com/p/304298927
2021-02-10 23:07:56
92
转载 Redis相关总结--存储结构
自己总结的 Redis主从复制的相关知识点:https://zhuanlan.zhihu.com/p/340237719
2021-02-10 22:59:59
111
原创 Linux内核相关知识总结
Linux内核总体架构总体架构进程管理内存管理文件系统设备驱动网络三级目录总体架构Linux内核在C/C++程序员的技术栈中占据着举足轻重的作用,不仅仅是考验一位程序员扎实的基本功,也考验对于整个架构的熟悉程度。理解linux内核中整个的实现之后,会对自己做项目时底层的通信以及数据存储等有很大的帮助。Linux内核总共有五大部分组成。进程进程管理内存管理文件系统设备驱动网络三级目录...
2020-10-28 00:14:36
793
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人