文章目录
- 一、进程
- 1.进程的一些概念
- 2.进程模型
- (3)进程和程序的关系
- 3.进程的创建:4种
- (a)前台进程与后台进程的区别
- (8)Unix和Windows的父子进程之间的关系
- 4.进程的终止:4种
- 5.进程的层次结构
- (1)Unix的进程层次
- (a)Unix进程的特点
- (2)Windows没有进程层次
- 6.进程的状态:运行、就绪、阻塞态
- 7.进程的实现
- (1)进程表process table
- (2)多个进程的中断处理和系统调度的过程
- 8.多道程序设计的模型
- (2)多CPU的话,才可以用多道程序设计模型来看,并且假设了多个进程在内存中是独立的
- (3)单CPU的话,内存中的不同进程不是互相独立的
- 二、线程
- 1.线程的使用
- (1)进程和线程的关系?
- (3)多进程和多线程的区别?
- (5)web服务器多线程的eg
- (a)多线程web服务器
- (b)单线程web服务器
- (c)有限状态机web服务器
- (d)单线程、多线程和有限状态机web服务器的不同点:
- (e)多线程的同步执行
- 2.经典的线程模型
- (1)进程是把资源集中到一起,线程则是在CPU上被调度执行的实体,why?
- (2)线程被称之为轻量级进程lightweight process,why?
- (3)线程和进程差别,很实在!!?
- (4)线程的三个状态以及各状态间的转换
- 3.POSIX线程——线程源码pthread解析
- (2)一些pthread的函数调用介绍
- (ii)线程和进程在源码上的区别:pthread_yied?
- 4.在用户空间中实现线程(因为操作系统不支持线程)
- (2)将线程包放在用户空间的优点
- (c)优点3:线程包既可以由用户空间管理,也可以由内核管理。进程表只能由内核管理——进程和线程大区别!!?
- 5.在内核中实现线程(因为操作系统支持线程)
- (1)用户级线程包和内核级线程包的区别:5个
- 6.用户级线程与内核级线程的混合实现
- 7.调度程序的激活机制:用户级线程的改良
- 8.弹出式线程
- (3)在内核空间和用户空间运行弹出式线程的区别
- 9.如何将单线程的代码写成多线程?
- (3)将单线程写成多线程的要求
- 三、进程间的通信:同样的问题和结局方法也适用于线程
- 1.竞争条件
- (2)共享数据(共享变量)指:
- 2.临界区:2个进程不同时处于临界区来避免竞争条件
- (3)保证并发进程能正确高效地使用共享数据,需要满足以下4个条件:
- 3.忙等待的互斥:以多进程的临界区为基础
- (a)用于忙等待的锁,称之为自旋锁
- (a)测试并加锁(TSL,test and set lock):需要硬件支持
- (c)TSL如何防止两个进程同时进入临界区:enter_regin
- 4.睡眠与唤醒
- (1)Peterson解法和TSL,XCHG解法的缺点:会出现优先级反转问题
- (2)进程间的通信原语:sleep和wakeup
- (3)用sleep和wakeup解决含有严重竞争条件的生产者与消费者问题
- 5.信号量
- (1)信号量含义:用一个整型变量来累计唤醒次数
- (2)down和up(P和V操作)分别为一般化的sleep和wakeup操作;原子操作的含义
- (3)用信号量解决生产者与消费者问题
- (a)使用TSL或XCHG指令来防止几个CPU同时访问一个信号量
- (c)信号量的另一用途是实现同步
- 6.互斥量:简化版的信号量
- (b)用户级线程包的mutex_lock和mutex_unlock代码
- (c)mutex_lock代码与enter_region的区别
- (2)快速用户区互斥量futex
- (3)pthread中的互斥量:同步线程的函数
- (c)条件变量:pthread的另一种同步机制
- (d)用互斥量和条件变量解决生产者和消费者问题(利用线程解决生产者和消费者问题)
- 7.管程
- 8.消息传递
- 9.屏障
- 10.避免锁:读-赋值-更新
- 四、调度
- 五、经典的IPC问题
- 六、有关进程与线程的研究
- 七、小结
一、进程
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问题
六、有关进程与线程的研究
七、小结