Kernel space lock contention配置及其使用

13 篇文章 4 订阅
订阅专栏
5 篇文章 0 订阅
订阅专栏
3 篇文章 2 订阅
订阅专栏
概述

本文涉及到的内容如下:

  1. kernel lock相关debug方式,比如lock耗时,拿不到lock,lock依赖等等
  2. trace的使用
1.开启lock contenttion涉及到的config配置
config LOCKDEP  
        bool  
        depends on DEBUG_KERNEL && TRACE_IRQFLAGS_SUPPORT && STACKTRACE_SUPPORT && LOCKDEP_SUPPORT  
        select STACKTRACE  
        select FRAME_POINTER if !MIPS && !PPC && !ARM_UNWIND && !S390 && !MICROBLAZE && !ARC && !SCORE && !X86  
        select KALLSYMS  
        select KALLSYMS_ALL  
  
config LOCKDEP_SMALL  
        bool  
  
config LOCK_STAT  
        bool "Lock usage statistics"  
        depends on DEBUG_KERNEL && TRACE_IRQFLAGS_SUPPORT && STACKTRACE_SUPPORT && LOCKDEP_SUPPORT  
        select LOCKDEP  
        select DEBUG_SPINLOCK  
        select DEBUG_MUTEXES  
        select DEBUG_RT_MUTEXES if RT_MUTEXES  
        select DEBUG_LOCK_ALLOC  
        default n  
        help  
         This feature enables tracking lock contention points  
  
         For more details, see Documentation/locking/lockstat.txt  
  
         This also enables lock events required by "perf lock",  
         subcommand of perf.  
         If you want to use "perf lock", you also need to turn on  
         CONFIG_EVENT_TRACING.  
  
         CONFIG_LOCK_STAT defines "contended" and "acquired" lock events.  
         (CONFIG_LOCKDEP defines "acquire" and "release" events.)  

上面的config默认是关闭状态。

2 menuconfig开启config配置

kernel hacking —> Lock Debugging (spinlock, mutexs, etc…) —>进入之后勾选
Lock Debugging: detect incorrect freeing of live locks 和Lcok usage statistics,就会把依赖项自动勾选.
在这里插入图片描述

保存退出之后,可以查看kernel下面新产生的config diff文件:

# Lock Debugging (spinlocks, mutexes, etc...)  
 #  
-# CONFIG_DEBUG_RT_MUTEXES is not set  
-# CONFIG_DEBUG_SPINLOCK is not set  
-# CONFIG_DEBUG_MUTEXES is not set  
+CONFIG_DEBUG_RT_MUTEXES=y  
+CONFIG_DEBUG_SPINLOCK=y  
+CONFIG_DEBUG_MUTEXES=y  
 # CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set  
-# CONFIG_DEBUG_LOCK_ALLOC is not set  
+CONFIG_DEBUG_LOCK_ALLOC=y  
 # CONFIG_PROVE_LOCKING is not set  
-# CONFIG_LOCK_STAT is not set  
+CONFIG_LOCKDEP=y  
+CONFIG_LOCK_STAT=y  
+# CONFIG_DEBUG_LOCKDEP is not set  
 # CONFIG_DEBUG_ATOMIC_SLEEP is not set  
 # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set  
 # CONFIG_LOCK_TORTURE_TEST is not set  

这样开启lock trace event了.。编译boot并刷机即可!

3 确定是否开启trace lock content feature

上面步骤二中开启之后,在adb shell里面多了如下几个接口:

  1. 增加了lock trace event, 有四个lock trace event,具体做什么使用,下面在详细讲解
    在这里插入图片描述
  2. 增加了lock的统计信息, 节点信息实现源码kernel/locking/lockdep_proc.c文件中:
    ● lock_stat: 统计各种类型lock的时延
    ● lockdep: 表示锁的的深度,即一个lock里面调用了多少个lock,并将这些lock的调用全部显示出来
    ● lockdep_stats: 即锁深度里面包含了哪些lock以及频次
    ● locks:锁的状态,这个实现在fs/locks.c文件里面

