1. 操作系统提供命令,可以观察多线程程序中每个线程的执行状态
可以看到除了一个在run之外,其他的都处于sleep状态
2. 线程的几种状态以及状态总结
new:创建出来,程序还没有开始运行线程中的代码
runnable: 一个新创建的线程并不自动开始运行,要执行线程,必须调用线程的
start()方法。当线程对象调用
start()方法即启动了线程,
start()方法创建线程运行的系统资源,并调度线程运行
run()方法。当
start()方法返回后,线程就处于就绪状态。 处于就绪状态的线程并不一定立即运行
run()方法,线程还必须同其他线程竞争
CPU时间,只有获得
CPU时间才可以运行线程。因为在单
CPU的计算机系统中,不可能同时运行多个线程,一个时刻仅有一个线程处于运行状态。因此此时可能有多个线程处于就绪状态。
runnning:
当线程获得CPU时间后,它才进入运行状态,真正开始执行run()方法.
block(sleep):线程运行过程中,可能由于各种原因进入阻塞状态:
1>线程通过调用sleep方法进入睡眠状态;
2>线程调用一个在I/O上被阻塞的操作,即该操作在输入输出操作完成之前不会返回到它的调用者;
3>线程试图得到一个锁,而该锁正被其他线程持有;
4>线程在等待某个触发条件;
......
所谓阻塞状态是正在运行的线程没有运行结束,暂时让出
CPU,这时其他处于就绪状态的线程就可以获得
CPU时间,进入运行状态。
dead:有两个原因会导致线程死亡:
1) run方法正常退出而自然死亡,
2) 一个未捕获的异常终止了run方法而使线程猝死。
为了确定线程在当前是否存活着(就是要么是可运行的,要么是被阻塞了),需要使用isAlive方法。如果是可运行或被阻塞,这个方法返回true; 如果线程仍旧是new状态且不是可运行的, 或者线程死亡了,则返回false.
3.CPU位数、核数、个数(freebsd)
cpu位数:getconf LONG_BIT
查看cpu信息:cat /var/run/dmesg.boot |grep CPU
cpu个数只的是物理cpu的个数
核数,只的是每个物理cpu的里的核有几个,也就是smp
对操作系统来说一个核就是一个cpu
4. 线程和核之间的关系
关键理解:操作系统其实只调度线程,进程是资源的概念。
线程会被调度在各个核心上
单核就是CPU集成了一个运算核心;
双核是两个运算核心,相当于两个CPU同时工作;
四核是四个运算核心,相当于四个CPU同时工作;
多核:
CPU最初发展的时候是一个CPU一个处理核心,CPU的性能主要靠提高核心工作频率来提高,由于物理限制,不能把CPU的核心频率无限提高,所以发展出
来双核心或多核心的CPU。相当于在一枚处理器上集成多个完整的计算引擎(内核),他们共享缓存,内存,寄存器等。两个核心一起工作需要靠软件的支持。软
件要明白怎么把任务分给两个核心让他们一起工作,这样变相的提高了CPU的处理性能,现在新出的软件都支持多核心了。本来是一个核心一个线程,不过
INTEL发明了一个核心跑出两个线程,这叫超线程技术。所以有双核4线程的说法。
多线程:
什么是线程?
每个正在系统上运行的程序都是一个进程。每个进程包含一到多个线程。进程也可能是整个程序或者是部分程序的动态执行。线程是一组指令的集合,或者是程序的
特殊段,它可以在程序里独立执行。也可以把它理解为代码运行的上下文。所以线程基本上是轻量级的进程,它负责在单个程序里执行多任务。通常由操作系统负责
多个线程的调度和执行。
什么是多线程?
多线程是为了使得多个线程并行的工作以完成多项任务,以提高系统的效率。线程是在同一时间需要完成多项任务的时候被实现的。
使用线程的好处有以下几点:
·使用线程可以把占据长时间的程序中的任务放到后台去处理
·用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度
·程序的运行速度可能加快
·在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较游泳了。在这种情况下我们可以释放一些珍贵的资源如内存占用等等。
5. 线程执行状态中的waitchannel
具体每个状态代表的信息可以查询下面的链接:
阅读(1309) | 评论(0) | 转发(0) |