进程和线程:
进程广义上来说是“一个正在运行(进行)的程序(代码)。是程序运行的基本单位。
线程:一个进程由若干个线程组成,线程是CPU调度的最小单元。是进程中的实际运作单位。
参考资料:http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html
单线程进程模型:一个进程只包含一个线程,线程即进程,进程即线程。
多线程进程模型:一个进程由若干个线程组成,多个线程之间可以共享进程的资源,每个线程也拥有各自的资源,线程的资源是各自独立的。
进程与线程的资源共享关系
程序一般不会直接去使用内核线程,而是去使用内核线程的一种高级接口——轻量级进程(Light Weight Process,LWP),轻量级进程就是我们通常意义上所讲的线程(我们在这称它为用户线程),由于每个轻量级进程都由一个内核线程支持,因此只有先支持内核线程,才能有轻量级进程。用户线程与内核线程的对应关系有三种模型:一对一模型、多对一模型、多对多模型。
参考资料:https://www.cnblogs.com/Shannong/articles/9036133.html
目前流行的操作系统使用的都是多对多模型, 下面讲一下多对多模型:
多对多模型结合了一对多模型和多对一模型的优点,将多个用户线程映射到多个内核线程上。
多对多模型的优点:
1、一个用户线程阻塞,不会影响到其他的用户线程,因为还有其他内核线程去处理。
2、用户线程的数量不受内核线程数量的限制,原则上可以无限增加。
3、在多处理器的操作系统中,多对多模型的线程也能得到一定的性能提升,但提升的幅度不如一对一模型的高。
线程的状态:
NEW :新建(new Thread())新创建的线程的状态为 NEW
RUNNABLE :就绪 (Thread.start())新建的Thread调用start方法会将线程的状态变为 RUNNABLE。
BLOCKED:阻塞 synchronized block/method 当线程等待获取锁时,线程的状态为 BLOCKED。
WAITING:等待 当线程等待其他线程结束(Thread.join())或者等待其他线程唤醒(Thread.wait();LockSupport.park())
,线程的状态为WAITING
TIMED_WAITING:临时等待 当线程等待其他线程结束(Thread.join())或者等待其他线程唤醒(Thread.wait())并且具有超时时间时,线程的状态为 TIMED_WAITING
TERMINATED:中止(结束)线程执行完成或者出现异常,线程的状态为 TERMINATED。
线程的生命周期: