0%

1.core文件

实习工作时经常听到一个概念是程序core掉了,需要定位解决,这里说的大部分是指对应程序由于各种异常或者bug导致在运行过程中异常退出或者中止,并且在满足一定条件下会产生一个叫做core的文件。

通常情况下,core文件会包含了程序运行时的内存,寄存器状态,堆栈指针,内存管理信息还有各种函数调用堆栈信息等,我们可以理解为是程序工作当前状态存储生成第一个文件,许多的程序出错的时候都会产生一个core文件,通过工具分析这个文件,我们可以定位到程序异常退出的时候对应的堆栈调用等信息,找出问题所在并进行及时解决。

使用 gdb 调试 core 文件,可以帮助我们快速定位程序出现段错误的位置。当然,可执行程序编译时应加上 -g 编译选项,生成调试信息。

当程序访问非法内存会产生段错误,产生段错误的常见情况有:

(1)访问不存在的内存地址;

(2)访问系统保护的内存地址;

(3)数组访问越界等。

阅读全文 »

最近在实习工作过程中,需要添加一个uint32位的字段,其中不同位表示不同的意义,使用一个uint32存储就更加轻便,这时就用到了位域这个概念,自己以前不太熟悉就参考网上资料整理总结一下。

定义

“ 位域 “ 或 “ 位段 “(Bit field)为一种数据结构,可以把数据以位的形式紧凑的储存,并允许程序员对此结构的位进行操作。这种数据结构的一个好处是它可以使数据单元节省储存空间,当程序需要成千上万个数据单元时,这种方法就显得尤为重要。第二个好处是位段可以很方便的访问一个整数值的部分内容从而可以简化程序源代码。而这种数据结构的缺点在于,位段实现依赖于具体的机器和系统,在不同的平台可能有不同的结果,这导致了位段在本质上是不可移植的。

位域声明

位域使用以下的结构声明 , 该结构声明为每个位域成员设置名称,并决定其所占的bit数

1
2
3
4
5
struct bit_field_name  // 位域结构名
{
type member_name : width; // type 位域成员的类型,必须为 int、signed int 或者 unsigned int 类型
// width 规定成员所占的位数
};

阅读全文 »

什么是线程安全?

在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况。

如何保证线程安全?

  1. 给共享的资源加把锁,保证每个资源变量每时每刻至多被一个线程占用。
  2. 让线程也拥有资源,不用去共享进程中的资源。如: 使用threadlocal可以为每个线程的维护一个私有的本地变量。

什么是单例模式?

单例模式指在整个系统生命周期里,保证一个类只能产生一个实例,确保该类的唯一性

单例模式分类

单例模式可以分为懒汉式饿汉式,两者之间的区别在于创建实例的时间不同:

  • 懒汉式:指系统运行中,实例并不存在,只有当需要使用该实例时,才会去创建并使用实例。(这种方式要考虑线程安全)
  • 饿汉式:指系统一运行,就初始化创建实例,当需要时,直接调用即可。(本身就线程安全,没有多线程的问题)
阅读全文 »

Dijkstra算法

学习了一下关于Dijlstra最短路的算法,做一下总结,梳理一下思路。

求最短路算法一般分为求单源最短路和多源汇最短路,思维导图如图所示:

其中n表示节点数,m表示边数。

稠密图:m与n^2是一个级别的,用邻接矩阵来表示。

稀疏图:m远远小于n^2,用邻接表来表示,比邻接矩阵更节省空间

具体邻接矩阵和邻接表可以参考这篇文章图的邻接矩阵和邻接表的比较

阅读全文 »

整理一下自己在实习工作期间,常用的Linux操作命令,加深印象,熟悉一下。

查看日志相关:

tail:

-n 是显示行号;相当于nl命令;用例如下:

1
2
3
4
5
tail -100f test.log      实时监控100行日志

tail  -n  10  test.log   查询日志尾部最后10行的日志;

tail -n +10 test.log    查询10行之后的所有日志;
阅读全文 »