![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
linux
文章平均质量分 69
kdb_viewer
这个作者很懒,什么都没留下…
展开
-
linux库打桩
库打桩用于截获对共享库函数的调用,提供一个和库函数原型一致的桩函数,可以替换对原函数的调用,是性能分析工具使用的常见手段。打桩可以发生在编译时、链接时、运行时,这里以malloc为例展现桩函数的应用1、编译时打桩// main.c#include <stdlib.h>#include <stdio.h>#include <malloc.h>int main() { int *p = malloc(32); // 这里被打桩,调用mymall原创 2021-06-15 20:05:20 · 867 阅读 · 0 评论 -
缓存行和伪共享
cpu使用缓存以提升读取数据速度,缓存使用缓存行的形式,每次从主存load64字节到缓存。在多核架构中, 会发生一种伪共享的情况,原因是,每个cpu缓存自己的数据,cpu0对long i进行操作,缓存了i和i附近共计64字节数据;cpu1对long j进行操作,缓存了j和j附近共计64字节的数据。若i和j相邻,那么两个cpu缓存的就是主存中相同的一段64字节的内存数据。此时若cpu0对i的操作是写...原创 2019-11-07 14:58:26 · 452 阅读 · 0 评论 -
linux观察cpu常用命令
1、uptimecpu最近1、5、15分钟的负载,是百分比,如下2、vmstatvmstat显示内存、I/O、cpu等信息,通过每秒执行一个观察cpu利用率变化可以发现问题趋势,如下:us:用户态cpu时间sy:内核态cpu时间id:空闲时间wa:等待I/O时间st:虚拟机偷取cpu时间3、mpstat查看单个cpu时间,如下:mpstat ...原创 2019-11-05 15:23:40 · 475 阅读 · 0 评论 -
linux内存观察常用命令汇总
1、vmstat看系统总体内存情况,包括物理内存、虚拟内存、换页等情况vmstat 1 10:每1秒采样一次输出,持续10次vmstat -d:看磁盘情况vmstat -m:看内存详细情况,包括slab每个2的幂分配了多少个vmstat -S m:系统内存大的时候无法对齐, 按照MB显示可以对齐vmstat基本信息的解释:进程相关:r:当前在内核运行队列上的ta...原创 2019-11-05 14:28:13 · 484 阅读 · 0 评论 -
tcp几种常见异常出现情况总结
1.三次握手后连接成功建立,client发送RST到server,此时server阻塞在accept或者即将调用accept,accept会返回成功,得到一个sockfd,对此sockfd的read会导致一个connect reset by peer错误,注意此时tcp连接的终止不需要4次挥手,不会有TIME_WAIT状态。client端发送RST代码如下:struct linger s...原创 2019-10-25 11:01:35 · 2531 阅读 · 0 评论 -
pthread_cleanup_push注册清理函数中解锁导致的时间窗口问题
可以向其他线程发送pthread_cancel(threadid) ,让线程id为threadid的另一个线程取消,若threadid这个线程中使用了mutex,在lock和unlock期间收到了其他线程发来的取消要求,那么这个mutex没人解锁,造成死锁,解决这个问题的方案是注册线程清理函数,在清理函数中释放资源(解锁),但这样会造成一个时间窗口导致的额外加锁或者额外解锁,如下:pthre...原创 2019-10-16 18:23:55 · 177 阅读 · 0 评论 -
利用gdb调试线程验证多线程并发问题
一个经典问题,两个线程,都执行变量自增操作,由于实现是先将变量读到寄存器自增后再写回内存,不是一个汇编指令,导致存在窗口期,最后结果取决于执行顺序,变量的值可能多1或者多2,验证代码如下:int a;void func() {}void* thread_func1(void* arg) { func(); a++;}void* thread_func2(voi...原创 2019-10-12 18:53:46 · 1240 阅读 · 0 评论 -
linux 网络通信地址查询api
#include <netdb.h>struct hostent* gethostent(void);作用:返回本机主机信息。该函数读取/etc/hosts,逐行返回此文件中内容,即多次调用每次返回不同值,不可重入,示例:struct hostent* p;p = gethostent();while (p) { printf("%s\n", p->h_...原创 2019-10-10 20:13:37 · 179 阅读 · 0 评论 -
use of cast expressions as lvalues is deprecated
gcc编译warning:use of cast expressions as lvalues is deprecated,不建议将强转表达式作为左值,初衷是防止类型不一致导致解析非预期的类型,后续使用引发问题,如下void func() { void (*p)(void); void *j; (void*)p = j;}此时会报编译warning,此warn...原创 2019-09-27 15:34:45 · 226 阅读 · 0 评论 -
shell管道前后多个进程和进程组的关系
shell可以通过管道符将前一个进程的标准输出重定向到后一个进程的标准输入。用如下程序观察管道前后进程的父进程和进程组:void func() { printf("pid is %d\n", getpid()); printf("ppid is %d\n", getppid()); printf("group id is %d\n", getpgid(0));}...原创 2019-08-27 14:29:49 · 602 阅读 · 1 评论 -
linux常用命令词典
basename:获取文件名cat: -A:显示特殊字符 -n:行号,空白行也会带上cd: -:回到上一个目录 ~:回到自己的主文件夹chattr: -i:文件不可修改不可删除 -a:文件只能用append的方式追加内容,不能修改,也不能删除文件cp: -a:完全复制,包含文件上次修改时间也不会更新 -l:硬链接 -...原创 2019-08-19 19:30:07 · 428 阅读 · 0 评论 -
内核态进程管理
进程是处于执行期的程序,除了可执行代码,还包含其他资源,如打开的文件、挂起的信号、寄存器、内存地址空间、一个或者多个执行线程。linux内核不区分进程和线程,统一为task,task就是内核调度的对象。fork():通过复制一个现有进程来创建一个全新的进程,fork()返回两次,一次回到父进程,一次回到子进程exit():终结进程并释放资源wait4():父进程调用这个系统调用查询子进...原创 2018-10-30 23:47:37 · 1012 阅读 · 0 评论 -
linux有名管道
有名管道支持无亲缘关系的进程之间通信,缺陷是只支持单机(socket扩展性好),一般用于c++后台进程和C守护进程之间通信。管道是内核维护的缓冲区,可以认为是文件机制,维护文件读写而不是socket。一个管道对应一个文件,管道名对两端的进程透明,是CS模式,服务器端负责维护和监听管道,客户端负责写入管道。管道一般支持单次通信的最大字节数是4096字节,可以用ulimit -a命令查看,如下:[...原创 2018-09-13 14:25:49 · 1738 阅读 · 0 评论 -
linux静态链接库、动态链接库
程序设计思路是,功能接口提供在.h文件中,源代码在.c文件中,应用程序通过包含头文件调用功能api。一个简易的模型如下:有三个文件:src.h,src.c,main.c,src.h中提供接口声明,src.c中包含源代码实现,main.c是调用接口的模块,内容如下:src.h:#ifndef _SRC_H#define _SRC_Hvoid print();#endifs...原创 2018-08-24 15:16:16 · 146 阅读 · 0 评论 -
gdb调试方法
1.configure时需要开启debug开关,因服务而异,如下./configure --help | grep debug --enable-debug create a debug-only version of the software (default即./configure --enable-debug2.编译打包,一般是make,make insta...原创 2018-08-22 10:25:39 · 257 阅读 · 0 评论 -
映射windows网络驱动器
1.安装samba服务命令:yum -y install sabma2.修改配置文件路径:/etc/samba/smb.conf内容:[root@localhost home]# cat /etc/samba/smb.conf<pre name="code" class="plain">#=========Golbal Settings ======[glob...原创 2018-07-21 12:02:46 · 2401 阅读 · 0 评论 -
linux open命令
open命令用于打开文件,使用时需要引用头文件<fcntl.h>,若失败,返回-1,否则返回正整数,0是标准输入流,1是标准输出流,2是标准错误流,其他文件从3开始递增。函数定义如下__extern_always_inline intopen (__const char *__path, int __oflag, ...){ if (__va_arg_pack_len () &...原创 2018-05-24 20:27:33 · 14098 阅读 · 0 评论