前言

在你立足处深挖下去,就会有泉水涌出!别管蒙昧者们叫嚷:“下边永远是地狱!”


博主的github,平常所写代码皆在于此

​刷题求职神器​

共勉:talk is cheap, show me the code

作者是爪哇岛的新手,水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!


刷题求职神器

在下给诸位推荐一款巨好用的刷题求职神器,如果还有小伙伴没有注册该网站,可以点击下方链接直接注册,注册完后就可以立即刷题了。

《计算机操作系统-第四章》之进程_数据

传送门:​​牛客网​

文章目录

1.进程

2.为什么需要进程?

先来思考一个问题,什么是程序?程序等于数据+指令,举个例子,qq具有删除好友的功能,当你高兴时好友就是躺在列表中的数据(本质上是数据,只不过为了用户体验,整了图形化),当你不高兴了你就可以把他删除(指令)了。在早期时计算机只是处理单道程序,即CPU为它服务,内存被它一个人占了,IO设备也是为了服务,总之在一个程序在内存中运行时,计算机的一切都是它的,而程序被加载到了内存中其实它有2个去处,一个是位于低地址处的程序段(保存指令序列),一个是位于高地址处的数据段(存放程序中的数据)。随着多道程序设计的引入,内存中同时可以放入多道程序,各个程序的代码,运算数据存放的位置不同。并且程序又是并发的执行,那么操作系统是怎么找到各程序存放的位置?除此之外系统中的IO设备以及其它的资源都有可能分配给不同的程序而每一个运行的程序分配了什么样的资源这些信息也是需要被记录下来,这样才能方便操作系统的管理,因此引入了进程,进程实体的概念。操作系统会给每一个即将执行的程序配置一个数据结构(链表),称为进程控制块(PCB),用来描述进程的各种信息(进程代码存放的位置,资源分配情况)

3.什么是进程?

程序段,数据段,PCB三部分组成了进程实体(进程映像)。一般情况,进程实体就是进程。简单而言进程就是一个正在运行的程序,当双击qq的可执行文件(exe),操作系统就会把该程序加载到内存中,然后再分配各种各样的资源,这个exe程序就跑来了,所以进程就是一个正在跑的程序或者是一个任务。

可以打开电脑上的任务管理器.就能查看我们电脑的进程

《计算机操作系统-第四章》之进程_数据结构_02

注意

  1. 所谓的创建进程,实质是创建了进程实体中的PCB;而撤销进程,实质上是撤销进程实体中的PCB
  2. PCB的进程存在的唯一标识
  3. 进程是操作系统分配资源的基本单位
  4. 进程实体和进程并不一样,进程实体是静态的,进程则是动态的。

4.进程的组成

进程(进程实体)由程序段,数据段,PCB三部分组成,如下图所示。

《计算机操作系统-第四章》之进程_jvm_03

4.1PCB中的部分属性

进程标识符PID:当进程创建时,操作系统会为该进程分配一个唯一的,不重复,用于不同区别进程。

用户标识符UID:标识进程的用户

各种寄存器的值:当进程需要切换时需要把当前的进程运行情况记录下来保存在PCB中,此操作相当于魔兽世界玩到一半不玩了,为了下次能继续玩就得存档,进程也是如此,可能程序执行到一半,数据处理到一半,为了下次能接上所以需要保存。

内存指针:指明该进程的指令存放位置,数据存放位置以及维护运行转态。

文件描述表:文件描述表可以看做是一个结构体数组,数组内容则是存放进程打开文件后以及操作文件(存放在硬盘上的数据)的信息。数组的下标则是文件描述符。

下面一些属性时有关进程调度的

进程调度

首先要明确进程调度的最小单位是线程,而进程是包含下线程的,接下来为了更加方便的说明进程的调度,就假设此处的进程有且只有一个线程,这样就可以将线程的调度试做进程的调度。操作系统作为计算机的管理者,在线程的调度上堪称时间管理大师以及海王。假设目前有三个线程A,B,C分别看做是最帅的男人,最有前的男人,最会舔的男人。而操作系统则是有才华,有颜值的小姐姐。因为小姐姐是海王,想和这三个男孩子谈恋爱,但是她又不能让男孩子认为她是渣女,所以就提前规划好与这些男孩子的约会时间,并用小本本记录下来以及记录她和三个男孩子之间的一些事,避免日后翻车。因为小姐姐特别喜欢有钱的,其次是帅的,然后是会舔的。所以她对三者有着明确的优先级,因此将周一至周三的时间和有钱的男孩子逛街,周四和周六和最帅的男孩子玩,周天呢就和会舔的男孩子聊天。这就是进程的调度。

