1.进程和线程的区别
-
进程(process):
一个程序在一个数据集上的一次运行过程。
系统资源分配的单位。
一个程序在不同数据集合上运行或一个程序在同样数据集上的多次运行都是不同的进程。
进程是独立的,有自己的内存空间和上下文环境,无法获取其他进程的存储空间。
同一进程的两段代码不能同时执行,除非引入线程。 -
线程(thread):
进程的一个实体,是被系统独立调度和执行的基本单位,CPU调度的基本单位。
同一进程的线程可以共享同一内存空间。
线程是属于进程的,当进程退出时该进程所产生的线程都会被强制退出并清除。
线程占用的资源少于进程占用的资源。 -
线程是进程的一部分,一个线程只能有一个进程,一个进程可以有多个线程
2.线程调度
线程调度指的是系统为线程分配CPU使用权的方式。主要有协同式线程调度和抢占式线程调度。
协同式线程调度(Cooperative Threads-Scheduling)
在多线程系统中,线程的执行时间由线程自身控制,执行结束后要主动通知系统切换到另一线程。
优劣势
- 实现简单,由于线程执行结束后才会进行线程转换,切换操作对线程可见,所以不存在线程同步问题
- 线程执行时间不可控,如果一个线程实现有问题,一直不通知系统进行线程切换,那整个系统就会阻塞
抢占式线程调度(Preemptive Threads-Scheduling)
在多线程系统中,每个线程由系统来分配执行时间,线程的切换不由线程本身控制(Java的Thread.yield()可以让出执行时间,但是无法主动获取执行时间)
优劣势
- 线程的执行时间是可控的,不会由于一个线程导致整个进程阻塞,Java采用的是这种调度方式
- 进程不能控制自身的执行,系统会进行时间片的切分,会涉及到上下文的保存,线程同步等问题,实现较复杂
JVM的实现:
JVM规范中规定每个线程都有优先级,且优先级越高越优先执行,但优先级高并不代表能独自占用执行时间片,可能是优先级高得到越多的执行时间片,反之,优先级低的分到的执行时间少但不会分配不到执行时间。
java使用的线程调度是抢占式调度
Java中线程会按优先级分配CPU时间片运行
线程让出cpu的情况:
- 当前运行线程主动放弃CPU,JVM暂时放弃CPU操作,如调用yield()方法
- 当前运行线程因为某些原因进入阻塞状态,例如阻塞在I/O上
线程结束(Dead)
3.线程状态和切换
https://blog.csdn.net/xiamiflying/article/details/82903361
这篇文章涉及线程的6种状态和状态之间的切换方式,还对Java线程常用的方法进行了对比(包括sleep和wait的区别)。
4.线程同步的方式
互斥量:采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。互斥对象只有一个,所以可以保证公共资源不会被多个线程同时访问。
信号量:允许多个线程访问同一资源,但需要控制同一时刻访问此资源的最大线程数量。
事件(信号):通过通知操作的方式来保持多线程同步,还能方便实现多线程优先级的比较操作
自旋锁
多处理器:获取/释放自旋锁;单处理器:禁止/使用内核抢占
mutex(互斥器)和临界区(critical section)区别
- mutex是用于进程之间互斥
- 临界区是用于线程之间互斥
处理器调度
cpu调度:在合适的调度时机,按调度算法,调度就绪队列中的进程进cpu
5.线程池
6.协程
这部分内容此前没有接触过,先跳过
7.堆和栈的区别
关于Java堆栈的介绍
栈:函数参数、返回地址、局部变量(运行入口知道大小)
堆:运行期间动态分配的内存空间(运行的时候才知道大小)
8.死锁
是多个进程无限等待一个事件,而该事件只能由这些进程之一产生。
处理死锁的方法:防止发生或发生后处理
产生死锁有4个必要条件:
互斥条件:一个资源每次只能被一个进程使用【无法被破坏】
请求与保持条件:一个进程因请求被其他进程占有的资源而阻塞时,对已获得的资源保持不放【资源静态分配、防止进程在等待状态下占用资源】
非抢占条件:资源只能在进程完成时自动释放,不能被抢占【允许进抢占其他进程占有的资源】
循环等待条件:若干个进程之间形成一个首尾相接的循环等待关系【资源有序分配】
哲学家进餐问题:
五个哲学家圆桌5个筷子,只有同时拿到左右两个筷子才可以吃饭;
semaphore chopstick[5];
do {
wait(chopstick[i]);
wait(chopstick[i+1]%5);
// eat
signal(chopstick[i]);
signal(chopstick[i+1]%5);
// think
} while (true);
假如5个哲学家同时拿起左边的筷子,所有哲学家都在等待右边的筷子,会永远等待。
解决方法:最多值允许4个哲学家同时坐在桌上;只有两个筷子都可以使用时才允许一个哲学家拿起它们;使用非对称解决方法:奇数哲学家先拿起左边的筷子再拿起右边的筷子,偶数哲学家相反。
银行家算法
检查申请者对资源的最大需求量,若系统现存的各类资源可以满足申请者的需求,就满足申请者的需求。这样申请者可以很快完成计算,然后释放它占用的资源,从而保证了系统中所有进程能完成,避免死锁的发生。
9.进程调度
- 先来先服务调度算法FCFS
- 短作业优先调度算法SJF
- 最高响应比调度算法HRRN
- 时间片轮转调度算法RR
- 多级反馈队列调度算法
10.CPU Load
11.进程的三种状态
就绪、运行、阻塞