Android 进程 线程分析
通过对进程的线程分析能直观看到相关信息,帮助优化APP或者服务提供参考
Android线程号规则:主线程与进程号一致(首个线程(主线程)的tid会继承父进程的pid,因此主线程的tid与进程pid相同)。子线程创建时由内核动态分配,无固定规则,但通常按创建顺序递增,线程终止后,其tid可能被回收并重新分配给新线程,线程的tid由内核通过gettid()系统调用分配,是真正的硬件线程标识。
进程线程查看:ps -T -p pid,如下:
msm8953_64:/ # ps -A| grep vold
root 427 1 285392 4668 binder_ioctl 0 S vold
msm8953_64:/ # ps -T -p 427
USER PID TID PPID VSZ RSS WCHAN ADDR S CMD
root 427 427 1 285392 4668 binder_io+ 0 S Binder:427_2
root 427 434 1 285392 4668 binder_io+ 0 S Binder:427_1
root 427 435 1 285392 4668 poll_sche+ 0 S Binder:427_2
root 427 436 1 285392 4668 binder_io+ 0 S Binder:427_3
root 427 908 1 285392 4668 binder_io+ 0 S Binder:427_4
root 427 1675 1 285392 4668 binder_io+ 0 S Binder:427_5
root 427 2636 1 285392 4668 binder_io+ 0 S Binder:427_6
root 427 2638 1 285392 4668 binder_io+ 0 S Binder:427_7
root 427 2640 1 285392 4668 binder_io+ 0 S Binder:427_8
root 427 2642 1 285392 4668 binder_io+ 0 S Binder:427_9
root 427 2645 1 285392 4668 binder_io+ 0 S Binder:427_A
root 427 3044 1 285392 4668 binder_io+ 0 S Binder:427_B
msm8953_64:/ #
Linux内核线程状态(WCHAN字段)介绍:
| WCHAN | 介绍 | 应用 |
|---|---|---|
SyS_epoll+ | 线程正在执行epoll_wait系统调用,监听文件描述符的I/O事件 | 主线程等待消息队列事件或网络框架(如OkHttp)的I/O操作 |
futex_wai+ | 线程因Futex机制挂起,等待用户态锁释放 | futex(FUTEX_WAIT)系统调用,常见于线程竞争同步资源时 |
wait_woken | 线程在内核态等待被唤醒,通常与Futex或事件通知机制相关 | wake_up()调用前线程的中间状态,多见于条件变量唤醒流程 |
unix_stre+ | 阻塞在Unix域套接字(AF_UNIX)的数据读写操作 | 跨进程通信(如Binder驱动通信的辅助通道) |
poll_sche+ | 通过poll()或select()系统调用等待文件描述符就绪 | 相比epoll,poll更适用于少量fd的跨平台场景 |
binder_io+ | 线程在Binder驱动中等待跨进程调用(IPC)的I/O完成 | 进程间通讯 |
do_sigtim+ | 处理信号定时器(如SIGALRM),常见于定时任务或线程中断 | timer_create()或setitimer()触发的信号处理流程 |
__skb_wai+ | 网络协议栈线程等待sk_buff资源(如内存分配或数据填充) | 常见于TCP/IP数据包处理流程 |
inotify_wait | 等待文件系统事件通知 | |
sched_yield | 主动让出CPU(非阻塞等待) |
1486

被折叠的 条评论
为什么被折叠?



