目录
进程
进程定义
进程的特性
进程和程序的区别和联系
进程的状态与转换
进程状态转换
挂起状态和状态转化
进程控制
进程通信
共享存储
消息传递
管道通信
客户机-服务器
套接字
远程过程调用,远程方法调用
线程
线程---作为调度和分派的基本单位
线程和进程的比较
线程的实现
用户级线程
内核支持线程
多线程模型
早期的计算机只支持单道程序,cpu和I/O设备、内存等都只服务于一个程序
现在的计算机引入多道程序处理技术:多核CPU,内存中需要存入多个程序的信息
操作系统要并发执行各个程序,就要找到这个程序的程序段等信息,但是要如何才能找到呢?为了便于操作系统的管理,实现各个程序的并发运行,引入了进程的概念
操作系统在每一个程序执行之前,都会为程序分配一个数据结构,称为进程控制块(PCB),用于描述进程的各种信息
进程实体:PCB,程序段,数据段三部分构成
一般来说,进程实体简称为进程,例如:创建进程实质上指创建进程实体的PCB,撤销进程指撤销进程实体的PCB
PCB是进程存在的唯一标志!!!
从不同的角度可以给出不同的进程定义,较为典型的有三种:
1、进程是程序的一次执行
2、进程是一个程序及其数据在处理机上顺序执行所发生的活动
3、进程是具有独立功能的程序在一个数据集上执行的过程,是系统进行资源分配和调度的一个独立单位
有了进程实体这个概念,我们可以定义进程:进程是程序的运行过程,是系统进行资源分配和调度的一个独立单位
pcb的内容包括:
PCB的组织方式:
系统内可能存在多个PCB,操作系统要将其组织起来,常用的组织方式有三种:
1、线性存储:PCB存储在线性表中
2、连接存储:相同状态的PCB会在队列中组织起来(就绪队列,阻塞队列……)
3、索引存储: 相同状态的PCB会在索引表中存储(就绪索引表,阻塞索引表等……)
1、动态性:进程的实质是程序的执行过程,是动态的
2、并发性:一个进程可以和别的进程并发执行
3、独立性:进程是一个可以独立运行,独立获得资源,独立接收调度的最小单位
4、异步性:进程的执行时间和执行结果不可知
区别:
1、进程是程序的运行过程,是动态的;程序是有序指令的集合,是静态的
2、进程具有并发性;而没有建立PCB的程序,不具备并发性
3、进程是一个可以独立运行,独立获得资源,独立接收调度的最小单位,具有独立性;
而没有建立PCB的程序不能运行,不具备独立性
4、程序是永存的;进程是暂时的,是程序在数据集上的一次执行,有创建有撤销
联系:一个程序可以对应多个进程,但一个进程只能对应一个程序。
进程是程序的一次执行,进程之间是并发的,那么就会存在好几种进程的状态
运行态:单核处理机下:每一时刻最多只有一个cpu处于运行态;双核处理机下:每一时刻最多只有两个cpu处于运行态……
就绪态:进程有了处理机之外的所有资源->万事俱备,只欠CPU(如果系统内有多个处于就绪态的进程,那么经常会使用就绪队列来存储这些进程)
阻塞态:例如等待打印机工作结束,没有CPU和其他资源(如果系统内有多个处于阻塞态的进程,那么经常会使用阻塞队列来存储这些进程,通常根据阻塞原因的不同,设置多个阻塞队列)
进程还可以有两种状态:
创建态:操作系统正在创建进程,为进程分配资源,初始化PCB
终止态:操作系统撤销进程,回收进程的资源,撤销PCB
阻塞态不能直接进入运行态,就绪态也不能直接进入阻塞态
运行态-》阻塞态:通过系统调用,是主动进行的
阻塞态-》就绪态:不受进程控制,被动进行
在许多操作系统中,为了满足系统和用户观察与分析进程的需要,引入了面向进程的主要操作-》挂起,当该操作作用于某一个进程时,那么这个进程将会被挂起,意味着该进程处于静止状态
引入挂起原语和激活原语
进程处于未被挂起的就绪态,称为活动就绪状态,此时这个进程可以接受调度
进程处于未被挂起的阻塞态,称为活动阻塞状态
挂起和阻塞的区别:
内存空间是有限的,操作系统会对内存中的程序进行处理,挂起是指操作系统将程序调到外存,等待条件满足后调入内存,阻塞是指程序因为某种原因暂停运行,但是仍然在内存之中
加入挂起后进程的状态转化
进程控制的主要功能是对操作系统的进程进行管理,具有新建进程,撤销进程,实现进程状态转化等功能
进程控制通过原语实现(原语运行在核心态)
进程创建是通过创建原语来实现的:申请一个空闲的PCB结构,分配资源,并将其初始化,将这个PCB插入就绪队列
进程撤销通过撤销原语实现的:撤销进程(包括子孙进程)及其资源
进程状态转化通过阻塞原语和唤醒原语实现:
第一步:修改PCB内容
1、状态转化一定会修改进程状态标志
2、当前运行的进程被剥夺CPU,PCB保存当前运行环境
3、某一个进程要开始运行,PCB恢复保存的运行环境
第二步:PCB加入某一状态的队列
第三步:分配/回收资源
进程通信指进程之间的信息交换
进程是可以独立运行,独立获得资源,独立接收调度的最小单位,各个进程的内存空间也是相互独立的, 一般来说,一个进程是不可以访问其他进程的地址空间的,这是很不安全的操作,但是进程之间有时候也需要信息交换,这就引入了进程通信
有的进程需要实现信息共享,操作系统实现了四种进程通信的方法:共享存储,管道通信,消息传递,客户机-服务器
内存中开辟共享空间,两个进程都可以访问这块共享空间,根据共享方式可以划分两种:基于共享数据结构的通信方式,基于共享存储区的通信方式
进程间的数据交换以格式化的消息作为传递单位。进程通过操作系统提供的“发送消息”和“接收消息”这两个原语来实现消息传递
一个格式化的消息分为两部分:消息头和消息体
消息传递可以分为两种:
管道:指连接一个读进程和写进程以实现他们之间通信的一个共享文件,又名pipe文件(其实就是在内存中开辟的缓存区)
1、写进程会以字节流的形式向管道内写入数据,读进程会以字节流的形式从管道内读取数据
2、管道只能实现某一时间段内单向运输,如果想要双向运输,需要使用两个管道
3、互斥:当一个进程正在对管道执行写/读操作时,另一进程必须等待
4、同步:
写程序将管道全部写满时,这时写程序陷入阻塞,只能等待读程序读取数据
读程序将管道全部读空时,这时读程序陷入阻塞,只能等待写程序写入数据
没读空,不可以写 没写满,不可以读
5、数据一旦被读取,将会被内存抛弃,这就意味着读程序最多只能有一个,否则可能出现读取错误
当前主流的通信机制,主要的实现方法有三类:套接字,远程过程调用,远程方法调用
套接字是网络通信接口,一个套接字就是一个通信标志类型的数据结构,是进程通信和网络通信的基本构件。通常套接字可以分为两类:1、基于文件型2、基于网络型
远程过程调用是一个通信协议,用于通过网络连接的系统。这个协议允许运行于一台主机系统上的进程调用另外一台主机的进程(如果涉及的软件采用面向对象编程,那么远程过程调用可以称作远程方法调用)
为了实现程序的并发运行,引入了进程。进程实体由PCB,程序段,数据段组成,通过进程,操作系统可以实现程序的并发运行,并且对并发运行的程序得以控制
线程的引入,是为了减少程序并发运行时付出的时间和空间代价
没有线程之前,进程是可拥有资源的最小单位,可独立调度和分派的基本单位
为了让程序运行,系统要执行三个操作:1、创建进程 2、撤销进程3、切换进程(更改PCB内容,PCB保留当前运行环境,恢复运行环境)进程作为资源的管理者,这几个步骤要付出大量的时间和空间开销,为此引入了线程
将进程的两个属性分开,进程是可拥有资源的最小单位,线程是调度和分派的基本单位
引入线程之后,线程变成了最基本的CPU执行单位,也是程序执行流的最小单位
进程是获取除CPU外其他系统资源的最小单位
1、引入线程后,线程是独立调度和分派的基本单位 ,因而线程是可以独立运行的基本单位
进程是获取除CPU外其他系统资源的最小单位
同一进程下线程的切换不会引起进程的切换,但是跨进程下的线程切换引起进程切换
2、线程具有三个基本状态:运行态,就绪态,阻塞态;线程之间的状态切换和进程之间的状态切换一样
3、引入线程后,不仅进程之间可以并发执行,一个进程内的多个线程也可以并发执行;同样,不同进程之间的线程也可以并发执行
一个进程内也是并发的( QQ聊天,QQ发文件……)
4、线程可以拥有资源,并且可以作为系统中拥有资源的基本单位。然而,线程几乎可以说是不用有资源,其少有的资源也是为了维护自身的独立运行(线程拥有一个数据结构TCB,用于控制线程运行,还有一些其他资源)
线程用于少量资源,还允许同一个进程下的多个线程共享这个进程的资源(属于同一个进程的所有线程有相同的地址空间),由于共享进程空间,同一个进程下的多个线程之间的通信甚至无需系统干预
5、同一个进程下的多个线程之间的独立性远低于不同进程之间的独立性
同一个进程下的多个线程共享这个进程的资源,不同进程之间的资源大部分不可以共享(可以共享全局变量)
6、进程创建,撤销,切换的系统开销远远大于线程创建,撤销,切换的系统开销
7、一个进程只能运行在一个CPU上,但是线程作为可以独立运行的基本单位,一个进程的多个线程可以分别运行在多个CPU上
各个系统实现线程的方法不相同
一些数据库管理系统,实现用户级线程,一些Linux,Windows XP,OS/2等系统,实现内核支持线程,Solaris等系统则是两种都使用
在操作系统的所有进程中,无论是用户进程还是系统进程,都是在操作系统内核的支持下运行的
在用户空间中实现。线程的创建,撤销,切换等也是在用户空间实现的,和内核无关(用户级线程对用户不透明,对操作系统透明)
调度以进程为单位
优点
1、线程切换在用户态即可完成,不涉及用户态与核心态的切换
2、调度算法是进程专用的,不干扰操作系统调度的情况下,不同进程可以选择不同的调度算法来管理线程
3、用户级线程的实现和内核无关,意味着和操作系统的平台无关,所有应用程序都可以共享线程管理的代码。因此用户级线程甚至可以在不支持线程机制的操作系统平台上运行
缺点
1、如果进程内的一个线程系统调用陷入阻塞,那么这个进程的其他线程也阻塞
2、内核给一个进程的只会是一个CPU,只能有一个线程获得cpu,进程内的其余线程只能等待
在内核的支持下运行。线程的创建,撤销,切换等也是在内核空间实现的
调度以线程为单位
优点:
1、多处理机系统中,内核可以同时调度同一进程内的多个线程并行运行
2、如果进程内的一个线程阻塞,内核可以调度同一进程内的其他线程运行,也可以调用其他进程内的线程运行
3、内核支持线程内的数据结构(TCB),线程切换快、开销小
4、内核本身也可以采用多线程技术,提高系统的执行速度
缺点:
对于用户进程,线程切换开销大:用户进程运行在用户态,而内核支持线程在内核的支持下运行,线程的调度和管理运行在核心态,涉及到了用户态与核心态的切换
3、两种线程组合使用
多线程模型:n个用户级线程映射到m个内核支持线程的模型
根据用户级线程和内核支持线程的多少关系,分为不同的多线程模型:多对一模型,多对多模型,一对一模型
多对一模型
一对一模型
多对多模型