- 博客(41)
- 收藏
- 关注
原创 Display学习日志(一) —— 基础知识
【前言】显示屏是日常生活中大家获取信息的主要来源,其实也就是利用了眼睛这个窗口或者说是媒介。【人眼组成】1、视杆细胞(rod cells): 12000万个之多,感光,明暗变换。2、视锥细胞(cone cells): 600万个,分辨颜色和物体细节,对光线不敏感。3、内在光敏视网膜神经节细胞(intrinsically photosensitive retinal ganglion cells):对视觉形成没有帮助,它主要是负责感光形成生物节律、调节瞳孔的大小、调节褪黑素的分泌。
2022-01-11 11:25:27 537
原创 手机上的算法优化 —— cache miss
【前言】cache是利用局部性原理(时间、空间),更好的解决硬件间速率不匹配的问。现代CPU的Cache一般分为三级:L1,Cache生产成本最高,容量最小,但是速度最快,处理器访问一级Cache中的数据一般只需要3~5个指令周期,一级Cache又分为数据Cache和指令Cache,分别缓存数据和指令;L2,Cache不区分数据和指令,容量较大,速度较慢;L3,Cache也称LLC(Last Level Cache),容量最大,而速度更慢。.在多核时代,一般一颗CPU中,每核都有独立
2022-01-10 17:44:04 2157
原创 图像中的灰度方差
【前言】图像中的均值方差,PS大神一定懂怎么调。【方差】方差反应图像的高频部分的大小,举个栗子:如果一幅图片看起来灰蒙蒙的, 那方差就小; 如果看起来很鲜艳, 对比度很大, 那方差就大;【均值】均值就是平均水平, 比如你把电视机的亮度调高了, 那均值就变大, 但方差没变;如果你调把对比度调高了, 那均值没变, 但方差变大;...
2022-01-06 17:36:54 3574
原创 手机上的算法优化 —— 分支优化
【前言】作为一个程序猿,if - else的使用会贯穿我们的整个职业生涯,但是有句话说的好,成年人不做选择题,那我们应该如何避免选择题呢?【Show me the fucking code!】if(condition 1) { 分支流程1} else if(condition 2) { 分支流程2} ……else { 分支流程n}【违反开放、封闭原则】: 新增一种判断时,会新增一个if-else分支【函数表优化】针对与上述原...
2022-01-06 16:19:13 318
原创 手机上的算法优化 —— 内存压缩算法
【前言】随着手机APP的升级,手机的内存也越来越大,在有限的内存空间里存放更多的数据,成为了对developer的挑战,接下来我会介绍一下内存中最常使用的几种算法,并剖析一下适合的使用场景。由于鄙人知识浅薄,在这里仅分析ZRAM中使用的压缩算法,收集于大神,在这里做总结。【压缩算法】 查看手机目前收集中支持的ZRAM压缩算法:cat sys/block/zram0/comp_algorithm ...
2021-12-20 21:50:35 8609
原创 linux内核 —— sched(二)
【前言】写着sched这节却是在说红黑树,惊不惊喜意不意外。。。。因为我跑飞了。。。AVL树: 最早的平衡二叉树之一。应用相对其他数据结构比较少。windows对进程地址空间的管理用到了AVL树。红黑树: 平衡二叉树,广泛用在C++的STL中。如map和set都是用红黑树实现的。B/B+树: 用在磁盘文件组织 数据索引和数据库索引。Trie树(字典树): 用在统计和排序大量字符串,如自动机。O(n)结构:list/栈/队列O(1)结构:数组/hash/位图O(logn)树
2021-12-20 21:35:20 293
转载 子线程继承父进程的遗产
子进程得到父进程东西的 拷贝,不是它们本身。父进程和子进程拥有独立的地址空间和PID参数子进程继承父进程环境(environment)变量堆栈连接的共享存储段(共享内存)打开文件的描述符(注意对应的文件的位置由父子进程共享,这会引起含糊情况)执行时关闭(close-on-exec) 标志 (译者注:close-on-exec标志可通过fnctl()对文件描述符设置,POSIX.1要求所有目录 流都必须在exec函数调用时关闭。更详细说明,参见《APUE》 W. R. Stevens, 1
2021-12-20 21:19:00 375
原创 linux内核 —— sched(一)
【前言】一篇文章难以总结linux kernel中最核心的调度系统,但是可以将其中比较重要的点摘录出来,以便之后继续研究。 内核进行硬件资源的分配,而进程是运行的程序,是资源的分配单元:内存资源、CPU资源、I/O资源。【1.调度策略】 调度策略是程序猿最直接打交道的地方,内核有6种调度策略:Priority Policy Schduler Detail IDLE SCHED_IDLE CFS-IDLE ...
2021-12-20 20:52:06 4783
原创 手机上的算法优化 —— 系统调用统计
【前言】当我们的程序频繁使用系统调用,也会造成大量的功耗,我们可以同过strace来统计我们的程序系统调用。【STRACE】strace: Process 15131 detached% time seconds usecs/call calls errors syscall------ ----------- ----------- --------- --------- ---------------- 34.83 0.055493
2021-12-15 19:44:15 156
原创 手机上的算法优化 —— 软件耗电排查
【前言】手机功耗分为: 硬件功耗与软件功耗。【硬件功耗】硬件功耗计算函数在:processMiscUsage()private void processMiscUsage() { addUserUsage(); // 多用户中每个用户的耗电量 addPhoneUsage(); // 通话耗电量 addScreenUsage(); // 屏幕耗电量 addWiFiUsage(); // wifi耗电量 addBluetoothUsage(
2021-12-14 20:07:14 443
转载 防止头文件被重复包含
【前言】为了避免同一个文件被include多次,C/C++中有两种方式,一种是#ifndef方式,一种是#pragma once方式。方式一: #ifndef __SOMEFILE_H__ //或写为#if !define __SOMEFILE_H__ #define __SOMEFILE_H__ ... ... // 声明、定义语句 #endif 方式二: #pragma once ... ... // 声明、定义语句一) #i
2021-12-14 19:31:35 1506
原创 手机上的算法优化 —— 线程优先级设定
【前言】每个程序猿都希望自己的程序能跑的快一点,这样就不会有性能组或者其他related module来吐槽你。这样程序猿的头发就可以少掉一点,这样程序猿就有更多时间去打游戏,谈恋爱,为中国的人口增长做出一点自己的贡献。 而现实是每个程序猿都是这么想的,导致所有程序都成为了RT,那么如果你新写了一个程序,你一定要卷死他们,set nice 最低,set priority最高,这样你就会成为程序猿里面头发最多的。【priority是什么】 #includ...
2021-12-13 15:21:22 1904
原创 C++ 虚函数与纯虚函数
【前言】 在学习C++代码的过程中,发现了一件事:程序的美丽之处在于它的设计理念,可以说代码架构也是一门艺术。【虚函数与纯虚函数】
2021-12-12 20:40:06 71
原创 手机上的算法优化 —— CPU Boost
【前言】程序跑的快慢,一方面在于程序猿怎么写,一方面在于CPU怎么跑,程序你写的再好,也不如人家CPU快你千百倍,你是单片机的速度,我是光速,你细品。。。【CPU boost】...
2021-12-12 20:39:32 1648
原创 手机上的算法优化 —— CPU绑定(CPU affinity)
【前言】写了一段时间博客发现,以实际例子来说明一件事,可能会让读者更容易理解那些知识。从今天开始从手机优化的案例来逐篇对算法的优化做一个简单的总结专栏。1. 为什么需要绑核操作?需求决定一切:需要程序更快执行完成 需要程序避开频繁的CPU调度 需要屏蔽干扰条件验证算法的性能通常,我们会把进程绑定到大核簇或者小核簇,或者当个cpu上面,以提高程序执行效率。2. 如何找到我们需要的CPU核? 通过shell可以看到SOC的CPU信息:cat proc/cpuinf..
2021-12-09 15:40:15 2969
原创 如何完成一项任务?
【前言】 在带领团队做项目的时候发现从零开始完成一项任务对于团队的leader来说是一项巨大的考验。打个比方我接到一项任务,只是leader简单的一句话:完成触控定制化方案的落地。所有人看到这句话的第一反应是好复杂,因为我们会联想到各种各样的场景,各种各样的困难点。而一般人的第一感觉是:这个事情我做不了,太难了!而当你问他难点时,他可以找出一万个理由。而问他解决方法时,可能得到的回答却是zero。这是因为这个任务本身就太复杂了吗?我的回答是: YES ...
2021-12-09 15:26:56 942
原创 Linux文件系统(四)—— open & read & write & poll
【前言】在android系统中,userspace应用常常会获取kernel中驱动的数据信息来执行一些动作:1. CPU权限的不同,CPU可以访问的内存空间明显是不同的。2. linux一切皆文件,userspace app获取驱动data的方式也必须通过访问VFS才可以获取。3. linux为我们设计好了VFS,我们在上层可以访问底层各种不同文件系统的内容。4.userspace只需要执行read/write即可执行对文件的操作。【open】不得不提VFS的advantage.
2021-12-01 20:24:18 2328
原创 Linux文件系统(二)—— VFS
【前言】文件系统是结合了众多工程师智慧的结晶,所以在这个过程中,会出现各种各样的小技术手段来解决一些实际性问题,从而产生了很多技术词汇。【文件系统Overview】Linux一切皆文件:普通文件、目录文件(也就是文件夹)、设备文件、链接文件、管道文件、套接字文件(数据通信的接口)等等。引入文件系统,帮助我们屏蔽底层实现的细节(不必care扇区,cache,文件管理),我们只需通过VFS提供的fs_op就可以对文件进行对应的操作。Android 支持的文件系统: ...
2021-11-30 21:55:08 2364
原创 Socket的前半生
【前言】 人们常说一句话:我不想知道我是怎么来的,我只想知道我是怎么没的,因为大部分人都知道自己是怎么来的,而不知道自己是怎么没的。这句话在技术领域中也同样适用,大部分人只知道技术是怎么来的,却不知道该技术如何演化直至出现更新的技术代替而消亡的未知过程。 当你知道了:技术是怎么来的,是怎么发展到现在,你已经成为了行业的精英,当你知道如何演化,如何迭代更新,你的目光已经超越了大部分技术人才,到达了专家或者说是行业领导者的级别。【Socket —— 源起】Socket:...
2021-11-30 15:07:28 2554
转载 Binder总结(二)—— 缺陷与改进
1.传统Linux IPC机制的缺点1.1性能角度管道、消息队列、Socket实现一次进程通信都需要2次内存拷贝,效率太低;共享内存虽然不需要拷贝内存,但管理复杂;Binder只需要一次内存拷贝,从性能角度来看,低于共享内存方式,优于其它方式。 IPC 数据拷贝次数 share mm 0 Binder 1 pipe MQ SOCKET 2 2.2安全性考虑a. 传统的IPC机制没有安全措施,接收方无法获得对方...
2021-11-29 21:39:02 446
转载 Binder总结(一)—— 源起
【前言】Android系统基于linux kernel实现,Linux已经提供了那么多IPC方式,为何要新起Binder?Linux IPC方式起底:1. 管道无名 —— 普通管道pipe: 通常有两种限制:一是单工,只能单向传输;二是只能在父子或者兄弟进程间使用。如果写入无名管道的数据超过其最大值,写操作将阻塞,如果管道中没有数据,读操作将阻塞,如果管道发现另一端断开,将自动退出。无名 —— 流管道s_pipe::去除了第一种限制,为半双工,只能在父子或兄弟进程间使用,可以双向传输。有
2021-11-29 20:11:44 363
转载 ADB后台运行程序
使用nohup:adb shell "nohup logcat -r 2000 -f /data/local/test.log &"adb shell "nohup getevent -ltr &"
2021-11-27 16:05:08 3511
原创 linux CMA总结
【前言】有时候对一个词记忆特别深刻的时候,那一定是你被这个词伤害过,我就是被CMA伤害过。。。那是一个冬天,高通的面试官问我,知道什么是CMA吗,我心头翻涌出无数浪花,脑子也和进了水一样,CMA,我草,这是个啥,China Meteorological Administration 中国气象局?China Meat Association 中国肉类协会。我心想,高通绝对不会知道我中华文化之深厚,Christian Management Association 基督教管理委员会,他一定想问我是否有
2021-11-26 17:54:27 2220
原创 Linux文件系统(一)—— 白话文件系统
1. 为什么需要有文件系统? 解放你的双手,让你的双手能干更多的事情,没有文件系统,你想在磁盘上下载一个小电影,你需要记录电影的起始位置与长度等等信息。wtf为什么我还需要做这些事情,我只是想看个小片片而已。更绝的是当你看完了想替换一个新的电影时,结果发现删除移动复制让你瞬间回到了解放前。 你就想着如果有人能替你管理一下这些小片片,你就可以解放自己的双手了,可以做更多的事情。。。有了你的需求,文件系统应用而生!2. Linux的文件系统长啥样? Li...
2021-11-26 17:13:02 151
转载 Android Native SP<>学习
Smart pointer:C++指针不具备构造和析构函数,引入智能指针是为了更好的回收内存资源。Smart Pointer实现方式(模板):1.模板auto_ptr: C++98提供,已废弃2.模板unique_ptr、shared_ptr: C++11提供 unique_tr:建立所有权(ownership)概念,对于特定的对象,只能有一个智能指针可拥有它,赋值操作转让所有权。 shared_ptr:跟踪引用特定对象的智能指针数,赋值时,计数将加1,而指针...
2021-11-25 20:03:50 319
原创 协方差的理解
1. 协方差的意义:协方差的定义,两个变量总体误差的期望:定理:数据0中心化后, (X * X转置) /n 等于协方差矩阵解决多维样本之间的特征联系:协方差矩阵:可见:协方差矩阵是一个对称的矩阵,而且对角线是各个维度上的方差。①协方差就是看两个变量是否正负相关,也就是数值上变化是否同或反向;②相关系数直接衡量的就是线性相关关系,取值就在+-1之间,体现的含义是X和Y多大程度在一条斜率存在且不为0的直线上;相关系数值域在[-1,1]之间,-1表示最强负相关,.
2021-11-24 21:11:38 12393 3
原创 卡尔曼滤波
牛逼的算法往往来源于一个简单的思想 + 演化过程。1. 卡尔曼滤波是什么?卡尔曼滤波用于线性系统线性系统,对系统的输出进行最优估计(预测)的算法,因为系统的输入(观测量)存在噪声与干扰,会对整个输出结果带来累积误差与偏差,我们最终的结果也相当于对这些干扰进行滤波的过程。2. 卡尔曼滤波的用途?应用:制导与导航系统,计算机视觉系统与信号处理,sensor的误差估算来得到实际测量值。卡尔曼滤波一般用于优化估算(预测)一些无法直接测量,但是可以通过其他的量间接来估算的量。3. 状态控制的知
2021-11-23 22:50:39 2153
原创 Android S启动过程init分析(二) —— Second Stage
上篇文章分析了android init 第一阶段的启动流程,第二阶段比第一阶段更加复杂,接下来会用流程图 + 讲解的方式来分析。4. Init/main.cpp做了什么谜之操作 —— SecondStageMain
2021-11-22 17:24:40 1517
原创 Android S启动过程init分析(一) —— First Stage
Init 是Android OS中第一个user space process(pid = 1),守护进程(在后台运行的特殊进程,用于执行启动的系统任务):比如zygote与property服务等,源码位于:system/core/init/ ,本文会分析它的完整启动流程。
2021-11-22 15:19:41 1236
原创 Android build.prop编译以及加载过程分析
1、什么是build prop?类似windows的环境变量,编译的添加property后,我们可以在android应用层以及native层直接读取获得该键值对(key/value),它非常友好,对于所有程序都是可见的,可以区分流程分支、添加不同功能、android各层直接交互、记录数据、绕开SElinux执行自定义添加的可执行程序等等。2、build prop来自于何方?build.prop的生成是make系统解析build/core/Makefile:--> build/tools
2021-11-20 17:40:27 3883
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人