进程线程

1 进程
1.1 概念
进程就是正在运行的程序,它代表了程序所占用的内存区域

1.2 特点

  • 独立性

进程是系统中独立存在的实体,它可以拥有自己独立的资源,每个进程都拥有自己私有的地址空间,在没有经过进程本身允许的情况下,一个用户进程不可以直接访问其他进程的地址空间.

  • 动态性

进程与程序的区别在于,程序只是一个静态的指令集合,而进程一个正在系统中活动的指令集合,程序加入了时间的概念以后,称为进程,具有自己的生命周期和各种不同的状态,这些概念都是程序所不具备的.

  • 并发性
    进程线程_第1张图片

多个进程可以在单个处理器CPU上并发执行,多个进程之间不会互相影响.

1.3 并行和并发

TIPS: HA–高可用 在高并发的环境下,系统如何完成正常功能供给

2 线程
2.1 概念
线程是操作系统OS能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.
一个进程可以开启多个线程,其中有一个主线程来调用本进程中的其他线程
我们看到的进程的切换,切换的也是不同进程的主线程
多线程扩展了多进程的概念,使的同一个进程可以同时并发处理多个任务
简而言之,一个程序运行后至少一个进程,一个进程里包含一个线程(单线程)或者多个线程(多线程)
进程线程_第2张图片

2.2 进程与线程的关系
一个操作系统中可以有多个进程,一个进程中可以有多个线程
每个线程有自己独立的内存,每个线程共享一个进程中的内存,每个线程又有自己独立的内存(这个非常重要!!!)
所以想使用线程技术,得先有进程,进程的创建是OS操作系统创建的.我们不能实现,一般都是C或者C++完成
进程线程_第3张图片

3 多线程的特性
3.1 随机性
线程的随机性指的是同一时刻,只有一个程序在执行

我们宏观上觉得这些程序像是同时运行,但是实际上微观时间是因为CPU在高效的切换着,这使得各个程序从表面上看是同时进行的,也就是说,宏观层面上,所有的进程/线程看似同时运行,但是微观层面上,同一时刻,一个CPU只能处理一件事.

时间单位:1/ms甚至更快,切换的速度是纳秒级别的,非常快
进程线程_第4张图片

3.2 CPU分时调度

进程线程_第5张图片

  时间片,即CPU分配给各个线程的一个时间段,称作它的时间片,即该线程被允许运行的时间,如果在时间片用完时线程还在执行,那CPU将被剥夺并分配给另一个线程,将当前线程挂起,如果线程在时间片用完之前阻塞或结束,则CPU当即进行切换,从而避免CPU资源浪费,当再次切换到之前挂起的线程,恢复现场,继续执行。

注意:我们无法控制OS如何选择以及选择哪些线程来执行,OS底层有自己规则:

FCFS(First Come First Service 先来先服务算法) SJS(Short Job Service短服务算法)

3.3 线程的状态
由于线程状态比较复杂,所以我们由易到难,先学习基础模型,线程的三种状态及其转换,简称”三态模型”

进程线程_第6张图片

l 就绪(可运行)状态:线程已经准备好运行,只要获得CPU,就可立即执行

l 执行(运行)状态:线程已经获得CPU,其程序正在运行的状态

l 阻塞状态:正在运行的线程由于某些事件(I/O请求等)暂时无法执行的暂停状态,即线程执行阻塞。

Ø 就绪à执行:为就绪线程分配CPU即可变为执行状态

Ø 执行à就绪:正在执行的线程由于时间片用完被剥夺CPU暂停执行,就变为就绪状态

Ø 执行à阻塞:由于发生某事件,使正在执行的线程受阻,无法执行,则由执行变为阻塞

(例如线程正在访问临界资源,而资源正在被其他线程访问)

反之,如果获得了之前需要的资源,则由阻塞变为就绪状态,等待分配CPU再次执行
进程线程_第7张图片

l 创建状态:线程的创建比较复杂,需要先申请PCB,然后为该线程运行分配必须的资源,并将该线程转为就绪状态插入到就绪队列中

l 终止状态:等待OS进行善后处理,最后将PCB清零,并将PCB返回给系统

TIPS:PCB(Process Control Block):为了保证参与并发执行的每个线程都能独立运行,OS配置了特有的数据结构PCB来描述线程的基本情况和活动过程,进而控制和管理线程

3.4 线程状态之代码对照

进程线程_第8张图片

线程生命周期,主要有五种状态:

  1. 新建状态(New) : 当线程对象创建后就进入了新建状态.如:Thread t = new MyThread();

  2. 就绪状态(Runnable):当调用线程对象的start()方法(t.start(),线程即为进入就绪状态.

处于就绪(可运行)状态的线程,只是说明线程已经做好准备,随时等待CPU调度执行,并不是执行了t.start()此线程立即就会执行

  1. 运行状态(Running):当CPU开始调度处于就绪状态的线程时,此线程才是真正的执行,即进入到运行状态

注意:就绪状态是进入运行状态的唯一入口,也就是线程想要进入运行状态状态执行,先得处于就绪状态

  1. 阻塞状态(Blocked):处于运状态中的线程由于某种原因,暂时放弃对CPU的使用权,停止执行,此时进入阻塞状态,直到其进入就绪状态才有机会被CPU选中再次执行.

  2. 根据阻塞状态产生的原因不同,阻塞状态又可以细分成三种:

a) 等待阻塞:运行状态中的线程执行wait()方法,本线程进入到等待阻塞状态

b) 同步阻塞:线程在获取synchronized同步锁失败(因为锁被其他线程占用),它会进入同步阻塞状态

c) 其他阻塞:调用线程的sleep()或者join()或发出了I/O请求时,线程会进入到阻塞状态.当sleep()状态超时.join()等待线程终止或者超时或者I/O处理完毕时线程重新转入就绪状态

  1. 死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期

你可能感兴趣的:(java基础,java)