undefined

下来多看看–研究一下 /pro/meminfo

https://toutiao.io/posts/n4hzg1/preview

MemTotal

系统从加电开始到引导完成,firmware/BIOS要保留一些内存,kernel本身要占用一些内存,最后剩下可供kernel支配的内存就是MemTotal。这个值在系统运行期间一般是固定不变的。可参阅解读DMESG中的内存初始化信息

MemFree

表示系统尚未使用的内存。(MemTotal-MemFree)就是已被用掉的内存。

MemAvailable

有些应用程序会根据系统的可用内存大小自动调整内存申请的多少,所以需要一个记录当前可用内存数量的统计值,MemFree并不适用,因为MemFree不能代表全部可用的内存,系统中有些内存虽然已被使用但是可以回收的,比如cache/buffer、slab都有一部分可以回收,所以这部分可回收的内存加上MemFree才是系统可用的内存,即MemAvailable。/proc/meminfo中的MemAvailable是内核使用特定的算法估算出来的,要注意这是一个估计值,并不精确。

下来一定好好看看上面的链接,很多好的东西。

查看更多

undefined

linux下二进制文件分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
1. file
分析文件的基本格式
2. ldd
查看二进制文件的动态链接库信息
3. nm
可以列出二进制文件的动态库、静态库中的符号信息,包括符号的类型、符号的名称,比如函数名,全局变量等
nm -a | grep xxx
nm -D 查看动态库符号信息
4. strings
查看二进制文件的字符串信息。strings会把任何可打印字符串都显示出来,比nm的内容更多
5. objdump
将二进制代码转为汇编指令
如果程序是以 -g -o0 等调试不优化的情况下,用 objdump -S 指令可以尽可能还原源代码信息,其实也可以理解这些信息是完整的在可执行文件中,要不然gdb调试的时候无法单步追踪
6. readelf
读取ELF文件格式。通过file文件可以查看文件格式。使用readelf指令可以方便分析ELF文件结构,比如节信息,elf头文件信息
7. ltrace
跟踪进程调用库函数过程
可以查看程序执行的时候调用库函数信息,还可以在线查看执行的进程的库函数调用情况
ltrace -T 查看调用时间开销
ltrace -t/-tt/-ttt 查看调用绝对时间,t越多越精确
ltrace -S 查看系统调用信息
8. strace
strace 和 ltrace 命令差不多,strace 更偏向系统调用的追踪或信息产生的情况
可以指定系统调用的类型
-e trace=set
只跟踪指定的系统 调用.例如:-e trace=open,close,rean,write表示只跟踪这四个系统调用.默认的为set=all.
-e trace=file
只跟踪有关文件操作的系统调用.
-e trace=process
只跟踪有关进程控制的系统调用.
-e trace=network
跟踪与网络有关的所有系统调用.
-e strace=signal
跟踪所有与系统信号有关的 系统调用
-e trace=ipc
跟踪所有与进程通讯有关的系统调用
-e abbrev=set
设定 strace输出的系统调用的结果集.-v 等与 abbrev=none.默认为abbrev=all.
-e raw=set
将指 定的系统调用的参数以十六进制显示.
-e signal=set
指定跟踪的系统信号.默认为all.如 signal=!SIGIO(或者signal=!io),表示不跟踪SIGIO信号.
-e read=set
输出从指定文件中读出 的数据.例如:
-e read=3,5
-e write=set
9. gdb
调试

undefined

互斥锁和条件变量的不同

1. 互斥锁

互斥量(mutex)从本质上说是一把锁,在访问共享资源前对互斥量进行加锁,在访问完成后释放互斥量上的锁。对互斥量进行加锁以后,任何其他试图再次对互斥锁加锁的线程将会阻塞直到当前线程释放该互斥锁。如果释放互斥锁时有多个线程阻塞,所有在该互斥锁上的阻塞线程都会变成可运行状态,第一个变为运行状态的线程可以对互斥锁加锁,其他线程将会看到互斥锁依然被锁住,只能回去再次等待它重新变为可用。

2. 条件变量

条件变量(cond)是在多线程程序中用来实现”等待–》唤醒”逻辑常用的方法。条件变量利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待”条件变量的条件成立”而挂起;另一个线程使“条件成立”。为了防止竞争,条件变量的使用总是和一个互斥锁结合在一起。线程在改变条件状态前必须首先锁住互斥量,函数pthread_cond_wait把自己放到等待条件的线程列表上,然后对互斥锁解锁(这两个操作是原子操作)。在函数返回时,互斥量再次被锁住。

区别

互斥锁理论上只是一把锁,用于多个线程对同一个资源竞争时防止出现错误而存在的
条件变量则是为了多个线程之间的通信,保证访问的先后顺序而存在的

注意

在使用条件变量的时候,pthread_cond_signal、pthread_cond_wait等操作可能需要加锁。要保证在线程不可知谁先执行的情况保证其先后顺序。

查看更多

undefined

内存泄露和内存溢出

一、概念

内存泄露(memory leak):程序在申请内存后,没有释放已申请的内存空间

内存溢出(out of memory):程序运行过程中申请的内存大于系统能够提供的内存,导致无法申请到足够的内存

两者之间的关系:内存泄露的堆积最终会导致内存溢出

二、内存泄露的分类(以发生方式分类)

  1. 常发性内存泄露。发生内存泄漏的代码会被多次执行到,每次被执行的时候都会导致一块内存泄漏。
查看更多

undefined

创建文件时,文件权限的设置

1
2
3
4
umask 用来设置新文件权限的掩码。当问文件被创建时,其最初的权限由文件创建掩码决定。
关系为 mode & ~umask
umask 命令可以查看当前系统的 umask 值
在代码中使用 umask(0000); 设置之后,并不会改变系统的 umask 值,只会临时改变 umask 值。

undefined

学习操作系统(一)

完成了操作系统引论的学习

操作系统.png

%E5%AE%8C%E6%88%90%E4%BA%86%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%BC%95%E8%AE%BA%E7%9A%84%E5%AD%A6%E4%B9%A0%0A%0A!%5B90594a261305c6cd3efdb1241957d883.png%5D(en-resource%3A%2F%2Fdatabase%2F676%3A0)%0A