允许多个程序同时进入内存并运行,提高的利用率,目的是提高系统效率
a图内存中有四个程序,串行执行,因为这里只有一个程序计数器。 当有了多道程序技术之后就得到了b图,每个程序各自独立的占用一个逻辑程序计数器,达到并发执行效果 从c图中可以看到多个程序是轮流执行的
并发环境指一段时间间隔内,单处理器上有两个或两个以上的程序同时处于开始运行但尚未结束的状态,并且次序不是事先确定的。在并发环境下执行的程序就是并发程序。
进程是具有独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的独立单位
特征
组成
①程序 描述进程要完成的功能 ②数据集合 程序在执行时所需要的数据和工作区。 ③程序控制块PCB 包含进程的描述信息和控制信息。它是进程存在的唯一标志。
1.4.1 PCB中需要保存的信息
1.4.2 换个角度看PCB的内容
说明:从上图中可以看到第一列是和进程管理相关的字段,第二列是存储管理的字段,第三列是文件管理的字段。
说明:这里使用创建一个进程。浅度睡眠和深度睡眠不同在于前者在睡眠时会接收信号,而后者则不会。正在运行的程序可能因为调试断点可能出现一个暂停的状态。
说明:真实情况下,就绪态也是排多个队列。而等待态由于各自产生的原因(事件)不同而排不同的队列。
进程控制操作完成进程各状态之间的转换,由具有特定功能的原语(其实就是程序,只是这些程序不许与被中断)完成。
原语:完成某种特定功能的一段程序,具有不可分割性或不可中断性,即原语的执行必须是连续的,在执行过程中不允许被中断。又称原子操作。
结束进程
处于运行状态的进程,在其运行过程中期待某一事件发生,如等待键盘输入、等待磁盘数据传输完成、等待其他进程发送消息。当被等待的事件未发生时,由进程自己执行阻塞原语,使自己由运行态变为阻塞态。在中我们使用,在中使用。
中实现:
操作系统为每个进程分配了一个地址空间
这个程序我们从命令行中输入数据,比如:
此时我们会发现虽然进程不同,但是打印出来的地址确实一样的。这里我们从进程地址空间来分析:
说明:上面的两个进程都有这样一个地址空间,也就是说这两个进程是在不同的地址空间上的相同的位置,所以虽然地址是一样的,但是实际上在实际内存中的地址是不一样的。
对进程执行活动全过程的静态描述(快照)。由进程地址空间内容、硬件寄存器内容及与该进程相关的内核数据结构、内核栈组成
引入理由
6.1.1 应用的需要
我们看一个例子,一个服务器的工作方式
可以看到每次从磁盘读取的时候进程都是暂停的,这样会导致性能低下,那如何提高服务器的工作效率?通常情况下是使用网页缓存,在没有线程情况下的两种解决方案
多线程的解决方式
说明:这是一个多线程的服务器的工作方式,首先读取客户端的请求,之后由分派线程将各个任务分派给工作线程,这里还是采用了网页缓存
于是我们可以看到一个服务器的实现有三种方式:
6.1.2 开销的考虑
6.1.3 性能的考虑
如果有多个处理器的话,一个进程就会有多个线程同时在执行了,这样可以极大的提高运行性能
属性
一般有三种实现机制
6.3.1 用户级线程
线程是由运行时系统管理的,在内核中只有进程表。典型例子就是 POSIX线程库--PTHREAD
6.3.2 核心级线程
6.3.3 混合模型
0)新建:创建后尚未启动 1)运行:包括了 OS 中 Running 和 Ready 状态,也就是处于此状态的线程可能正在运行,也可能正在等待 cpu 为它分配执行时间 2)无限期等待:处于这种状态的线程不会被分配 cpu 执行时间,要等待其他线程显示唤醒。以下方法会让线程进入无限期等待 :
3)有限期的等待:处于这种状态的线程也不会被分配 cpu 执行时间,不过无需等待被其他线程显示唤醒,而是在一定时间后,他们会由 OS 自动唤醒 1.设置了 timeout 的 object.wait() 方法 2. 设置了 timeout 参数的 Thread.join() 3.LockSupport.parkNanos() 4.LockSupport.parkUnit() 4) 阻塞:与"等待"的区别:
基本概念
一种程序结构,结构内的多个子程序(或)形成的多个互斥访问共享资源。 这些共享资源一般是或一群。 管程实现了在一个时间点,最多只有一个在执行管程的某个。与那些通过修改数据结构实现互斥访问的并发程序设计相比,管程实现很大程度上简化了程序设计。
管程提供了一种机制,线程可以临时放弃互斥访问,等待某些条件得到满足后,重新获得执行权恢复它的互斥访问。
临界区管理的基本原则 ①如果有若干进程要求进入空闲的临界区,一次仅允许一个进程进入。 ②任何时候,处于临界区内的进程不可多于一个。如已有进程进入自己的临界区,则其它所有试图进入临界区的进程必须等待。 ③进入临界区的进程要在有限时间内退出,以便其它进程能及时进入自己的临界区。 ④如果进程不能进入自己的临界区,则应让出CPU,避免进程出现“忙等”现象。
一组进程中,每个进程都无限等待被该组进程中另一进程所占用的资源,因而永远无法得到的资源,这种现象称为进程死锁,这一组进程就称为死锁进程
资源数量有限、锁和信号量错误使用。
说明:
image.png
用有向图描述系统资源和进程的状态
化简步骤:
3.2.1 破坏“互斥使用/资源独占”条件
3.2.2 破坏“占有且等待”条件
3.2.3 破坏“不可抢占”条件
只适用于状态易于保存和恢复的对主存资源和处理器资源的分配适用于资源。如和内存等。
3.2.4 破坏“循环等待”条件
存在下述严重问题: 限制了新类型设备的增加。 造成对资源的浪费。 必然会限制用户简单、自主地编程。
这是在年提出的,是仿照银行发放贷款时采取的控制方式而设计的一种死锁避免算法。
当进程提出资源申请时,系统执行下列步骤:
(1)若,转(2);否则,报错返回。
(2)若,转(3);否则,报错返回。
(3)假设系统分配了资源,则有:
`Work = Work + Allocation[i] ; 转(2)
(4)若对所有,则系统处于安全状态,否则,系统处于不安全状态。
发生死锁后重要的是以最小的代价恢复系统的运行。方法如下:
image.png
image.png
image.png
image.png
image.png
image.png
到此这篇进程控制块是进程存在的唯一标志对吗(进程控制块是描述进程状态和特征的数据结构一个进程)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/sjkxydsj/80860.html