进程的优先级:像上述列子,就是操作系统将进程排好等级,优先级高的先执行 ,优先级低的后执行。

进程的上下文:进程可能执行到一半就暂停实行了,因此需要保存当前的状态,以便后续进程再次被调度时,能够接着执行。

进程的记账信息:统计进程的执行时间,进程的执行指令的条数等,是进程都尽可能的都被调度,也就是雨露均沾。

5.进程的组织

在一个操作系统中,通常有上百乃至上千个PCB。因此需要对进行有效的管理。进程的组织有两种组织方式,一种是链接方式,一种是索引方式。

5.1链接方式

按照进程状态将PCB分为多个队列。操作系统持有指向各个队列的指针。如下图所示。

《计算机操作系统-第四章》之进程_数据_04

5.2索引方式

1根据进程状态不同,建立索引表。2操作系统持有执行各个索引表的指针。如下图所示。

《计算机操作系统-第四章》之进程_数据结构_05

6.进程的特征

  1. 动态性:进程是程序的一次执行过程,是动态地产生,变化和消亡的。
  2. 并发性:内存中有多个进程实体,各进程可并发执行。
  3. 独立性:进程是能独立运行,独立获得资源,独立接收调度的基本单位
  4. 异步性:各进程各自独立的,不可预知的速度向前推进,操作系统系统要提供“进程同步机制”来解决异步问题
  5. 结构性:每个进程都会配置一个PCB。结构上来看,进程由程序断,数据段,PCB组成

7.进程的状态

进程是程序的一次运行。在这个运行的过程中,有的进程正在被CPU处理,有的进程需要等待CPU服务,由此可见,进程的状态是会有各种各样的变化。为了对个个进程进行管理,操作系统将进程合理的划分为几种状态。

7.1进程的基本状态

  1. 创建态:进程正在被创建,操作系统为该进程分配时所需的内存空间等系统资源,并为其创建,初始化PCB。
  2. 运行态:占用CPU,并在CPU上运行。
  3. 就绪态:已具备运行条件(分配好了资源),但由于没有闲置的CPU,而暂时不能运行。
  4. 阻塞态(等待态):因等待某一事件而暂时不能运行。(如等待系统分配打印机)。
  5. 终止态:进程运行结束或者由于bug导致进程无法继续工作下去,如数组越界错误等。此时需要撤销进程,操作系统回收进程拥有的资源,撤销PCB。

7.2进程状态的转换

进程间的转换如图所示

《计算机操作系统-第四章》之进程_数据结构_06

注意

  1. 运行态—>阻塞态是一种进程自身做出的主动行为
  2. 阻塞态—>就绪态是不受进程自身所控制的,是一种被动行为
  3. 不能由阻塞态直接转换成运行态,也不能由就绪态直接转换成阻塞态(进入阻塞态是进程主动请求的,必然需要进程在运行时才能发出请求)

8.进程控制

简单理解,进程控制就是要实现进程状态转换

图解进程的组织

《计算机操作系统-第四章》之进程_原语_07

说明

首先创建进程,有了进程后需要修改PCB的内容和相应的队列就可以从创建态–>就绪态,进程处于就绪态时就可以被调度和切换,当就绪态–>运行态也需要修改PCB内容以及调整到相应的队列,运行态的进程如若正常完成或者异常结束,都需要回收资源以及撤销PCB。而运行态–>就绪态或者运行态—>阻塞态需要保存运行环境和需要修改PCB的内容,同时调整到对应的队列。阻塞态–>就绪态同样也是修改PCB内容和相应队列。上述的进程状态的切换都涉及PCB的修改以及出队入队的操作,假如一旦这些操作出了问题,就会导致进程的崩溃。为了准确的实现进程的切换,原语就产生了。

8.1原语

原语采用关中断指令和开中断指令实现

在执行原语代码之前会先执行关中断指令然后执行原语代码,指向原语代码过程中如果收到了外部中断信号会被直接忽略,当执行完开中断指令后外部信号才会被接收进而运行中断程序。

8.1.1进程的创建

创建原语

