C语言宏定义展开方式
测试环境Mac OS(Big Sur) + Apple clang version 12.0.5我们先说结论:**宏定义由外向内平行展开,当碰到##或着#宏,参数不再做宏展开**下面用例子说明示例#define CON_STR(a, b) a ## b #define STR(a) #a #define CALL_STR(arg) STR(arg) // CON_STR( CON_STR(1, 2), 3 ); // CON_STR( STR(1), 3 ); // CON_STR( CALL_STR(1), 3 ...Jan. 1, 2022, 4:32 p.m.作者:zachary分类:C语言阅读(163)评论(0)
C++智能指针的内存角度的分析
写这篇文章是由于有个同事问了一个问题,虽然智能指针在C++11中就已经支持了,但是一直都没怎么用所以原理有些不太清楚,这里正好学习记录一下理解shard_ptr,我们先看一个例子(这里都使用C++17编译)编译命令:g++ -std=c++1z shard_ptr.cpp#include<iostream> #include<pthread.h> #include<semaphore.h> #include<unistd.h> using namespace std; class Test{ public: int x; &nbs...May 12, 2019, 1:11 p.m.作者:zachary分类:C++阅读(1153)评论(0)
kernel中信号量实现(二)
上一篇介绍了信号量可以使用waitqueue实现,这一篇主要讲waitqueue的实现,waitqueue故名思义就是等待队列。waitqueue在linux中的实现主要在下面文件中:include/linux/wait.h kernel/sched/wait.c一、先看数据结构struct __wait_queue_head { spinlock_t lock; ...Dec. 5, 2018, 2:55 a.m.作者:zachary分类:Linux相关阅读(1125)评论(0)
kernel中信号量实现(一)
kernel中很多地方使用了信号量机制,一个典型的实现就是内存回收的触发,在内存进入慢速路径后的第一件事就是唤醒kswapd工作。信号量的使用很简单,总结起来有下面几点:1、初始化信号量。wait_queue_head_t _wait; //变量定义 init_waitqueue_head(&_wait); //变量初始化2、工作线程一般是一个死循环,工作结束后调用wait,等待触发线程唤醒,唤醒后处理wait事件。while(1) { DEFINE_WAIT(wait); //定义临时变量 prepare_to_wait(&pgdat->kswapd_wait, &wait, TASK_INTERRU...Nov. 27, 2018, 1 a.m.作者:zachary分类:Linux相关阅读(1332)评论(0)
Malloc Debug
翻译至:https://android.googlesource.com/platform/bionic/+/master/libc/malloc_debug/README.mdMalloc Debug(内存调试)简介Malloc debug 是一种native层内存问题的方法。他可以帮助我们定位内存损坏、内存泄露、释放后再使用的问题。这个文档描述如何在Android N版本以后的Android系统中使用这个功能。对于老版本的malloc debug的方法见这个链接(https://android.googlesource.com/platform/bionic/+/master/libc/malloc_debug/README_marshmallow_and_earlier.md)。当malloc debug功能使能后,系统增加了一个Hook层代替正常的内存分配调用。这里主要替换了下面的...May 1, 2018, 2:41 p.m.作者:zachary分类:Android阅读(4079)评论(0)
matplotlib与panel结合的动态图
下面的例子显示了python动态图的做法,可以适用于其他图标,例如柱状图等。#encoding=utf8 import matplotlib import wx import numpy as np matplotlib.use('WXAgg') from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas from matplotlib.figure import Figure import threading import time class CpuInfoWindow(wx.Frame)...Feb. 22, 2018, 8:39 p.m.作者:zachary分类:python小站阅读(1134)评论(0)
HW Hackathon 作品
作品github地址:https://github.com/ShaoboFeng/huawei2017_hackathon作品视频:...Jan. 7, 2018, 2:08 p.m.作者:zachary分类:AI阅读(1139)评论(0)
也来玩玩微信跳一跳小程序
安装iphone 自动化测试工具pip install facebook-wda安装libimobiledevicebrew install libimobiledevice安装WebDriverAgent确保已经安装Xcode开发工具brew install Carthagebrew install npmgit clone https://github.com/facebook/WebDriverAgent.git./Scripts/bootstrap.sh遇到问题参考https://testerhome.com/topics/7220实现截屏与点击屏幕c = wda.Client() s = c.session() def pull_screenshot(): &nb...Jan. 4, 2018, 12:32 a.m.作者:zachary分类:iOS阅读(1208)评论(0)
Android 堆栈打印方法总结
framework层(java层)try { Log.i(TAG,"--------------NullPointerException-------begin"); throw new NullPointerException(); } catch (NullPointerException e1) { // TODO: handle exception Log.i(TAG, "-------------NullPointerException"); &nbs...Dec. 31, 2017, 4:16 p.m.作者:zachary分类:Android阅读(1511)评论(2)
进程退出时,内存回收流程
在android优化中,有一个是技术是ZRAM,ZRAM是基于swap技术的,前几天同事问了个问题,linux内核中通过kswapd或是直接reclaim一个进程到zram中,如果这个进程被杀,那这个进程对应在ZRAM中的内存会不会先解压然后在free,这个问题以前只是知道不会解压的,具体的流程不是很清楚,用了两天时间搞了明白,现在先上图: 进程退出最终调用的是do_exit函数,然后通过一层层vma,pud,pmd,pte找到所有的page,对应page如果是在swap中的,通过swap_slot_free_notify回调调用swap设备中的notify方法,直接释放swap中的页,如果不是在swap中最终通过调用free_pages_and_swap_cache释放到buddy系统中,这里如果是0阶页通过free_hot_cold_p...July 29, 2017, 8:27 a.m.作者:zachary分类:Linux相关阅读(1285)评论(0)