在这里插入图片描述

4 如何使用lock trace event和proc node信息
4.1 lock trace event

从第三部分可以知道,lock trace event包含四个event,分别讲解如下:
四个event定义在include/trace/event/lock.h里面, 使用在kernel/locking/lockdep.c文件,

  1. lock_acquire: 获取lock,比如mutex lock ,rcu read lock 或者spinlock等等lock
  2. lock_acquired: 表示已经获取lock了
  3. lock_release: lock释放的event
  4. lock_contended: lock被谁hold了

那么如何抓取lock相关的trace event呢?
可以使用下面的脚本抓取(必须添加lock event ),即正常的抓取trace 命令:

echo 40000 > buffer_size_kb && echo irq sched_switch sched_wakeup sched_waking cpu_frequency cpu_idle lock > set_event && cat set_event && echo > trace  && echo 1 > tracing_on && sleep 10 && echo 0 > tracing_on && cat trace > /data/trace.txt   

脚本执行完毕之后, pull出data目录下的trace.txt文件,vim打开即可看到下面类似的信息:

┊   ┊  sleep-2875  [004] d.s2   748.861607: sched_waking: comm=rcu_sched pid=9 prio=120 target_cpu=000  
┊   ┊  sleep-2875  [004] d.s3   748.861608: lock_acquire: 00000000d4eff177 &rq->lock  
┊   ┊  sleep-2875  [004] d.s3   748.861609: lock_contended: 00000000d4eff177 &rq->lock  
┊   ┊  sleep-2875  [004] d.s3   748.861662: lock_acquired: 00000000d4eff177 &rq->lock  
┊   ┊  sleep-2875  [004] d.s3   748.861663: lock_acquire: 000000000ff04d65 read tk_core.seq  
┊   ┊  sleep-2875  [004] d.s3   748.861664: lock_release: 000000000ff04d65 tk_core.seq  
┊   ┊  sleep-2875  [004] d.s3   748.861666: lock_acquire: 00000000cc726398 read rcu_read_lock  
┊   ┊  sleep-2875  [004] d.s3   748.861667: lock_release: 00000000cc726398 rcu_read_lock  
┊   ┊  sleep-2875  [004] d.s3   748.861668: lock_release: 00000000d4eff177 &rq->lock  
┊   ┊  sleep-2875  [004] d.s2   748.861669: lock_acquire: 00000000cc726398 read rcu_read_lock  
┊   ┊  sleep-2875  [004] d.s2   748.861670: lock_acquire: 00000000cc726398 read rcu_read_lock  
┊   ┊  sleep-2875  [004] d.s2   748.861671: lock_release: 00000000cc726398 rcu_read_lock  
┊   ┊  sleep-2875  [004] d.s2   748.861672: lock_acquire: 00000000cc726398 read rcu_read_lock  
┊   ┊  sleep-2875  [004] d.s2   748.861673: lock_release: 00000000cc726398 rcu_read_lock  
┊   ┊  sleep-2875  [004] d.s2   748.861674: lock_acquire: 00000000cc726398 read rcu_read_lock  
┊   ┊  sleep-2875  [004] d.s2   748.861675: lock_release: 00000000cc726398 rcu_read_lock  
┊   ┊  sleep-2875  [004] d.s2   748.861676: lock_acquire: 00000000cc726398 read rcu_read_lock  
┊   ┊  sleep-2875  [004] d.s2   748.861677: lock_release: 00000000cc726398 rcu_read_lock  
┊   ┊  sleep-2875  [004] d.s2   748.861678: lock_acquire: 00000000cc726398 read rcu_read_lock  
┊   ┊  sleep-2875  [004] d.s2   748.861679: lock_release: 00000000cc726398 rcu_read_lock  
┊   ┊  sleep-2875  [004] d.s2   748.861683: lock_release: 00000000cc726398 rcu_read_lock  
┊   ┊  sleep-2875  [004] d.s3   748.861684: lock_acquire: 00000000d4eff177 &rq->lock  
┊   ┊  sleep-2875  [004] d.s3   748.861685: lock_contended: 00000000d4eff177 &rq->lock  
┊   ┊  sleep-2875  [004] d.s3   748.861719: lock_acquired: 00000000d4eff177 &rq->lock  
┊   ┊  sleep-2875  [004] d.s4   748.861720: lock_acquire: 00000000cc2f375c &rq->lock  
┊   ┊  sleep-2875  [004] d.s4   748.861720: lock_acquired: 00000000cc2f375c &rq->lock  
┊   ┊  sleep-2875  [004] d.s4   748.861721: lock_acquire: 000000000ff04d65 read tk_core.seq  
┊   ┊  sleep-2875  [004] d.s4   748.861722: lock_release: 000000000ff04d65 tk_core.seq  
┊   ┊  sleep-2875  [004] d.s4   748.861724: lock_acquire: 00000000cc726398 read rcu_read_lock  
┊   ┊  sleep-2875  [004] d.s4   748.861725: lock_release: 00000000cc726398 rcu_read_lock  
┊   ┊  sleep-2875  [004] d.s4   748.861726: lock_acquire: 00000000cc726398 read rcu_read_lock  
┊   ┊  sleep-2875  [004] d.s4   748.861727: lock_release: 00000000cc726398 rcu_read_lock  
┊   ┊  sleep-2875  [004] d.s4   748.861728: lock_release: 00000000d4eff177 &rq->lock  
┊   ┊  sleep-2875  [004] d.s3   748.861730: lock_release: 00000000cc2f375c &rq->lock  

