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. 由现有进程派生子进程
进程被创建的场景
1. 给新进程分配一个进程ID2. 分配内存空间3. 初始化PCB4. 进入就绪队列
进程的初始化过程
创建状态
就绪
运行
阻塞
结束
状态
就绪到运行:当操作系统内存在着调度程序,当需要运行一个新进程时,调度程序选择一个就绪态的进程,让其进入运行态。
运行到就绪:运行态的进程,会占有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 中的 |
通信范围是存在父子关系的进程
随进程的创建而建立,随进程的结束而销毁。
匿名管道,用完了就销毁
数据是先进先出的传输方式。
可以在不相关的进程间也能相互通信
他提前创建了一个类型为管道的设备文文件,在进程里只要使用这个设备文件,就可以相互通信。
命名管道
特点:通信方式效率低,不适合进程间频繁地交换数据。
管道
消息队列是保存在内核中的消息链表
可以用于频繁的交换数据
消息队列生命周期随内核,如果没有释放消息队列或者没有关闭操作系统,消息队列会一直存在
缺点:消息队列通信过程中,存在用户态与内核态之间的数据拷贝开销
消息队列
避免了发生用户态与内核态之间的消息拷贝过程
共享内存的机制,就是拿出一块虚拟地址空间来,映射到相同的物理内存中。这样这个进程写入的东西,另外一个进程马上就能看到了,都不需要拷贝来拷贝去,传来传去,大大提高了进程间通信的速度。
缺点:如果多个进程同时修改同一个共享内存,很有可能就冲突了。
共享内存
为了防止多进程竞争共享资源,而造成的数据错乱,所以需要保护机制,使得共享的资源,在任意时刻只能被一个进程访问
一个整型的计数器,主要用于实现进程间的互斥与同步
信号量 < 0,则表明资源已被占用,进程需阻塞等待;
信号量 >= 0,则表明还有资源可使用,进程可正常继续执行。
用在进入共享资源之前
P 操作(信号量减去 -1)
信号量 <= 0,则表明当前有阻塞中的进程,于是会将该进程唤醒运行;
信号量 > 0,则表明当前没有阻塞中的进程;
用在离开共享资源之后
V 操作(信号量减去 +1)
必须成对出现
原子操作
信号量
信号是进程间通信机制中唯一的异步通信机制
用于一些异常情况下的进程间通信
数据结构一般就是一个数字(时间编号)
进程需要为信号设置相应的监听处理,当收到特定信号时,执行相应的操作
信号
跨网络与不同主机上的进程之间通信
socket
进程间通信
进程
进程和线程
0 条评论
回复 删除
下一页