进程与线程:
进程:每个进程都有独立的代码和数据空间(进程上下文)进程之间的切换会有较大开销,一个进程包含1-n个线程。(进程不能实现任何实际操作,要依靠线程)
当一个程序进入内存运行时,即变成一个进程。进程是处于运行过程中的程序。 进程是操作系统进行资源分配和调度的一个独立单位。
进程的三个特征:
1.独立性 独立存在的实体,每个进程都有自己独立私有的一块内存空间。
2.动态性 程序只是一个静态的指令集合,而进程是一个正在系统中活动的指令集合。
3.并发性 多个进程可在单处理器上并发执行。
线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(pc),线程切换开销小。 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。线程也被称作轻量级进程。线程在进程中是独立,并发的执行流。
线程和进程一样分为5个阶段:创建,就绪,运行,阻塞,终止。(新建状态(New),就绪状态(Runnable),运行状态(Running),阻塞状态(Blocked),死亡状态(Dead))
创建:当线程对象对创建后,即进入了新建状态,如:Thread t = new MyThread();
就绪:当调用线程对象的start()方法(t.start();)(定时器例外调用:),线程即进入就绪状态。处于就绪状态的线程,只是说明此线程已经做好了准备,随时等待CPU调度执行,并不是说执行了t.start()此线程立即就会执行;
运行:当CPU开始调度处于就绪状态的线程时,此时线程才得以真正执行,即进入到运行状态。注:就 绪状态是进入到运行状态的唯一入口,也就是说,线程要想进入运行状态执行,首先必须处于就绪状态中;
阻塞:(发生异常)处于运行状态中的线程由于某种原因,暂时放弃对CPU的使用权,停止执行,此时进入阻塞状态,阻塞解除时,重新进入到就绪状态,才 有机会再次被CPU调用以进入到运行状态。根据阻塞产生的原因不同,阻塞状态又可以分为三种:
1.等待阻塞:运行状态中的线程执行wait()方法(必须加同步锁),jvm会将该线程放入锁池中,使本线程进入到等待阻塞状态;
2.同步阻塞 -- 线程在获取synchronized同步锁失败(因为锁被其它线程所占用),jvm会将该线程放入锁池中,进入同步阻塞状态;
3.其他阻塞 -- 通过调用线程的sleep()或join()或发出了I/O请求时,线程会进入到阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
终止:线程执正常行完了或者因异常退出了run()方法,该线程结束生命周期。线程终止后,不能被复活。
CPU的执行资格:可以被cpu的处理,在处理队列中排队
CPU的执行权:正在被cpu的处理
多进程与多线程:
多进程:操作系统能同时运行多个任务;
多线程:同一程序中有多个顺序流在执行多线程(充满未知性)多线程就是分时利用CPU,宏观上让所有线程一起执行 ,也叫并发。
一个进程(程序)运行时产生不止一个线程
并行与并发:
1.并行:多个cpu实例或者多台机器同时执行一段处理逻辑,是真正的同时。
2.并发:通过cpu调度算法,让用户看上去同时执行,实际上从cpu操作层面不是真正的同时。并发往往在场景中有公用的资源,那么针对这个公用的资源往往产生瓶颈,我们会用TPS或者QPS来反应这个系统的处理能力。
同步和异步的区别:
异步:A线程要请求某个资源,但是此资源正在被B线程使用中,因为没有同步机制存在,A线程仍然请求的到,A线程 无需等待
同步:A线程要请求某个资源,但是此资源正在被B线程使用中,因为同步机制存在,A线程请求 不到,怎么办,A线程只能等待下去