我们可以看到如下的信息:

  1. rcu_read_lock 是lock_acquire 之后直接lock_release. 持锁时间非常的短
  2. &rq->lock, 是一个spinlock类型. 通过lock_acquire→ lock_acquired→ lock_release的过程. 在lock_acquire过程中出现了lock_contended trace event, 表示此时的&rq->lock spinlock这个lock存在contention或者contended,表示此时有lock的竞争.
  3. 如果出现锁竞争,就会统计当前进程获取lock的等待时间等等统计信息,详细在4.2节讲解.
  4. 可以明显的看到持锁时间, 或者获取锁的时间.
4.2 lock proc node信息

有三个主要的节点信息,都在shell proc目录下:

cat /proc/lock_stat:

/proc # cat lock_stat | head -n 40                                                                                                                                                                 
lock_stat version 0.4  
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------  
                              class name    con-bounces    contentions   waittime-min   waittime-max waittime-total   waittime-avg    acq-bounces   acquisitions   holdtime-min   holdtime-max holdtime-total   holdtime-avg  
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------  
  
                 &(&n->list_lock)->rlock:        441821         441946           1.81          80.23     1891806.60           4.28        2488861       10314115           0.00         137.08    64789787.05           6.28  
                 -----------------------  
                 &(&n->list_lock)->rlock         114751          [<0000000051f28fcf>] ___slab_alloc+0x194/0x5ec  
                 &(&n->list_lock)->rlock         105155          [<000000000913f330>] deactivate_slab+0x2ec/0x540  
                 &(&n->list_lock)->rlock         169288          [<00000000fb58074e>] free_debug_processing+0x34/0x26c  
                 &(&n->list_lock)->rlock          12316          [<00000000f00be1d8>] kfree+0x30c/0x55c  
                 -----------------------  
                 &(&n->list_lock)->rlock         111558          [<0000000051f28fcf>] ___slab_alloc+0x194/0x5ec  
                 &(&n->list_lock)->rlock          89847          [<000000000913f330>] deactivate_slab+0x2ec/0x540  
                 &(&n->list_lock)->rlock         192366          [<00000000fb58074e>] free_debug_processing+0x34/0x26c  
                 &(&n->list_lock)->rlock          12305          [<00000000f00be1d8>] kfree+0x30c/0x55c  
  
