一、程序与进程
进程简单来说就是在操作系统中运行的程序,它是操作系统资源管理的最小单位。但是进程是一个动态的实体,它是程序的一次执行过程
进程和程序的区别在于:进程是动态的,程序是静态的,进程是运行中的程序,而程序是一些保存在硬盘上的可执行代码 程序代码的一个或多个执行线程
程序
- 保存在硬盘、光盘等介质中的可执行代码和数据
- 文件中静态保存的代码
进程
- 在CPU及内存中运行的程序代码
- 动态执行的代码
- 父、子进程
- 每个程序可以创建一个或多个进程
二、线程
线程被包含在进程之中,是进程中的实际运作单位,也是操作系统中能够独立运行的基本单位,也称作轻量线程,一个进程中可以并发多个线程,每条线程可以并行执行不同的任务,而我们在任务管理器中看到的一个个进程则是由我们下载的应用程序所产生的,当然一个应用程序也可以包含多个线程。
线程有五种状态,分别是 :
新建(NEW) 新创建了一个线程对象
可运行(RUNNABLE) 线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取cpu的使用权。
运行(RUNNING) 可运行状态的线程获得了cpu时间片,执行程序代码
阻塞(BLOCKED) 阻塞状态是指线程因为某种原因放弃了cpu使用权,也即让出了cpu timeslice,暂时停止运行。直到线程进入可运行状态,才有机会再次获得cpu timeslice转到运行状态。阻塞的情况分三种:
①等待阻塞:运行的线程执行o.wait()方法,JVM会把该线程放入等待队列中。
②同步阻塞:运行的线程在获取对象的同步锁时,若该同步同步锁被别的线程占用,则LVM会把线程放入锁池中。
③其他阻塞:运行的线程执行Thread.sleep(longms)或t.join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入可运行状态。
死亡(DEAD)线程run()、main()方法执行结束,或者因异常退出了run()方法,则该线程结束生命周期。死亡的线程不可再次复生
三、查看进程统计信息
1、ps命令查看静态的进程统计信息
-a:显示当前终端下的是所有进程信息,包括其他用户的进程。与"x"选项结合时将显示系统中所有的进程信息
-u:使用以用户为主的格式输出进程信息
-x:显示当前用户在所有终端下的进程信息
-A:列出所有的进程
-o:自定义输出字段
-b 批处理
-c 显示完整的治命令
-I 忽略失效过程
-s 保密模式
-S 累积模式
-i<时间> 设置间隔时间
-p<进程号> 指定进程
-n<次数> 循环显示的次数
例如:显示所有进程以及进程的stat,cmd,pid
[root@ljp shel]# ps -A -o stat,cmd,pid
STAT CMD PID
Ss /usr/lib/systemd/systemd -- 1
S [kthreadd] 2
S< [kworker/0:0H] 4
S [ksoftirqd/0] 6
S [migration/0] 7
S [rcu_bh] 8
S [rcu_sched] 9
S< [lru-add-drain] 10
S [watchdog/0] 11
S [watchdog/1] 12
S [migration/1] 13
。。。。。。。
ps -aux每个字段的含义:
USER 进程所属的用户
PID &n