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