.............................................................................................................................................................................................................................  
  
                               &rq->lock:        351895         351959           1.88         564.00     9605797.10          27.29        1569868        5892437           0.00        1061.00   172708414.01          29.31  
                               ---------  
                               &rq->lock           5739          [<00000000807dcaa6>] task_rq_lock+0x74/0xc4  
                               &rq->lock           7268          [<00000000f033900c>] pick_next_task_fair+0x378/0x7e4  
                               &rq->lock          85000          [<0000000043e94103>] try_to_wake_up+0x1bc/0x554  
                               &rq->lock          46881          [<0000000078183a31>] try_to_wake_up+0x3b8/0x554  
                               ---------  
                               &rq->lock          24883          [<00000000f57857d0>] update_blocked_averages+0x50/0xc44  
                               &rq->lock           3577          [<00000000807dcaa6>] task_rq_lock+0x74/0xc4  
                               &rq->lock          14525          [<00000000f033900c>] pick_next_task_fair+0x378/0x7e4  
                               &rq->lock              5          [<0000000007411a3e>] walt_set_window_start+0xd4/0x134  
  
.............................................................................................................................................................................................................................  
  
                 &sg_policy->update_lock:        259980         259986           1.88         212.12     1681170.67           6.47        1729740        3292457           1.88         270.81    28368055.35           8.62  
                 -----------------------  
                 &sg_policy->update_lock         259986          [<00000000077def88>] sugov_update_shared+0x5c/0x1b0  
                 -----------------------  
                 &sg_policy->update_lock         259986          [<00000000077def88>] sugov_update_shared+0x5c/0x1b0  
  
.............................................................................................................................................................................................................................  

上面表示从开机到现在cat这个节点的时间内,lock的所有状态信息,包括

  1. lock的名字
  2. contention次数
  3. lock等待的时间,最大时间,最小时间,平均时间以及等待的总时间
  4. lock持有时间,最大,最小,平均以及持有的总时间
  5. 获取这个lock的次数
    等等…

cat /proc/lockdep:

目的是将class_lock上面所有相关联的lock stack全部输出
可能的样式如下:

/proc # cat lockdep | head -n 100                                                                                                                                                              
all lock classes:  
0000000044beef8b ....: logbuf_lock  
  
00000000c80448bf ....: (console_sem).lock  
  
00000000700ad619 ....: console_lock  
  
00000000ef505732 ....: cgroup_mutex  
  
0000000042291e92 ....: console_owner_lock  
  
000000002e29cf8c ....: console_owner  
  
000000004e6f50fd ....: devtree_lock  
  
000000003c9defa6 ....: resource_lock  
  
00000000947b85f2 ....: pm_mutex  
  
0000000010004418 ....: primary_crng.lock  
  
0000000020d31ff4 ....: input_pool.lock  
  
00000000588a9d5b ....: "warn_unseeded_randomness".lock  
  
00000000e13be140 ....: lock  
  
0000000005822fb5 ....: cpu_hotplug_lock.rw_sem  
  
00000000b0cf55a3 ....: cpuhp_state_mutex  

cat /proc/lockdep_stats:

信息如下,主要是一些上下文里面的信息:

/proc # cat lockdep_stats                                                                                                                                                                          
 lock-classes:                         1851 [max: 8191]  
 direct dependencies:                     0 [max: 32768]  
 indirect dependencies:                   0  
 all direct dependencies:                 0  
 in-hardirq chains:                       0  
 in-softirq chains:                       0  
 in-process chains:                       0  
 stack-trace entries:                 20581 [max: 524288]  
 combined max dependencies:               1  
 hardirq-safe locks:                      0  
 hardirq-unsafe locks:                    0  
 softirq-safe locks:                      0  
 softirq-unsafe locks:                    0  
 irq-safe locks:                          0  
 irq-unsafe locks:                        0  
 hardirq-read-safe locks:                 0  
 hardirq-read-unsafe locks:               0  
 softirq-read-safe locks:                 0  
 softirq-read-unsafe locks:               0  
 irq-read-safe locks:                     0  
 irq-read-unsafe locks:                   0  
 uncategorized locks:                  1851  
 unused locks:                            0  
 max locking depth:                      19  
 debug_locks:                             1  

lock event信息还是对于lock debug还是非常有帮助的。
实战在另一篇博文: pr_emerg耗时,影响性能原理排查

