通过命令查看CPU上下文切换情况
linux系统可以通过命令统计CPU上下文切换数据
#可以看到整个操作系统每1秒CPU上下文切换的统计
其中cs列就是CPU上下文切换的统计。当然,CPU上下文切换不等价于线程切换,很多操作会造成CPU上下文切换:
- 线程、进程切换
- 系统调用
- 中断
查看某一个线程\进程的上下文切换
- 使用pidstat命令
常用的参数:
-u 默认参数,显示各个进程的 CPU 统计信息
-r 显示各个进程的内存使用情况
-d 显示各个进程的 IO 使用
-w 显示各个进程的上下文切换
-p PID 指定 PID
# 显示进程5598每一秒的切换情况
其中cswch表示主动切换,nvcswch表示被动切换。从统计数据中看到,该进程每秒主动切换次数达到将近500次,因此代码中存在大量的 睡眠\唤醒 操作。
- 从进程的状态信息中查看
通过命令 cat /proc/5598/status 查看进程的状态信息
voluntary_ctxt_switches: 40469351
nonvoluntary_ctxt_switches: 2268
这2项就是该进程从启动到当前总的上下文切换情况。
查看进程线程的方法
windows
- 任务管理器可以查看进程和线程数,也可以用来杀死进程
- tasklist 查看进程
- taskkill 杀死进程
linux
- ps -fe 查看所有进程
- ps -fT -p 查看某个进程(PID)的所有线程
- kill 杀死进程
- top 按大写 H 切换是否显示线程
- top -H -p 查看某个进程(PID)的所有线程
Java
- jps 命令查看所有 Java 进程
- jstack 查看某个 Java 进程(PID)的所有线程状态
- jconsole 来查看某个 Java 进程中线程的运行情况(图形界面)
Linux系统中线程实现方式
- LinuxThreads linux/glibc包在2.3.2之前只实现了LinuxThreads
- NPTL(Native POSIX Thread Library)
可以通过以下命令查看系统是使用哪种线程实现