步骤如下

  1. 申请空白的PCB
  2. 为新进程分配所需资源
  3. 初始化PCB
  4. 将PCB 插入到就绪队列

引起进程创建的事件

  1. 应用请求:由用户进程主动请求一个子进程
  2. 作业调度:多道批处理系统中,有新的作业放入内存时,会为其建立一个新的进程

8.1.2进程的终止

撤销原语

步骤如下

  1. 从PCB集合中找到终止线程的PCB
  2. 若进程正在运行,立刻剥夺CPU,将CPU分配给其它进程
  3. 终止其所有至子线程
  4. 将该进程拥有的所有资源归还给父进程或者操作系统
  5. 删除PCB

引起进程终止的事件

  1. 正常结束
  2. 异常结束(数组索引越界)
  3. 外界干预(使用任务管理器杀死进程)

8.1.3进程的阻塞

步骤如下

  1. 找到要阻塞的进程对应的PCB
  2. 保护进程运行环境,将PCB转态信息设置为阻塞态,暂时停止进程运行
  3. 将PCB插如相应事件的等待队列

引起进程阻塞的事件

  • 需要等待系统分配某种资源
  • 需要等待相互合作的其他进程完成工作

8.1.4进程的唤醒

步骤如下

  1. 在等待队列中找到PCB
  2. 将PCB从等待队列中移除,设置进程为就绪态
  3. 将PCB插入到就绪队列,等待被调度

引起进程唤醒的事件

  • 等待事件的发生

8.1.5总结原语

无论何种原语,都是做一下三件事

  1. 更新PCB中的信息(如修改进程转态标志,将运行环境保存到PCB,从PCB恢复运行环境)
  • 所有的进程控制原语一定会修改进程转态标志
  • 剥夺当前运行进程的CPU使用权必然需要保存其运行环境
  • 某进程开始运行前必然要恢复其运行环境
  1. 将PCB插入到合适的队列
  2. 分配/回收资源

9.进程间通信

字面意思就是进程之间的信息交换

9.1为什么需要进程通信?

因为各个进程所有的内存地址空间是相互独立的,一个进程是不能直接访问另一个进程的地址空间。但是进程之间的信息交换又是必须是实现的,为了保证进程间的安全通信,操作系统提供了一些解决方法。

9.2共享存储

两个进程对共享空间的访问必须是互斥的。当进程1在往共享空间里面写数据时,进程2是不被允许访问该空间。

《计算机操作系统-第四章》之进程_java_08

共享空间

1.基于数据结构的共享

比如共享空间里面只能存放一个长度为10的数组。这种方式速度慢,是一种低级通信方式。

2.基于存储区的共享

在内存中划分出一块专门共享的存储区,里面的数据形式,存放的位置都由进程控制。相对于基于数据结构的共享,此种方式速度快,是一种高级通信。

9.3管道通信

管道是指用于连接读写进程的一个共享文件。本质是在内存开辟一个大小固定的缓冲区。

《计算机操作系统-第四章》之进程_数据_09

注意

  1. 各进程要互斥地访问管道
  2. 管道只能采用半双工通信,某段时间只能实现单向的传输。如果要实现双向同时通信,则需要2根管道
  3. 如果没写满,不允许读。如果没读空,不允许写。
  4. 数据一旦被读出,就意味着管道中已经不存在该数据了,所以读进程最多只能有一个,否则可能会有读错数据的情况。
  5. 数据以字符流的形式写入通道,当通道写满时,写进程的write()系统调用将被阻塞.等待读进程将数据取走。当读进程将数据全部取走后。管道变空,此时读进程的read()系统调用将会被阻塞。

9.4消息通信

进程间的数据交换以格式化的消息为单位。进程通过操作系统提供的发送消息/接收消息两个原语进行数据交换

格式化消息包含2部分,一部分为消息头,一部分为消息体。其中消息头包含发送进程ID,接收进程ID,消息类型等信息

9.4.1直接通信

进行1若给向进程2传递信息,首先会创建格式化信息,然后通过发送原语告知进程2,进程2使用接收原语,将进程1产生的格式化消息插入进程2的消息缓冲队列中的队列.然后进程2依次接收消息对列中的消息。

9.4.2间接通信

消息要发送中间实体(信箱)中,因此这种方式也被称为信箱通信方式。举个栗子,进程1通过发送原语将消息传递到信箱中,然后进程2使用接收原语从信箱中拿到属于自己的消息。