Linux: rcu stall
mzhan017的博客
02-06 1768
这一篇不完整,需要细看,牵涉的东西还是很多。
临界区、锁竞争(Lock Contention)、锁护送(Lock Convoys)简单分析 盛大创新院 刘刚
mfc_boy的专栏
11-10 5253
临界区是一种防止多个线程同时执行一个特定代码节的机制,window临界区是一种轻量级机制,在某一时间内只允许一个线程执行某个给定代码段。   通常在修改全局数据(如集合类)时会使用临界区。事件、多用户终端执行程序和信号量也用于多线程同步,但临界区与它们不同,它并不总是执行向内
oracle死锁优化,Oracle性能优化之LockContention(转)
weixin_28864249的博客
04-14 262
1、概念DML事务使用row-level locks,查询不会锁定数据。锁有两种模式:exlusive、share。锁的类型:• DML or data locks:– Table-level locks(TM)– Row-level locks(TX)• DDL or dictionary locks一个transaction至少获得两个锁:一个共享的表锁,一个专有的行锁。Oracle serv...
Oracle性能优化之LockContention(转)
congfei8606的博客
05-06 91
1、概念  DML事务使用row-level locks,查询不会锁定数据。锁有两种模式:exlusive、share。  锁的类型:  • DML or data locks:  – Table-level locks(TM)...
Lockdep定位linux驱动死锁的bug
放狼的爷们
08-22 3983
死锁一般比较难定位。 lockdep 死锁检测模块 介绍了最简单的 ABBA 死锁的形成,回到正题,回到 kernel, 里面有千千万万锁,错综复杂,也不可能要求所有开发人员熟悉 spin_lock, spin_lock_irq, spin_lock_irqsave, spin_lock_nested 的区别。所以,在锁死发生前,还是要做好预防胜于治疗,防患于未然的工作,尽量提前发现并
Linux内核死锁检测工具——Lockdep
嵌入式Linux充电站
12-25 2176
Linux内核在2006年引入了死锁调试模块`lockdep`,`lockdep`会跟踪每个锁的自身状态和各个锁之间的依赖关系,经过一系列的验证规则来确保锁之间依赖关系是正确。
linux内核系统配置文件,Linux内核模块配置文件
weixin_34450486的博客
04-29 1088
/boot/configure-*为当前Linux内核的模块配置文件,即在当前Linux内核中,系统已启用了哪些模块,哪些内容已编译到Linux内核等等,都可以通过此文件来查看。例如,查看当前Linux内核是否支持NTFS文件系统,可使用以下命令:[root@akira]# cat /boot/config-2.6.18-8.el5|grep -i ntfs# CONFIG_NTFS_FS is ...
samba配置
qq2007xia的专栏
08-26 6308
1. samba配置项    通过当前所使用系统查看samba的global全部配置项如下(其中比较有意义的项会简单说明): ------------------------------------------------------------------------ [global]    dos charset = CP850    unix charset = UTF-8  
Linux Kernel Memory Management (2)
Harold Wang Column
05-10 3066
Author: Harold Wang http://blog.csdn.net/hero7935 1.Slab Allocator Three Layer architecture: --Cache --Slab --Object 1.1 Caches General cache --kmem_cache_init() and kmem_cache_sizes_init() to establish general cache when system
【zephyr】PM 电源管理
xiaohua0877的专栏
04-06 1072
1. CONFIG配置总开关 CONFIG_SYS_POWER_MANAGEMENT=y CONFIG_DEVICE_POWER_MANAGEMENT=y CONFIG_DEVICE_IDLE_PM=y 2.设备注册API接口 设备 /** * @brief Device PM info * * @param dev pointer to device structure *...
Linux社区对他的采访神奇小子Robert Love-2
tianyu的专栏 - Linux site:blog.csdn.net/wishfly
01-21 3038
KernelTraps first interview was with Robert Love in October of 2001. Since that time, his kernel preemption patch has been merged into the 2.5 development kernel and hes continued to be active on th
Linux 死锁检测模块 Lockdep 简介——转自魅族内核团队,对死锁检测认识上升到新高度
lqxandroid2012的专栏
12-21 3561
Linux 死锁检测模块 Lockdep 简介 原文地址 http://kernel.meizu.com/linux-dead-lock-detect-lockdep.html 25 July 2016 死锁概念 死锁是指多个进程(线程)因为长久等待已被其他进程占有的的资源而陷入阻塞的一种状态。当等待的资源一直得不到释放,死锁会一直持
自学linux驱动从入门到放弃(十六)内核定时器的使用
weixin_44948595的博客
02-16 3474
内核定时器是基于未来时间点的一个定时器,以当前系统节拍数“jiffies”,向后延时多长时间(转换为系统节拍数)。 1.头文件 #include <linux/timer.h> 2.timer数据结构 struct timer_list { /* * All fields that change during normal runtime grouped to the * same cacheline */ struct hlist_node entry; unsi
Linux·工作队列
m0_64560763的博客
08-24 2460
Linux·工作队列
编译linux内核net,linux内核编译(五)
weixin_39695306的博客
05-01 230
转:linux内核编译配置完后按ESC退出会提示你保存,也可以把现在的配置文件保存起来(/usr/src/linux/.config),这样下次再配置的时候就方便了。接下来是编译,输入以下命令:makemake dep(2.6内核不需要这一步,该步读取配置过程生成的配置文件,来创建对应于配置的依赖关系树)make clean(完成删除前面步骤留下的文件,以避免出现一些错误)make bzImage...
linux 内核死锁检测
最新发布
一叶知秋的博客
12-25 583
linux 内核死锁检测
Linux死锁检测-Lockdep
u014426028的博客
11-19 2432
lockdep是内核提供协助发现死锁问题的功能。 本文首先介绍何为lockdep,然后如何在内核使能lockdep,并简单分析内核lockdep相关代码。 最后构造不同死锁用例,并分析如何根据lockdep输出发现问题根源。 1. Lockdep介绍 死锁是指两个或多个进程因争夺资源而造成的互相等待的现象。 常见的死锁有如下两种: 递归死锁:中断等延迟操作中使用了锁,和外面的锁构成了递归死锁。 AB-BA死锁:多个锁因处理不当而引发死锁,多个内核路径上的所处理顺序不一致也会导致死锁。 Lin
Lock:Acquired 事件类
起风了
04-17 1214
所有事件定义均可参考官方文档: https://docs.microsoft.com/zh-cn/previous-versions/sql/sql-server-2005/ms189897(v%3dsql.90)Lock:Acquired 事件类指示已获取某个资源(例如数据页)的锁。Lock:Acquired 和 Lock:Released 事件类可以用于监视锁定对象的时间、使用的锁类型以及锁保...
linux 2.6 互斥锁的实现-源码分析
热门推荐
缘分天空
07-02 1万+
看了看linux 2.6 kernel的源码,下面结合代码来分析一下在X86体系结构下,互斥锁的实现原理。代码分析1. 首先介绍一下互斥锁所使用的数据结构:struct mutex { 引用计数器 1: 所可以利用。  小于等于0:该锁已被获取,需要等待 atomic_t  count;  自旋锁类型,保证多cpu下,对等待队列访问是安全的。 spinlock_t  wait_lock
TX - row lock contention
06-03
TX - row lock contention是指在数据库管理系统中出现多个事务同时尝试访问同一行数据并竞争该行的锁定的情况。这种情况下,每个事务都需要等待其他事务释放锁定后才能继续进行,从而导致事务处理延迟和性能下降。 为了避免TX - row lock contention,可以采取以下措施: 1. 采用合适的事务隔离级别:不同的事务隔离级别对应着不同的锁定粒度,采用适当的隔离级别可以减少竞争锁的情况。 2. 优化查询语句:减少事务访问同一行数据的情况,可以通过优化查询语句,增加索引等方式来提高查询效率,从而降低锁冲突的概率。 3. 减少锁定范围:尽可能减少事务的锁定范围,可以避免不必要的锁竞争。 4. 增加锁的粒度:增加锁的粒度可以减少锁竞争的情况,例如采用行级锁定代替表级锁定。 5. 避免长事务:长时间运行的事务会占用锁资源,导致其他事务等待,因此需要尽可能避免长事务的出现。 6. 增加硬件资源:增加CPU、内存、磁盘等硬件资源,可以提高数据库系统的性能,从而减少锁冲突的概率。
写文章

热门文章

  • C 语言printf打印各种数据类型的方法(u8/s8/u16/s16.../u64/double/float)(全) 89251
  • 使用 git 下载linux kernel源码(主线/稳定、长期演进等版本) 22129
  • linux kernel insmod模块出现的两个错误以及解决方案 14594
  • [cpufreq governor] schedutil governor解析 13094
  • linux kernel soft lockup/hard lockup简介及其解决思路 12292

分类专栏

  • linux kerne rt scheduler
  • linux deadline scheduler
  • ARM相关的一些知识 5篇
  • linux kernel cfs scheduler 13篇
  • linux kernel 并发与同步原语 3篇
  • EAS-调度器学习 13篇
  • linux kernel PPT 5篇
  • 杂谈 3篇
  • Android/linux杂学 13篇
  • git-study-pull/push code 3篇
  • debug tool 4篇
  • MTK/QCOM平台相关 1篇
  • case分析power/performace/thermal 2篇
  • C学习 2篇
  • Python学习
  • linux kernel-并发与同步 2篇
  • 个人感想

最新评论

  • Linux Kernel调度器学习路线图

    路先生的杂货铺: 有几个链接丢失了

  • linux kernel insmod模块出现的两个错误以及解决方案

    weixin_43655947: 重新关联module,清理干净重新编译 是指 clean了重新编译?重新关联是什么意思啊

  • [cpufreq governor]sched governor解析

    悟空明镜: 不做调度了,哈哈。好多调度的文章我已经设置私密了。你们看不到了表情包

  • [cpufreq governor]sched governor解析

    静待梅花开: 点赞,继续加油,为后人多留下点宝贵经验表情包

  • linux kernel insmod模块出现的两个错误以及解决方案

    悟空明镜: 需要重新编译kernel,在替换修改后的kernel,最后reboot

大家在看

  • 【深度学习】Transformer机器翻译模型,了解有关机器翻译的知识,seq2seq架构,掌握使用Transformer构建机器翻译模型的实现过程 576
  • 行列式的计算方法
  • window10/11永久关闭系统更新
  • Linux:终端(terminal)与终端管理器(agetty) 302
  • 验证二叉搜索树

最新文章

  • [big/little system scheduler]五. big.LITTLE Technology
  • Linux内核tracepoints
  • [power]四. Power State Coordination Interface电源管理通用接口
2020年16篇
2019年11篇
2018年22篇
2013年4篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家天津玻璃钢动物雕塑厂家白城主题公园玻璃钢雕塑清远玻璃钢动物雕塑批发周年庆典商场美陈批发山东玻璃钢雕塑摆件订购肇庆玻璃钢人物雕塑厂家公园摆件玻璃钢雕塑销售方法玻璃钢造型雕塑信息玻璃钢仿真水果雕塑生产江苏玻璃钢人物雕塑制作周口玻璃钢生雕塑产厂家宣城玻璃钢雕塑商家深圳玻璃钢雕塑摆件批发宿州卡通玻璃钢雕塑安装山东火烈鸟玻璃钢雕塑定制庆阳玻璃钢动物雕塑哪家好珠海校园玻璃钢雕塑制作贵阳公园玻璃钢雕塑制作园林玻璃钢卡通雕塑生产郑州标识玻璃钢卡通雕塑价格福州玻璃钢雕塑中庆雕塑艺术北京多彩玻璃钢雕塑批发玻璃钢雕塑厂家宿迁批发玻璃钢花盆厦门温州市政玻璃钢花盆批发昆山商场秋季美陈商场美陈3d金山玻璃钢雕塑推荐主题商场美陈哪家好玻璃钢园林雕塑供应商香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化