目录
一、进程与线程
1、什么是进程和线程
2、两者之间的联系与区别
3、为什么程序计数器、虚拟机栈和本地⽅法栈是线程私有的呢?为什么堆和⽅法区是线程共享的呢?
4、线程的五种状态
进程是程序的⼀次执⾏过程,是系统运⾏程序的基本单位,因此进程是动态的。系统运⾏⼀个程 序即是⼀个进程从创建,运⾏到消亡的过程。
线程与进程相似,但线程是⼀个⽐进程更⼩的执⾏单位。⼀个进程在其执⾏的过程中可以产⽣多 个线程。与进程不同的是同类的多个线程共享进程的堆和⽅法区资源,但每个线程有⾃⼰的程序 计数器、虚拟机栈和本地⽅法栈,所以系统在产⽣⼀个线程,或是在各个线程之间作切换⼯作 时,负担要⽐进程⼩得多,也正因为如此,线程也被称为轻量级进程。
⼀个进程中可以有多个线程,多个线程共享进程的堆和⽅法区 (JDK1.8 之后的 元空间)资源,但是每个线程有⾃⼰的程序计数器、虚拟机栈 和 本地⽅法栈。
线程 是 进程 划分成的更⼩的运⾏单位。线程和进程最⼤的不同在于基本上各进程是独⽴ 的,⽽各线程则不⼀定,因为同⼀进程中的线程极有可能会相互影响(由于通常线程数大于cpu核数,使用时间片轮转,涉及到线程的上下文切换)。线程执⾏开销⼩,但不利 于资源的管理和保护;⽽进程正相反。
程序计数器私有:为了线程切换后能恢复到正确的执⾏位置。
虚拟机栈和本地⽅法栈线程私有:为了保证线程中的局部变量不被别的线程访问到。
堆主要⽤于存放新创建的对 象 (所有对象都在这⾥分配内存),⽅法区主要⽤于存放已被加载的类信息、常量、静态变量、即 时编译器编译后的代码等数据,是线程共享的。
创建状态、就绪状态、执行状态、阻塞状态、结束状态。
(1)先到先服务(FCFS)调度算法 : 从就绪队列中选择一个最先进入该队列的进程为之分配资源,使它立即执行并一直执行到完成或发生某事件而被阻塞放弃占用 CPU 时再重新调度。
(2)短作业优先(SJF)的调度算法 : 从就绪队列中选出一个估计运行时间最短的进程为之分配资源,使它立即执行并一直执行到完成或发生某事件而被阻塞放弃占用 CPU 时再重新调度。
(3)时间片轮转调度算法 : 时间片轮转调度是一种最古老,最简单,最公平且使用最广的算法,又称 RR(Round robin)调度。每个进程被分配一个时间段,称作它的时间片,即该进程允许运行的时间。
(4)多级反馈队列调度算法 :前面介绍的几种进程调度的算法都有一定的局限性。如短进程优先的调度算法,仅照顾了短进程而忽略了长进程 。多级反馈队列调度算法既能使高优先级的作业得到响应又能使短作业(进程)迅速完成。,因而它是目前被公认的一种较好的进程调度算法,UNIX 操作系统采取的便是这种调度算法。
(5)优先级调度 : 为每个流程分配优先级,首先执行具有最高优先级的进程,依此类推。具有相同优先级的进程以 FCFS 方式执行。可以根据内存要求,时间要求或任何其他资源要求来确定优先级。
线程同步是两个或多个共享关键资源的线程的并发执⾏。应该同步线程以避免关键的资 源使⽤冲突。
1. 互斥量(Mutex):采⽤互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。 因为互斥对象只有⼀个,所以可以保证公共资源不会被多个线程同时访问。⽐如 Java 中的 synchronized 关键词和各种 Lock 都是这种机制。
2. 信号量(Semphares) :它允许同⼀时刻多个线程访问同⼀资源,但是需要控制同⼀时刻访问此资源的最⼤线程数量。
3. 事件(Event) :Wait/Notify:通过通知操作的⽅式来保持多线程同步,还可以⽅便的实现多线程优先级。
(1)共享内存(Shared memory) :使得多个进程可以访问同⼀块内存空间,不同进程可以及时 看到对⽅进程中对共享内存中数据的更新。这种⽅式需要依靠某种同步操作,如互斥锁和信号量等。可以说这是最有⽤的进程间通信⽅式。
(2)信号量(Semaphores) :信号量是⼀个计数器,⽤于多进程对共享数据的访问,信号量的意 图在于进程间同步。这种通信⽅式主要⽤于解决与同步相关的问题并避免竞争条件。
(3)套接字(Sockets) : 此⽅法主要⽤于在客户端和服务器之间通过⽹络进⾏通信。套接字是⽀ 持 TCP/IP 的⽹络通信的基本操作单元,可以看做是不同主机之间的进程进⾏双向通信的端 点,简单的说就是通信的两⽅的⼀种约定,⽤套接字中的相关函数来完成通信过程。
互斥条件:一个资源任意时刻只能由一个线程访问。
请求与保持:一个线程去申请资源而堵塞时,对已经获得的资源不释放。
不剥夺条件:一个线程在用完资源之前不能被其它线程剥夺。
循环等待:多个线程之间形成一种互相等待资源的状态。
破坏四个条件
互斥:不能破坏,因为临界资源本来就需要互斥访问;
请求与保持:一次性申请所有资源;
不剥夺条件:占有部分资源的线程请求资源而堵塞时,主动释放自己的资源;
循环等待:按一定的顺序请求资源,反序释放资源。