线程 进程 线程池
进程
狭义上讲:正在执行的程序,由线程组成,可包含多个线程在运行。
广义上讲:进程是一个具有一定独立功能的程序有关于某个数据集合的一次运行的活动。它可以申请或者拥有系统资源,是一个动态的概念。
进程的概念主要两点:1.进程是一个实体,每一个进程都有自己的地址空间,一般情况下包括文本区域,数据区和堆栈。
线程
- 线程
CPU的CS:IP跑JAVA程序,程序在用户态创建一个线程,线程指向内核态创建一个task-struct
java执行的最小单位为线程,线程共享内存
为进程中执行的程序片段。
一个线程由线程ID,当前指令针,寄存器和堆栈组成,另外线程是进程的实体,是被系统独立调试的分派的基本单元。
线程是程序中一个单一的顺序控制流程。进程内一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单位指运行中的程序的调度单位。在单个程序中同时运行多个线程完成不同的工作,称为多线程。
进程与线程的区别
线程之间用的是进程里给他分配的内存
进程的空间是独立的,进程之间是没有办法通过内存的方式互相通信的,进程之间需要外设进行通信(序列化与反序列化)
-
线程中有两种启动方法:
(1)一种是继承Thread类,重写run方法
(2) 另一种是实现Runnable接口,实现run方法。
由于java是单继承的,继承一个类后不能继承其他类。用实现runnable接口启动线程,弥补了java单继承。 -
线程的状态
(1)创建 : 创建线程也就是new线程;
(2)就绪:调用了start()方法,等待cpu调度;
(3)运行:执行了run()方法;
(4)阻塞:surspend()也就当前线程处于是停止状态,cpu调用其他线程执行,调用notify()方法唤醒。
(5)消亡:stop(),线程销毁。在线程里面的代码执行完毕后,线程自动销毁。
(6)出让CPU:调用yield()方法出让CPU,可以防止资源将CPU耗尽,调用resume()方法唤醒。
(7)睡眠:调用sleep()方法使线程进入睡眠状态,在系统时钟内中断,调用resume()方法唤醒。 -
线程常用的方法:
(1)得到当前线程名称:Thread.currentThread().getName()
(2) 取得当前线程对象:currentThread();
(3) 线程是否执行:isAlive()
(4) 线程的强行运行:join(); -
线程的优先级
(1) min_priority: 1
(2) max_priority; 10
(3) norm_priority; 5
在不指定线程优先级的时候,默认优先级为5;
线程的优先级是有可能影响线程的执行顺序,而不是一定按照优先级执行。多线程的执行其实是线程的交换执行 -
纤程
内核线程对应那个可执行任务
线程池
池化:新建一个线程就将其放在池里,进行调用,减少调用次数(有规定数量上限,资源尽量互用)
池的作用:线程复用,阻止越界
- SingleThreadExcecutor() ;单线程池
就一个线程,做线程的单例用 - newCachedThreadPool();能根据内存算出一个线程池线程数,不阻塞的队列(用的很多)
- newFixedThreadPool();固定自定义大小的线程池,无界队列
- newScheduledThreadPool();能够根据线程使用,动态扩展线程池的线程数量
- 线程组:ThreadGroup
统一管理线程
能将活线程,使用的线程,总线程等列出来(几乎没人用) - ForkJoinPool
空间换时间,时间换稳定
分开处理资源(二分法)
任务过大就二分处理,如果二分后任务还是很大就继续二分
创建线程池的步骤
- 调用Executors类的静态方法创建一个ExecutorService对象,得到一个线程池。
- 创建Runnbaler的实现类
- 通过submit()方法向线程池提交runnbale线程
- 通过shutdown()方法关闭线程池
中断门,陷阱门,调用门,任务门
-
两个环境上下文:进程上下文,中断上下文
上下文:环境
进程上下文:开机后,CS:IP指针指向Bios,Bios引导程序,引导程序加载group up,group up加载操作系统内核,内核起来后,加载用户应用,再分出新的进程,这个过程称为进程上下文
中断上下文:中断,将正在执行的进程放入内存。
将进程上下文与中断上下文之间切换的只有中断门,会造成内存拷贝,效率低 -
中断门
硬件的任何事件都称为中断 -
陷阱门
软中断
中断控制器:8259A
能处理256种中断
用软件模拟硬件,用代码命令也可以造成中断 -
任务门
CPU有一个任务队列,叫tss
Windows:每执行一个进程就将进程代码所指向的位置拷贝进任务门,CPU执行代码,换代码执行就将代码放到任务门中执行。
Linux:任务门只执行一段代码,执行完代码就jump到新的代码中。不用换任务门,换的是执行代码的位置。
亲和性:可以指定代码在哪个CPU上跑
-
调用门
调用门描述某个子程序的入口。调用门内的选择子必须实现代码段描述符,调用门内的偏移是对应代码段内的偏移。利用段间调用指令CALL,通过调用门可实现任务内从外层特权级变换到内层特权级。 -
四种门之间的区别和联系
1.任务门和其他三种门相比,在任务门中不需要用段内位移,因为任务门不指向某一个子程序的入口,TSS本身是作为一个段来对待的,而中断门、陷阱门和调用门则都要指向一个子程序,所以必须结合使用段选择码和段内位移。此外,任务门中相对于D标志位的位置永远是0.
2.中断门和陷阱门在使用上的区别不在于中断是外部产生的还是有CPU本身产生的,而在于通过中断门进入中断服务程序时CPU会自动将中断关闭(将EFLAGS寄存器中IF标志位置0),以防止嵌套中断产生,而通过陷阱门进入服务程序时则维持IF标志位不变。这是二者唯一的区别。