高级语言底层基础知识

2019-07-16 10:57:57 浏览数 (1)

这两天收集了一些基础知识, 记录下

内存管理

通常使用 内存对齐方式 (8 字节、16 字节、32 字节),

有的值可能只占用两个字节,但是为什么还要一次性分配8字节呢.

原因是为了内存的可复用性, 产生更少的内存碎片.

new(9) 大于8, 将会使用16字节内存。

但是仔细想想, 8字节 16字节等等过于零散,可以再对内存进行归类组织, 就使用到了 页 的概念。

垃圾回收

1. 引用计数

每个对象拥有一个ref属性,标记引用的次数。

缺点

有可能造成循环引用,内存无法释放

增一减一 各种环境下要求准确记录, 如果出现不正确计数, 将会引发严重问题

优点

速度快

补偿措施

单独gc算法定期扫描引用链表,进行释放

2. 标记清理

最典型为三色标记法(golang)

3. 代龄

根据对象的生命周期, 标记为 0 1 2 三级代龄, 具体参考 java、C#

进程、线程、协程

1. 进程

操作系统分配存储资源的最小单元

2. 线程

程序执行时的最小单位,它是进程的一个执行流,是CPU调度和分派的基本单位(所以一个进程最少一个线程)

3. 协程

在用户空间实现多任务的调度而多任务调度是发生在一个线程上的,我们把这种机制称之为协程, 因为在一个线程上,协程的本质是串行的。

上下文切换

cpu进程的切换最消耗性能了, 因为整个进程都得保存现场或者恢复现场

线程的切换因为同进程内共享地址空间, 切换相比进程开销要小得多

core文件gdb调试

软件崩溃后会产生core文件, 默认linux没有开启

代码语言:javascript复制
ulimit -a

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
file size               (blocks, -f) unlimited
max locked memory       (kbytes, -l) unlimited
max memory size         (kbytes, -m) unlimited
open files                      (-n) 32768
pipe size            (512 bytes, -p) 1
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1418
virtual memory          (kbytes, -v) unlimited

开启命令:

代码语言:javascript复制
ulimit -c unlimited  #unlimited表示不限制大小

如果想要永久生效,可以“ulimit -c unlimited”这一行加到 /etc/profile 文件中去,放到这个文件最后一行即可。

0 人点赞