读书笔记
文章平均质量分 71
freudlv
这个作者很懒,什么都没留下…
展开
-
性能优化(2.CPU上下文切换)
性能优化(2.CPU上下文切换)概述Linux 是一个多任务操作系统,它支持大于 CPU 数量的任务同时运行。实际上,这些任务并不是真的在同时运行,只是系统在很短的时间内,将 CPU 轮流分配给它们,造成多任务同时运行的错觉。每个任务运行前,CPU 都需要知道任务从哪里加载、从哪里开始运行,也就是说,需要系统事先帮每个任务设置好 CPU 寄存器和程序计数器。上下文CPU 寄存器,是 CPU 内置的容量小、但速度极快的内存。程序计数器,则是用来存储 CPU 正在执行的指令位置、或者即将执行的下一原创 2021-09-12 09:30:04 · 447 阅读 · 1 评论 -
性能优化(1. CPU分析工具)
性能优化(1. CPU分析工具)关于本系列性能优化的系列文章,主要的信息来源是:《性能之巅》(Brendan Gregg)以及《Linux性能优化实战》(倪朋飞)。本系列的计划是,前几部分讲述相关工具,后面讲述工具如何使用,在遇到问题的时候的一些分析套路。概述性能是对整个系统的研究,包括了所有的硬件组件和整个软件栈。性能优化是个系统工程,总是牵一发而动全身。它涉及了从程序设计、算法分析、编程语言,再到系统、存储、网络等各种底层基础设施的方方面面。每一个组件都有可能出问题,而且很有可能多个组件同时原创 2021-09-12 09:29:28 · 650 阅读 · 0 评论 -
通过汇编看参数调用与返回
通过汇编看参数调用与返回要查看汇编代码,有两个方法:看一段代码:代码编译/运行环境:后记猜想做个试验:要查看汇编代码,有两个方法:gcc -S main.c (只看到汇编码)gcc -g main.c; objdump -dS a.out (可以看到汇编码与源码)参考代码:https://blog.csdn.net/stephenjy/article/details/3978161?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogC原创 2021-09-11 20:29:01 · 956 阅读 · 0 评论 -
潜在二义性
先说结论在语义层面,潜在的二义性,C++编译器不会报错。只有产生了实际的二义性,C++编译器才报错。编译器:VC6.0gcc version 4.8.4看一段代码:using namespace std;void testFunc(){ cout<<"testFunc void"<<endl; return;}void testFunc(int inputVar = 0){ cout<<"testFunc with default原创 2021-09-12 09:23:49 · 219 阅读 · 0 评论 -
编译原理—笔记
编译原理—笔记翻译程序(Translator Process)翻译程序,是指把某一种语言,翻译成另外一种语言。并不特定于高级语言到低级语言之间的转换,可以是高级语言之间,或者低级语言之间的转换。语言A -》翻译程序 -》语言B编译程序(Compiler Process)编译程序,是翻译程序的一个子集。编译程序把高级语言的源码作为输入,经过翻译,分析,处理优化之后,输出面向机器的语言。机器语言就是目标程序,由计算机执行。高级语言A -》编译程序 -》 机器语言B (编译过程存在中间语言)编译原创 2021-09-12 09:21:55 · 453 阅读 · 0 评论 -
C语言--数组/结构体初始化
看一段代码:typedef struct{ char MerchantID[128]; char MobileToken[36]; }Test_Data;void testStructInit(){ Test_Data struData = {1}; int i; for (i = 0 ; i < sizeof(struData); i ++) { printf("%02x ", (char)*(((char *)&struData) + i));原创 2020-06-16 23:44:21 · 1063 阅读 · 0 评论 -
读书笔记《Debug Hacks --调试技术与工具》(4-GDB调试(三))
历史值print变量的时候,显示过的值会记录在内部的历史中。可以通过print $n 访问历史变量,比如下面的例子,p变量后,可以观察前面有 $1, 后续指令中,$1 就是指这个变量:(gdb) p arrToSearch$1 = {0, 0, 0, 0, 4195936, 0, 4195440, 0, -6960, 32767, 0}历史命令在一个会话中,使用的命令,可以保存起来,用于下一个gdb会话。以下指令为:设置指令历史扩展,保存历史文件,保存历史记录,设置命令历史数量:set原创 2020-06-15 23:36:38 · 287 阅读 · 0 评论 -
读书笔记《Debug Hacks --调试技术与工具》(3-GDB调试(二))
attach到进程对于已经在运行的程序,可以使用指令attach进行附着程序调试,格式 attach 程序运行后,查阅PID,然后gdb启动:[root@localhost gdbTest]# ps PID TTY TIME CMD 8194 pts/0 00:00:00 bash 9108 pts/0 00:00:00 su 9111 pts/0 00:00:00 bash 9208 pts/0 00:00:02 a.out 920原创 2020-06-15 00:18:08 · 208 阅读 · 0 评论 -
读书笔记《Debug Hacks --调试技术与工具》(2-GDB调试(一))
本文涉及的主要用法:设置/删除断点;显示栈调用;显示/设置变量值;生成coredump文件;查看内存地址。要调试的源码#include "stdio.h"static int binarySearch(int array[], int len, int key){ int left = 0; int right = len - 1; while (left <= right) { int mid = (left + right) / 2;原创 2020-06-11 22:32:41 · 378 阅读 · 0 评论 -
C语言--浮点数的比较
先说结论:浮点数不能直接用"=="进行比较观察代码看如下代码,分析输出:void testDoubleCompare(){ float a = (float)0.1; float b = (float)0.1; float c = (float)0.1; double d = (double)0.1; //同样精度,同样字面大小 if(a == b) printf("a==b\n"); else printf("a!=b\n"); //不同精度,同样字面大小原创 2020-06-11 22:21:53 · 5720 阅读 · 0 评论 -
读书笔记《Debug Hacks --调试技术与工具》(1-进程的内核转储)
读书笔记《Debug Hacks --调试技术与工具》(1-进程的内核转储)内核转储(core dump)可以保存问题发生时的状态。只要获取内核转储,即使没有复现的环境,也能够调试。启动内核转储shell指令(查看当前的内核转储功能是否有效):ulimit -c如果上例中的限制为0,则转储无效。需要做如下设置(不做限制,或者限制转储文件最大1G):ulimit -c unlimited或者ulimit -c 1073741824生成转储文件开启转储功能后,尝试生成转储文件,比如,运原创 2020-06-10 00:41:04 · 209 阅读 · 0 评论 -
读书笔记 《C Primer Plus》(5-关于const)
读书笔记 《C Primer Plus》(5-关于const)本篇只要讲述const关键字,该关键字可用于修饰变量,函数参数以及返回值。1、const修饰变量,使其成为常量:const int a = 99; //a为常量,编译前阶段完成替换int const a; //同上const int *p; //p指针指向int常量,指向的值不变int const *p; //同上,等价int * const p = &a; //p指针为常量指针,指向的变量不变const int * co原创 2020-06-08 21:54:18 · 142 阅读 · 0 评论 -
读书笔记 《C Primer Plus》(4-C语言与UNIX)
读书笔记 《C Primer Plus》(4-C语言与UNIX)此文章主要讲C语言的起源。参考:https://www.multicians.org/history.htmlhttps://web.mit.edu/multics-history/故事的开始在1964年,MIT开始了一个预研项目:Multics(Multiplexed Information and Computing Sercive,多路复用信息和计算服务)是大型分时操作系统。该项目有一个宏大的目标,希望可以开发出一个大型主原创 2020-06-07 23:11:24 · 225 阅读 · 0 评论 -
读书笔记 《C Primer Plus》(3-左值 与 右值)
读书笔记 《C Primer Plus》(3-左值 与 右值)术语:数据对象,左值,右值与操作数此处解析对于赋值操作符“=”的左边与右边对象的称谓,以及含义。数据对象(data object)泛指数据存储区,用于保存值。比如,用于保存变量或者数组的数据存储区是一个数据对象。左值(lvalue)指用于标识一个特定的数据对象的名字或者表达式。比如,变量的名字是一个左值。作为一个左值,一定能解析出对象的地址。因此,对象指的是实际的数据存储,而左值是用于识别或者定位那个存储的标识符。可修改的左值原创 2020-06-07 22:11:13 · 255 阅读 · 0 评论 -
读书笔记 《C Primer Plus》(2-指针数组-数组指针-指针函数-函数指针)
读书笔记 《C Primer Plus》(2-指针数组-数组指针-指针函数-函数指针)指针是C语言的灵魂,成也指针,败也指针。在指针的世界里,就有了一些比较拗口的概念:指针数组/数组指针/指针函数/函数指针,本文旨在说清楚这些概念。指针数组场景:在某些情况,有一系列的指针是相关联的,比如有很多常量字符串“AAA”,“BBB”"CCC"等,通过数组保存他们,可以写成:const char pStr[] = {"AAA", "BBB", "CCC"};我们在代码逻辑中,可以动态地选择不同的数组元原创 2020-06-07 12:53:15 · 190 阅读 · 0 评论 -
C语言 -- 变量临时性定义
C语言–临时性定义先看下面一段代码:file1.cint globalInt;int main(){ funcInFile2(); printf("main func[%d]\n", globalInt); return 0;}file2.cint globalInt;int funcInFile2(){ globalInt = 909; printf("here is funcInFile2\n"); return 0;}是否能编译、链接成功?执行效果如何?答原创 2020-06-02 21:32:10 · 1408 阅读 · 0 评论 -
读书笔记《Debug Hacks --调试技术与工具》(0-概述)
Debug是非常个性化的工作,但是有效的debug方法,解决问题的思路毫无疑问是建立在对系统,应用的理解上。程序从编码到运行,有语法/编译问题,以及运行的问题。本系列的读书笔记主要讨论运行过程中遇到问题,如何继续调试。从代码到完成,经历的阶段有:需求定义,设计,编码,测试,调试等。编码:对项目进行编译与构建,修改并消灭编译错误与构建错误;测试:发现bug,找出不符合预期的行为。有方法认为编写程序前先写测试程序,TDD,即测试驱动开发。调试:对于给定的输入,确定输出是否符合预期。调试的工具/方原创 2020-05-11 21:57:52 · 246 阅读 · 0 评论 -
读书笔记 《C Primer Plus》(1-关键字)
读书笔记 《C Primer Plus》(1-关键字)我一直认为,能用好C语言提供的关键字,是把C语言使用好的第一步。下面提纲挈领地汇总一下C语言中的关键字,力求面面俱到。类型相关数据相关的关键字包括11个:字符:char(一个char就是一个byte,一般8位)整数:short,int,long,unsigned,signed.(short,int至少16位,long 至少32位,...原创 2020-05-07 01:07:51 · 285 阅读 · 0 评论 -
读书笔记 《C Primer Plus》(0-概述)
读书笔记 《C Primer Plus》(0-概述)前言使用C语言已经好多年了,在大学的时候开始使用C语言进行课程试验设计到现在已经超过十年。重新看C语言的书,是因为我在想:这么多年使用C语言后,重新系统地看语言的规则与用法,是否会有新的心得。因此这个系列的文章,不是事无巨细地记录C语言的方方面面,而是根据个人的经验,记录之前所忽略的,或者一直没有清晰认识的点。起源C语言的历史比我想象...原创 2020-04-16 22:55:45 · 265 阅读 · 0 评论