《现代操作系统 第4版》第2章 进程与线程——大总结

文章目录

一、进程

1.进程的一些概念

(1)即使可以使用的CPU只有一个,但进程也具有支持(伪)并发的能力,它们将一个单独的CPU变换成多个虚拟的CPU。

(2)支持多进程的多道程序系统与多处理器系统的区别

支持多进程的多道程序系统:伪并行
在这里插入图片描述
在这里插入图片描述

多处理器系统:真正的硬件并行
指的是:该系统有两个或多个CPU共享同一个物理内存。

2.进程模型

(1)进程process的含义:

  • 计算机上所有可运行的软件,通常也包括操作系统,被组织成若干顺序进程(sequential process,简称为进程proces;
  • 一个进程就是一个正在执行程序的实例,包括程序计数器、寄存器和变量的当前值;
  • 从概念上将,每个进程拥有它自己的虚拟CPU。实际真正的CPU在各进程间来回切换;

(2)用逻辑程序计数器与物理程序计数器来说明进程
注:下面的图有4个逻辑程序计数器,即4个进程,在内存中;
一个物理程序计数器,即1个CPU;
在这里插入图片描述
解释说明如下:
在这里插入图片描述

(3)进程和程序的关系

(a)一个进程是某种类型的一个活动,他有程序、输入、输出以及状态。 单个处理器可以被若干进程所共享,它使用某种调度算法解决何时停止一个进程的工作,并转而为另一个进程提供服务。
(b)如果一个程序运行了两边,则算作是两个进程。
在这里插入图片描述

3.进程的创建:4种

(1)第1种:启动操作系统

(a)前台进程与后台进程的区别

在这里插入图片描述
(2)第2种:正在运行的程序执行了创建进程的系统调用

  • 一个正在运行的进程经常发出系统调用,以便创建一个或多个新进程协助其工作。
  • 在多处理机中,让每个进程在不同的CPU上运行会使整个作业运行得更快。

(3)第3种:用户请求创建一个新进程

  • 在交互式系统中,键入一个命令或者双击一个图标就可以启动一个程序。这两个动作中的任何一个都会开始一个新的进程,并在其中运行所选择的程序。

(4)第4种:一个批处理作业的初始化

  • 该情形仅仅在大型机的批处理系统中应用。

(5)总结
上述的所有情形,新进程都是由于一个已存在的进程执行了一个用于创建进程的系统调用而创建的。

(6)Unix系统调用过程
在这里插入图片描述

(7)Windowx系统调用过程
在这里插入图片描述

(8)Unix和Windows的父子进程之间的关系

在这里插入图片描述

4.进程的终止:4种

(1)正常退出(自愿的)

  • 在Unix中调用的是exit
  • 在Windows调用的是ExitProcess

(2)出错退出(自愿的)

(3)严重错误(非自愿的)

(4)被其他进程杀死(非资源的)
(a)含义:某个进程执行一个系统调用通知操作系统杀死某个其它进程
(b)

  • 在Unix中,这个系统调用是kill
  • 在Win32中,对应的函数是TerminateProcess

5.进程的层次结构

(1)Unix的进程层次

在这里插入图片描述

(a)Unix进程的特点

(i)
在这里插入图片描述
(ii)Unix中,进程不能剥夺其子进程的“继承权”。

(2)Windows没有进程层次

在这里插入图片描述

6.进程的状态:运行、就绪、阻塞态

(1)进程的三种状态的状态图如下:
在这里插入图片描述
说明:
在这里插入图片描述

(2)操作系统的理想构造方式
在这里插入图片描述
说明:
在这里插入图片描述

7.进程的实现

(1)进程表process table

(a)为了实现进程模型,操作系统维护着一张表格(一个结构数组),即进程表。
(b)进程表的内容如下:
在这里插入图片描述
进程表的内容说明:
(a)每个进程占用一个进程表项
(b)在这里插入图片描述

(2)多个进程的中断处理和系统调度的过程

(a)
在这里插入图片描述
(b)一个进程在执行过程中可能被中断数千次,但关键是每次中断后,被中断的进程都返回到与中断发生前的完全相同的状态。

8.多道程序设计的模型

(1)采用多道程序设计可以提高CPU的利用率

(2)多CPU的话,才可以用多道程序设计模型来看,并且假设了多个进程在内存中是独立的

CPU利用率是内存中进程数目的函数
在这里插入图片描述
说明:
(a)
在这里插入图片描述
(b)
在这里插入图片描述

(3)单CPU的话,内存中的不同进程不是互相独立的

在单CPU中,不能同时运行3个进程,所以当CPU忙时,已就绪的进程必须等待CPU。因而,进程不是独立地。

二、线程

1.线程的使用

(1)进程和线程的关系?

  • 每个进程有一个地址空间和一个控制线程
  • 经常存在同一个地址空间中准并行运行多个控制线程

(2)人们需要多线程的主要原因?
在这里插入图片描述

(3)多进程和多线程的区别?

  • 多线程拥有共享同一个地址空间和所有可用数据的能力,多进程模型具有不同的地址空间
  • 需要多线程的理由是,线程比进程更轻量级,线程比进程更容易创建,也更容易撤销
  • 如果存在大量的计算和IO处理,多线程比多进程快

(4)用以说明多线程与多进程区别的一个eg:
假设你用word写一本书
假设每个线程的功能如下:
在这里插入图片描述

在这里插入图片描述
说明:
在这里插入图片描述

(5)web服务器多线程的eg

(a)多线程web服务器

在这里插入图片描述
(i)该多线程web服务器的说明如下
注意Web高速缓存cache,分派程序(dispatcher),工作线程(worker thread)的意思
在这里插入图片描述
在这里插入图片描述
(ii)多线程web服务器代码怎么写
在这里插入图片描述

(b)单线程web服务器

在这里插入图片描述
在这里插入图片描述

(c)有限状态机web服务器

在这里插入图片描述

(d)单线程、多线程和有限状态机web服务器的不同点:

在这里插入图片描述

(e)多线程的同步执行

在这里插入图片描述

2.经典的线程模型

(1)进程是把资源集中到一起,线程则是在CPU上被调度执行的实体,why?

在这里插入图片描述
在这里插入图片描述

(2)线程被称之为轻量级进程lightweight process,why?

在这里插入图片描述

(3)线程和进程差别,很实在!!?

(a)
在这里插入图片描述
说明:
(i)
在这里插入图片描述
在这里插入图片描述
(ii)

  • CPU在线程之间的快速切换,制造了线程并行运行的假象
  • CPU在多进程之间的快速切换,制造了多进程并行运行的假象

(b)每个进程与每个线程的内容对比
在这里插入图片描述
说明:
(i)
在这里插入图片描述
在这里插入图片描述
(ii)线程概念图实现的是,共享一组资源的多个线程的执行能力,以便这些线程可以为完成某一任务而共同工作

(4)线程的三个状态以及各状态间的转换

在这里插入图片描述
说明:
(a)
在这里插入图片描述
在这里插入图片描述
(b)
在这里插入图片描述

3.POSIX线程——线程源码pthread解析

(1)能够可移植的线程程序,就是线程包pthread

(2)一些pthread的函数调用介绍

(a)每一个线程的特点是
在这里插入图片描述
(b)
在这里插入图片描述
说明:
(i)pthread_create,pthread_exit,pthread_join
在这里插入图片描述

(ii)线程和进程在源码上的区别:pthread_yied?

在这里插入图片描述

(iii)pthread_attr_init,pthread_attr_destroy
在这里插入图片描述

(iiii)使用pthread源码编写的一个函数
在这里插入图片描述
在这里插入图片描述

4.在用户空间中实现线程(因为操作系统不支持线程)

(1)有两种主要的方法实现线程包:在用户空间和在内核
在这里插入图片描述
说明:
在这里插入图片描述
在这里插入图片描述

(2)将线程包放在用户空间的优点

(a)优点1:将线程包放在用户空间,内核对线程包一无所知,用户线程包可以在不支持线程的操作系统上实现。可以通过函数库实现线程。

(b)优点2:只要堆栈指针和程序计数器一被切换,新的线程就又自动投入运行。

(c)优点3:线程包既可以由用户空间管理,也可以由内核管理。进程表只能由内核管理——进程和线程大区别!!?

在这里插入图片描述
(d)优点4:用户级线程还允许每个进程有自己定制的调度算法。

(3)用户级线程包的缺点
(a)缺点1:
在这里插入图片描述
解决方式:
在这里插入图片描述
(b)缺点2:
在这里插入图片描述

5.在内核中实现线程(因为操作系统支持线程)

(1)用户级线程包和内核级线程包的区别:5个

(a)如4.在用户空间中实现线程的图所示,内核级线程包不再需要运行时系统,每个进程中也没有线程表。而是在内核中,有用来记录系统所有线程的线程表。

(b)
在这里插入图片描述
(c)
在这里插入图片描述
(d)由于在内核中创建或撤销线程的代价比较大,某些系统采用“环保”的处理方式,回收其线程;
在用户级线程中线程回收也是可能的,但是由于其线程管理的代价很小,所以没有必要进行这项工作。

(2)内核级线程的优缺点
在这里插入图片描述

6.用户级线程与内核级线程的混合实现

(1)用户级线程与内核级线程的多路复用
在这里插入图片描述
说明:
在这里插入图片描述

7.调度程序的激活机制:用户级线程的改良

(1)由于内核级线程在一些关键点上优于用户级线程,但是内核级线程的速度慢,所以提出了调度程序激活机制scheduler activation

(2)调度程序激活机制的含义如下:
在这里插入图片描述

8.弹出式线程

(1)传统处理服务请求的方法
在这里插入图片描述
(2)弹出式线程处理拂去请求的方法
在这里插入图片描述
在这里插入图片描述

(3)在内核空间和用户空间运行弹出式线程的区别

在这里插入图片描述

9.如何将单线程的代码写成多线程?

问题:
在这里插入图片描述
在这里插入图片描述
解决方法如下:
(1)方法1:为每个线程赋予其私有的全局变量
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
(2)方法2:引入新的库过程
在这里插入图片描述
为啥要重写库?
将单一线程程序转为多线程程序的问题是:有许多库过程并不是可重入的。

(3)将单线程写成多线程的要求

给已有的系统引入线程而不进行实质性的重新设计系统是根本不行的。至少可能需要重新定义系统调用的语义,并且不得不重写库。而且所有这些工作必须在一个进行中有一个线程的原有程序向后兼容。

三、进程间的通信:同样的问题和结局方法也适用于线程

(1)进程间通信Inter Process Communication,IPC
在这里插入图片描述

1.竞争条件

(1)含义:
两个或多个进程读写某些共享数据,而最后的结果取决于进程运行的精确时序,则称之为竞争条件race condition

竞争条件也可以这样理解(更好):在进程A对共享变量的使用未结束之前,进程B就使用它。

(2)共享数据(共享变量)指:

协作的进程能读写的公用存储区,该公用存储区可能在内存中(内核数据结构中),也可能是一个共享文件。

(3)调式包含有竞争条件的程序是一件很头疼的事情。大多数的测试运行结果都很好,但是在极少数情况下会发生一些无法解释的奇怪现象。不幸的是,多核带来的并行使得竞争条件越来越普遍

2.临界区:2个进程不同时处于临界区来避免竞争条件

(1)如何避免竞争条件?
在这里插入图片描述
(2)临界区域critical region含义
在这里插入图片描述

(3)保证并发进程能正确高效地使用共享数据,需要满足以下4个条件:

在这里插入图片描述
(4)使用临界区互斥的eg
在这里插入图片描述

3.忙等待的互斥:以多进程的临界区为基础

在这里插入图片描述
(1)屏蔽中断:不好
(a)操作如下:
在这里插入图片描述
(b)缺点
在这里插入图片描述
在这里插入图片描述

(2)锁变量
(a)含义:
在这里插入图片描述
(b)缺点:
在这里插入图片描述

(3)严格轮换法:

(a)用于忙等待的锁,称之为自旋锁

含义如下:
在这里插入图片描述
(b)当一个进程比另一个慢了很多的情况下,轮流进入临界区并不是一个好办法。因为这种情况违反了前面的条件3:进程0被一个临界区外的进程阻塞了。

(4)Peterson互斥算法
(a)
在这里插入图片描述
(b)解释如下:
在这里插入图片描述

(5)TSL指令

(a)测试并加锁(TSL,test and set lock):需要硬件支持

在这里插入图片描述
在这里插入图片描述
(b)如何使用TSL指令?
在这里插入图片描述

(c)TSL如何防止两个进程同时进入临界区:enter_regin

在这里插入图片描述
(d)可替代TSL的指令是XCHG
在这里插入图片描述

4.睡眠与唤醒

(1)Peterson解法和TSL,XCHG解法的缺点:会出现优先级反转问题

在这里插入图片描述
在这里插入图片描述

(2)进程间的通信原语:sleep和wakeup

在这里插入图片描述

(3)用sleep和wakeup解决含有严重竞争条件的生产者与消费者问题

(a)问题描述:
在这里插入图片描述
(b)解决方案:
在这里插入图片描述
解释如下:
在这里插入图片描述

5.信号量

(1)信号量含义:用一个整型变量来累计唤醒次数

在这里插入图片描述

(2)down和up(P和V操作)分别为一般化的sleep和wakeup操作;原子操作的含义

在这里插入图片描述

(3)用信号量解决生产者与消费者问题

(a)使用TSL或XCHG指令来防止几个CPU同时访问一个信号量

在这里插入图片描述

(b)具体解决方案如下
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(c)信号量的另一用途是实现同步

在这里插入图片描述

6.互斥量:简化版的信号量

(1)概念
在这里插入图片描述
(a)互斥量的使用过程
在这里插入图片描述

(b)用户级线程包的mutex_lock和mutex_unlock代码

在这里插入图片描述

(c)mutex_lock代码与enter_region的区别

在这里插入图片描述
在这里插入图片描述

(2)快速用户区互斥量futex

(a)futex特点:
在这里插入图片描述
(b)一个futex主要包含2个部分:内核服务+用户库
在这里插入图片描述

(3)pthread中的互斥量:同步线程的函数

(a)基本机制
在这里插入图片描述
(b)与互斥量相关的主要调用函数
在这里插入图片描述
在这里插入图片描述

(c)条件变量:pthread的另一种同步机制

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(d)用互斥量和条件变量解决生产者和消费者问题(利用线程解决生产者和消费者问题)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7.管程

8.消息传递

9.屏障

10.避免锁:读-赋值-更新

四、调度

五、经典的IPC问题

六、有关进程与线程的研究

七、小结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喜欢打篮球的普通人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值