JAVA基础_进程和线程
2023-03-21 10:24:48 10 举报
AI智能生成
进程和线程
作者其他创作
大纲/内容
线程
什么是线程
线程是CPU调度的基本单位
线程与进程的区别
线程是调度的基本单位,而进程则是资源拥有的基本单位。
所谓操作系统的任务调度,实际上的调度对象是线程,而进程只是给线程提供了虚拟内存、全局变量等资源。
线程的上下文切换
属于同一个进程
因为虚拟内存是共享的
虚拟内存这些资源就保持不动
切换线程的私有数据、寄存器等不共享的数据
不属于同一个进程
切换的过程就跟进程上下文切换一样
进程
定义:运行中的程序
并发和并行
并发:在CPU同一时间只能处理一个任务的前提下,每个任务有一定的执行时长,比如任务A执行0.001s,切换到任务B执行0.05s,再切换到任务C执行0.01s...不断循环(伪并行)
并行:操作系统可将每一个核视为一个CPU,一个核下只处理一个任务。
进行的状态
进程被创建的场景
1. 系统初始化
2. 用户通过系统提供的API创建新进程
3. 批处理作业初始化
4. 由现有进程派生子进程
2. 用户通过系统提供的API创建新进程
3. 批处理作业初始化
4. 由现有进程派生子进程
进程的初始化过程
1. 给新进程分配一个进程ID
2. 分配内存空间
3. 初始化PCB
4. 进入就绪队列
2. 分配内存空间
3. 初始化PCB
4. 进入就绪队列
状态模型
五状态模型
状态
创建状态
就绪
运行
阻塞
结束
关系
就绪到运行:当操作系统内存在着调度程序,当需要运行一个新进程时,调度程序选择一个就绪态的进程,让其进入运行态。
运行到就绪:运行态的进程,会占有CPU。每个进程会被分配一定的执行时间,当时间结束后,重新回到就绪态。
运行到阻塞:进程请求调用系统的某些服务,但是操作系统没法立即给它(比如这种服务可能要耗时初始化,比如I/O资源需要等待),那么它就会进入阻塞态。
阻塞到就绪:当等待结束了,就由阻塞态进入就绪态。
运行到终止:当进程表示自己已经完成了,它会被操作系统终止。
七状态模型
为了解决内存占用问题,将部分内存的进程交换到磁盘中,这些被交换到磁盘的进程,进入挂起状态。
状态
阻塞挂起状态
就绪挂起状态
进程的控制结构
是一种数据机构,称之为进程控制块,用来描述进程,
PCB 是进程存在的唯一标识,进程消失,PCB也随之消失
组织方式
链表:相同状态的进程链在一起,组成各种队列
就绪队列
阻塞队列
索引:将同一状态的进程组织在一个索引表中
一般会选择链表,因为可能面临进程创建,销毁等调度导致进程状态发生变化,所以链表能够更加灵活的插入和删除。
进程的切换
定义:一个进程从正在运行到中断,操作系统指定另一个进程从就绪到运行状态,这个过程就是进程切换
步骤:
1.保存处理器上下文环境:将CPU程序计数器和寄存器的值保存到当前进程的私有堆栈里
2.更新当前进程的PCB(包括状态更变)
3.将当前进程移到就绪队列或者阻塞队列
4.根据调度算法,选择就绪队列中一个合适的新进程,将其更改为运行态
5.更新内存管理的数据结构
6.新进程内对堆栈所保存的上下文信息载入到CPU的寄存器和程序计数器,占有CPU
场景
为了保证所有进程可以得到公平调度,CPU 时间被划分为一段段的时间片,这些时间片再被轮流分配给各个进程。
程在系统资源不足(比如内存不足)时,要等到资源满足后才可以运行,这个时候进程也会被挂起,并由系统调度其他进程运行;
当进程通过睡眠函数 sleep 这样的方法将自己主动挂起时,自然也会重新调度
当有优先级更高的进程运行时,为了保证高优先级进程的运行,当前进程会被挂起,由高优先级进程来运行;
发生硬件中断时,CPU 上的进程会被中断挂起,转而执行内核中的中断服务程序;
进程的调度
调度程序定义:操作系统选择一个进程运行某个功能
场景
从就绪态 -> 运行态
操作系统会从就绪队列选择一个进程运行;
从运行态 -> 阻塞态
操作系统必须另外一个进程运行;
从运行态 -> 结束态
操作系统得从就绪队列选择另外一个进程运行;
如何处理时钟中断(硬件时钟提供某个频率的周期性中断)
非抢占式调度算法
挑选一个进程,然后让该进程运行直到被阻塞,或者直到该进程退出,才会调用另外一个进程
抢占式调度算法
挑选一个进程,然后让该进程只运行某段时间,如果在该时段结束时,该进程仍然在运行时,则会把它挂起,接着调度程序从就绪队列挑选另外一个进程
需要在时间间隔的末端发生时钟中断,以便把 CPU 控制返回给调度程序进行调度,也就是常说的时间片机制。
调度原则
CPU 利用率
调度程序应确保 CPU 是始终匆忙的状态,这可提高 CPU 的利用率;
系统吞吐量
吞吐量表示的是单位时间内 CPU 完成进程的数量
长作业的进程会占用较长的 CPU 资源,因此会降低吞吐量
短作业的进程会提升系统吞吐量;
周转时间
周转时间是进程运行和阻塞时间总和,一个进程的周转时间越小越好;
等待时间
这个等待时间不是阻塞状态的时间,而是进程处于就绪队列的时间,等待的时间越长,用户越不满意;
响应时间
用户提交请求到系统第一次产生响应所花费的时间
调度算法
先来先服服务FCFS
先进就绪队列,则先被调度,先来先服务
缺点:当前面任务耗费很长时间执行,那么后面的任务即使只需要执行很短的时间,也必须一直等待
非抢占式
时间片轮转
每一个进程会被分配一个时间片,表示允许该进程在这个时间段运行
最公平的调度算法
缺点:如果时间片太短,频繁进行切换,会影响效率。如果进程时间片太长,有可能导致排后面的进程等待太长时间。
时间片的长度要设置的合理(建议时间片长度在20ms~50ms)
最短作业优先SJF
进程按照作业时间长短排队,作业时间段的排前面先执行
缺点:对长作业不利,很容易造成一种极端现象
最短剩余时间优先
从就绪队列中选择剩余时间最短的进程进行调度
最短作业优先和时间片轮转的结合
优先级调度
按照优先级调度
非抢占式
一旦该进程占有CPU就将一直执行到结束或者阻塞。
抢占式
进程执行期间,一旦有更高优先级的进程进入就绪队列,那么该进程就会被暂停,重回就绪队列,让更高优先级的进程执行
但是为了防止最高优先级进程一直执行,每个进程依然有自己的时间片,每次时间片结束后,会根据一定规则降低该进程优先级,避免某些最高优先级长作业进程一直占用CPU。
多级反馈队列调度
基于时间片轮转和优先级调度
设置多个就绪队列,赋予每个就绪队列优先级,优先级越高的队列进程的时间片越短。
当第1级队列为空时,才调度第2级队列的进程,如果第i级队列的进程正在运行,此时有一个更高优先级的进程进入,则会停下第i级的进程,让它回到第i级队列尾部,转而执行更高优先级的进程,即满足优先级调度算法的原则。
兼顾了长短作业,同时有较好的响应时间。
进程间通信
进程之间要通信必须通过内核
每个进程的用户地址空间都是独立的,不共享
共享数据,数据传输,消息通知,进程控制
通讯的目的:内核空间是每个进程都共享
管道
管道传输数据是单向的
想相互通信,我们需要创建两个管道才行
匿名管道,用完了就销毁
$ ps auxf | grep mysql 中的 |
通信范围是存在父子关系的进程
随进程的创建而建立,随进程的结束而销毁。
命名管道
数据是先进先出的传输方式。
可以在不相关的进程间也能相互通信
他提前创建了一个类型为管道的设备文文件,在进程里只要使用这个设备文件,就可以相互通信。
特点:通信方式效率低,不适合进程间频繁地交换数据。
消息队列
消息队列是保存在内核中的消息链表
可以用于频繁的交换数据
消息队列生命周期随内核,如果没有释放消息队列或者没有关闭操作系统,消息队列会一直存在
缺点:消息队列通信过程中,存在用户态与内核态之间的数据拷贝开销
共享内存
避免了发生用户态与内核态之间的消息拷贝过程
共享内存的机制,就是拿出一块虚拟地址空间来,映射到相同的物理内存中。
这样这个进程写入的东西,另外一个进程马上就能看到了,都不需要拷贝来拷贝去,传来传去,大大提高了进程间通信的速度。
这样这个进程写入的东西,另外一个进程马上就能看到了,都不需要拷贝来拷贝去,传来传去,大大提高了进程间通信的速度。
缺点:如果多个进程同时修改同一个共享内存,很有可能就冲突了。
信号量
为了防止多进程竞争共享资源,而造成的数据错乱,所以需要保护机制,使得共享的资源,在任意时刻只能被一个进程访问
一个整型的计数器,主要用于实现进程间的互斥与同步
原子操作
P 操作(信号量减去 -1)
信号量 < 0,则表明资源已被占用,进程需阻塞等待;
信号量 >= 0,则表明还有资源可使用,进程可正常继续执行。
用在进入共享资源之前
V 操作(信号量减去 +1)
信号量 <= 0,则表明当前有阻塞中的进程,于是会将该进程唤醒运行;
信号量 > 0,则表明当前没有阻塞中的进程;
用在离开共享资源之后
必须成对出现
信号
信号是进程间通信机制中唯一的异步通信机制
用于一些异常情况下的进程间通信
数据结构一般就是一个数字(时间编号)
进程需要为信号设置相应的监听处理,当收到特定信号时,执行相应的操作
socket
跨网络与不同主机上的进程之间通信
0 条评论
下一页