前言
✨本篇为博主 考研操作系统 的第六篇:进程与线程
本篇博客内容来自:
👊2022王道视频笔记总结
👊2023王道书重点归纳总结
👊2023王道习题好题,错题总结
效率问题,就不再和前几篇文章一样对重点进行特殊标记强调,需要的可以看PDF版,那个是有强调色彩的
需要博主PDF版笔记或相关资料的同学可以评论出来,我会私发给大家~
笔记
程序是静态的,程序就是一个存放在磁盘里的可执行文件,是一系列指令的集合;线程是动态的,是程序的一次执行过程。进程被创建时,操作系统就会给进程分配一个唯一的、不重复的“身份证号”—— PID。
为了使参与并发执行的每个程序(含数据)都能独立地运行,必须为之配置一个专门的数据结构,称为进程控制块(PCB)操作系统利用PCB来描述进程的基本情况和运行状态,从而控制和管理进程。程序段、数据段、PCB三部分组成了进程实体(进程映像),其中PCB是给操作系统用的,程序段、数据段是给进程自己使用的。所谓创建进程,实质上就是创建进程实体中的PCB,撤销进程实质上就是撤销进程的PCB。
进程实体是静态的,进程是动态的,进程实体反映了进程在某一时刻的状态,进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。一个进程被调度,就是指操作系统决定让这个程序上CPU运行;这里所说的系统资源,指的是处理机、存储器和其他设备服务于某个进程的“时间”,因为进程是这些资源分配和调度的独立单位,即是“时间片”分配的独立单位。
PCB是进程存在的唯一标志,PID(进程标识符)是PCB中的一小部分。同时挂三个QQ,对应三个QQ进程,它们的PCB、数据段各不相同,但程序段的内部是相同的。
进程的特征:
1.动态性:动态性是进程最基本的特征
2.并发性:多个进程实体同存于内存中,能在一段时间内同时运行,引入进程的目的就是使进程能和其他进程并发执行
3.独立性:进程实体是一个能独立运行、独立获得资源和独立接受调度的基本单位,凡未建立PCB的程序,都不能作为一个独立的单位参与运行。
4.异步性:异步性会导致执行结果的不可再现性,为此在操作系统中必须配置相应的进程同步机制。
5.结构性:每个进程都会配置一个PCB,结构上由程序段、数据段、PCB组成。
进程的五种状态:(前三种为基本状态)
1.运行态:进程正在处理机上运行
2.就绪态:进程获得了除处理机外的一切所需资源,处于就绪态的进程可能有多个,通常把它们排成一个队列,称为就绪队列。
3.阻塞态(等待态):进程等待某一事件而暂停运行,即使处理机空闲,该进程也不能运行,处于阻塞态的进程也排成一个队列,或者根据阻塞原因的不同排成多个阻塞队列。
4.创建态(新建态):进程正在被创建
5.结束态(终止态):进程正在从系统中消失,进程需要结束运行时,系统首先把该进程置为结束态,然后进一步处理资源释放和回收等工作。
就绪态是指进程中只缺少处理器,阻塞态(等待态)是进程需要其他资源(除了处理器)或等待某一事件;进程在运行的过程中其实是频繁地转换到就绪态,进程转换到阻塞态(等待态)的次数相对较少。
运行态→就绪态:时间片用完&&在可剥夺的操作系统中,当有更高优先级的进程就绪时,调度程序将正在执行的进程转换为就绪态,让更高优先级的进程先使用。
运行态→阻塞态:进程请求某一资源(如外设)的使用和分配或等待某一事件的发生(如I/O操作的完成),进程以系统调用的形式请求操作系统提供服务,这是由运行用户态程序调用操作系统内核过程的形式,这是一种进程自身做出的主动行为。
阻塞态→就绪态:进程等待的事件到来时,如I/O操作结束或中断结束时;这不是进程自身能控制的,是一种被动行为,这一过程需要相关进程的协助。
不能由阻塞态直接转换为运行态,也不能由就绪态直接转换为阻塞态。
进程是一个独立的运行单位,是操作系统进行资源分配和调度的基本单位,由三部分组成,其中最核心的为进程控制块(PCB)
1.进程控制块:进程创建时,操作系统为它新建一个PCB,该结构之后常驻内存,任意时刻都可以存取,并在进程结束时删除,PCB是进程实体的一部分,是进程存在的唯一标志;进程执行时,系统通过其PCB了解进程的现行状态信息,进程结束时,系统回收其PCB,该进程随之消亡;操作系统调度某进程执行时,首先从该进程的PCB中查出其现行状态及优先级,根据PCB中所保存的处理机状态信息,设置该进程恢复运行的现场,并根据其PCB中的程序和数据的内存地址,找到其程序和数据;进程在运行中,当需要和与之合作的进程实现同步、通信或访问文件时,也需要访问PCB;当程序暂停运行时,需要将其断点的处理机环境保存在PCB中;在进程的整个生命期中,系统总是通过PCB对进程进行控制的,亦即系统唯有通过进程的PCB才能感知到该进程的存在。
PCB主要包括:进程描述信息、进程控制和管理信息、资源分配清单和处理机相关信息等。
组织各进程的PCB:链接方式、索引方式
链接方式:同一状态的PCB链接成一个队列,不同状态对应不同队列,处于阻塞态的进程PCB可能会根据不同的阻塞原因排成多个阻塞队列
索引方式:同一状态的进程组织在一个索引表中,索引表的表项指向相应的PCB,不同状态对应不同的索引表
2.程序段:程序段就是能被进程调度到CPU执行的程序代码段,程序可被多个进程共享,即多个进程可以运行同一个程序。
3.数据段:一个进程的数据段,可以是进程对应程序加工处理的原始数据,也可能是程序执行时产生的中间或最终结果。
进程控制:对系统中的所有进程实施有效的管理,实现进程状态的转换,一般把进程控制用的程序段称为原语,原语的特点是执行期间不允许中断,它是一个不可分割的基本单位;可以通过“关中断指令”和“开中断指令”这两个特权指令实现原子性:CPU执行了关中断指令后,就不再例行检查中断信号,直到执行开中断指令后才恢复检查。
1.进程的创建:允许一个进程创建另一个进程,创建者称为父进程,被创建的称为子进程。子进程可以继承父进程所拥有的资源,子进程被撤销的时候,需要把资源归还给父进程,在撤销父进程的时候,会一并撤销所有的子进程;终端用户登录系统、作业调度、系统提供服务、用户程序的应用请求都会引起进程的创建;操作系统创建一个新进程的过程:
a.为进程分配一个唯一的进程标识号,并申请一个空白的PCB(PCB是有限的)若PCB申请失败,则创建失败
b.为进程分配其运行所需的资源,这些资源或从操作系统获得,或仅从其父进程获得,资源不足(如内存不足),则处于创建态,等待内存资源。
c.初始化PCB,初始化标志信息、初始化处理机信息和初始化处理机控制信息,设置进程的优先级
d.若进程就绪队列能够容纳新进程,则将新进程插入就绪队列,等待被调度运行。
2.进程的终止:正常结束;异常结束:存储区越界、I/O故障、特权指令错…;外界干预:操作员或操作系统干预、父进程请求或父进程终止;操作系统终止一个进程的过程(终止原语):
a.根据被终止进程的标识符,检索出该进程的PCB
b.若该进程处于执行态,立即终止该进程,将处理机资源分配给其他进程
c.若有子孙进程,则终止其子孙进程(进程间的关系是树形结构)
d.将该进程的全部资源,或归还给其父进程或归还给操作系统
e.将该PCB从所在队列(链表)中删除
3.进程的阻塞和唤醒:进程通过调用阻塞原语(Block),使自己由运行态变为阻塞态,即阻塞是进程自身的一种主动行为;只有处于运行态的进程(获得CPU),才可能将其转为阻塞态,阻塞原语的执行:
a.找到将要被阻塞进程的标识号所对应的PCB
b.保护其现场,将状态转为阻塞态,停止运行
c.把该PCB插入相应事件的等待队列,将其处理机资源调度给其他就绪进程
当被阻塞进程期待的事件出现时,调用唤醒原语(Wakeup),唤醒原语的执行过程如下:
a.在该事件的等待队列中找到相应进程的PCB
b.将其从等待队列中移出,并置其状态为就绪态
c.把该PCB插入就绪队列,等待调度程序调度
Block原语和Wakeup原语是一对作用正好相反的原语,必须成对使用。
进程通信是指进程之间的信息交换,进程是分配系统系统资源的单位(包括内存地址空间),因此各进程拥有的内存地址相互独立,为了保证安全,一个进程不能直接访问另一个进程的地址空间;PV操作是低级通信方式,高级通信方式有如下三类:
1.共享存储:在通信的进程之间存在一块可直接访问的共享空间(为避免出错,各个进程对共享空间的访问是互斥的),通过对这片共享空间进行读/写操作实现进程之间的信息交换;在对共享空间进行读/写操作的时,需要使用同步互斥工具(如P操作、V操作);共享存储分为两种:低级方式的共享是基于数据结构的共享;高级方式的共享是基于存储区的共享;操作系统只负责为通信进程提供可共享使用的存储空间和同步互斥工具,数据交换由用户自己安排读/写指令完成;进程空间一般是独立的,进程运行期间一般不能访问其他进程的空间,想让进程共享空间,必须通过特殊的系统调用事件,而进程内的线程是自然共享进程空间的。
2.消息传递:进程间的数据交换以格式化的消息(Message)为单位,进程通过系统提供的发送消息和接受消息两个原语进行数据交换;在微内核操作系统中,微内核与服务器之间的通信就采用了消息传递机制;
a.直接通信方式:发送进程直接把消息发送给接受进程,并将其挂在接收进程的消息缓冲队列上,接受进程从消息缓冲队列中取得消息;消息发送进程要指明接受进程的ID
b.间接通信方式:发送进程把消息发送到某个中间实体,接受进程从中间实体取得消息,这种中间实体一般称为信箱,这种通信方式也被称为信箱通信方式
3.管道通信:所谓管道,就是指用于连接一个读进程和一个写进程以实现它们之间的通信的一个共享文件;以字符流形式将大量的数据送入(写)管道;为了协调双方的通信,管道机制必须提供以下三方面的协调能力:互斥、同步、确定对方存在;管道可以克服使用文件进行通信的两个问题,表现如下:
a.限制管道大小,管道是一个固定大小的缓冲区
b.读进程可能比写进程快
各进程要互斥的访问管道(由操作系统实现),从管道中读数据是一次性操作,数据一旦被读取,就释放空间以便写更多数据;管道只能采用半双工通信,即某一时刻只能单向传输,要实现父子进程互动通信,需定义两个管道;管道可以理解为共享存储的优化和发展,写进程往管道中写数据(管道没写满),只要管道不空,读进程就可以从管道中读数据;读进程从管道中读数据(管道没被读空),只要管道不满,写进程就可以往管道中写数据
管道中的数据一旦被读出,就彻底消失,因此,在多个进程读同一个管道时,可能会错乱,对此现象,管道有两种解决方案:
1.一个管道允许多个写进程,一个读进程(标准答案)
2.允许多个写进程,多个读进程,但系统会让各个读进程轮流从管道中读数据(这是Linux系统的实际应用,写题以1为准,出现2也对)
线程的基本概念:引入进程是为了更好地使多道程序并发执行,提高资源利用率和系统吞吐量,引入线程是为了减少程序在并发执行时所付出的时空开销,提高操作系统的并发性能;线程可以直观上理解为“轻量级进程”,它是一个基本的CPU执行单元,是程序执行的最小单元;线程由线程ID、程序计数器、寄存器集合和堆栈组成;线程是进程中的一个实体,是被独立调度和分派的基本单位;线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程中的其他线程共享进程所拥有的全部资源;一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发执行;由于线程之间的相互制约,线程在运行中呈现出间断性;线程也有就绪、阻塞和运行三种基本状态;有了线程后,进程只作为除CPU外的系统资源的分配单元(如打印机、内存地址空间等都是分配给进程的),线程作为处理机的分配单元;若线程的切换发生在同一个进程内部,则只需要很少的时空开销;引入线程之后,不仅是进程之间可以并发,进程内的各线程之间也可以并发,从而进一步提升了系统的并发度,使得一个进程内也可以并发处理各种任务(QQ同时视频、聊天、传文件)
线程和进程的比较:
1.调度:进程每次调度都要进行上下文切换,开销较大;线程的切换代价远低于进程,在同一进程中,线程的切换不会引起进程切换;从一个进程中的线程切换到另一个进程中的线程会引起进程切换
2.并发性:引入线程后,不仅进程间可以并发执行,而且一个进程中的多个线程也可以并发执行,甚至不同线程中的线程也能并发执行,从而使操作系统具有更好的并发性
3.拥有资源:进程是操作系统中拥有资源的基本单位,而线程不拥有系统资源(仅有一点必不可少、能保证独立运行的资源),线程可以访问其隶属进程的系统资源,这是因为同一进程的所有线程都具有相同的地址空间
4.独立性:每个进程都拥有独立的地址空间和资源,除了共享全局变量,不允许其他进程访问;某进程中的线程对其他进程不可见
5.系统开销:在进程切换时涉及进程上下文的切换,而线程切换时只需要保存和设置少量的寄存器内容,开销很小;由于同一个进程中的多个线程共享进程的地址空间,因此这些线程之间的同步与通信非常容易实现,甚至无须操作系统干预
6.支持多处理机系统:对于多线程进程,可以将进程中的多个线程分配到多个处理机上执行
线程的属性:多线程操作系统中的进程已经不是一个基本的执行实体,但它仍具有与执行相关的状态,所谓线程处于“执行”状态,实际上是进程中的某线程正在执行,线程有如下属性:
1.线程不具备系统资源,每个线程都有唯一的标识符(线程ID)和一个线程控制块(TCB),线程控制块中记录了线程执行的寄存器和栈等现场状态
2.不同的线程可以执行相同的程序
3.同一进程中的个各个线程共享该进程所拥有的资源
4.线程是处理机的独立调度单位
5.一个线程被创建后就开始其生命周期,线程在生命周期内会经历阻塞态、就绪态和运行态等各种状态变化
与进程一样,各线程之间也存在共享资源和相互合作的制约关系,致使线程在运行时也具有间断性
线程的组织和控制:
1.线程控制块:每个线程都有一个线程控制块(TCB),用于记录控制和管理线程的信息,线程控制块一般包括:a.线程标识符 b.一组寄存器 c.线程运行状态 d.优先级 e.线程专有存储区:线程切换时用于保护现场等 f.堆栈指针;同一进程中的线程都完全共享进程的地址空间和全局变量;各个线程都可以访问进程地址空间的每个单元,所以一个线程可以读、写或甚至清除另一个线程的堆栈
2.线程的创建:在操作系统中就有用于创建线程和终止线程的函数(或系统调用);用户程序启动时,通常仅有一个“初始化线程”的线程正在执行,其功能主要是创建新线程;在创建新线程时,需要利用一个线程创建函数,并提供相应的参数(线程优先级、堆栈大小);线程创建函数执行完后,将返回一个线程标识符
3.线程的终止:由终止线程调用相应的函数执行终止操作;有些线程(系统线程)一旦建立,便一直运行下去而不会被终止;线程被终止后并不立即释放它所占用的资源,只有当进程中的其他线程执行了分离函数后,被终止线程才与资源分离,此时的资源才能被其他线程利用;被终止但尚未释放资源的线程仍可被其他线程调用,以使被终止线程重新恢复运行。
线程的实现分为两类:用户级线程(ULT)和内核级线程(KLT),内核级线程也称为内核支持的线程
1.用户级线程:有关线程管理(创建、撤销和切换等)所有的工作都由应用程序在用户空间中完成,内核意识不到线程的存在,应用程序可以通过使用线程库设计成多线程程序,很多编程语言提供了强大的线程库,可以实现线程的创建、销毁、调度等功能,线程库是为程序员提供创建和管理线程的API;应用程序从单线程开始,在该线程中开始运行,在运行的任何时刻,可以通过调用线程库中的派生例程创建一个在相同进程中运行的新线程;用户级线程的调度仍是以进程为单位进行的;
优点:a.线程的切换不需要转换到内核空间,节省了切换的开销
b.调度算法可以是进程专用的,不同的进程可根据自身的需要,对自己的线程选择不同的调度算法
c.用户级线程的实现与操作系统平台无关,对线程管理的代码是属于用户程序的一部分
缺点:a.系统调用阻塞问题,当线程执行一个系统调用时,不仅该线程被阻塞,而且进程中的所有线程都被阻塞
b.不能发挥多处理机的优势,内核每次分配给一个进程的仅一个CPU,因此进程中仅有一个线程能执行
总结:用户级线程由应用程序通过线程库实现,所有的线程管理工作工作都由应用程序负责(包括线程切换);用户级线程中,线程切换可以在用户态下即可完成,无需操作系统干预;在用户看来,具有多个线程,但操作系统内核意识不到线程的存在,“用户级线程”就是从用户视角能看到的线程
实现线程库的主要方法:
a.在用户空间中提供一个没有内核支持的库,调用库内的一个函数只导致用户空间中的一个本地函数的调用
b.实现由操作系统直接支持的内核级的一个库,调用库中的一个API函数通常会导致对内核的系统调用
2.内核级线程:无论系统进程还是用户进程,都是在操作系统内核的支持下运行的,内核级线程同样也是在内核的支持下运行的,线程管理的所有工作也是在内核空间内实现的
优点:a.能发挥多处理机优势,内核能同时调度同一进程中的多个线程并行执行
b.进程中的一个线程被阻塞,内核可以继续调度该进程中的其他线程占用处理机,也可以运行其他进程中的线程
c.内核支持线程具有很小的数据结构和堆栈
d.内核本身也可以采用多线程技术
缺点:同一个进程中的线程切换,需要从用户态转到核心态运行,系统开销大,这是因为用户进程的线程在用户态下执行,而线程调度和管理是在内核实现的
总结:内核级线程的管理工作由操作系统内核完成;线程调度、切换等工作都由内核负责,因此内核级线程的切换必然需要在内核态下才能完成;操作系统会为每个内核级线程建立相应的TCB,通过TCB对线程进行管理,“内核级线程”就是从操作系统内核视角能看到的线程;操作系统只“看得见”内核级线程,因此只有内核级线程才是处理机分配的单位
3.组合方式:内核支持多个内核级线程的建立、调度和管理,同时允许用户程序建立、调度和管理用户级线程;同一个进程中的多个线程可以同时在多个处理机上并行执行,且阻塞一个线程时不需要将整个进程阻塞;一些内核级线程对应多个用户级线程,这是用户级线程通过时分多路复用内核级线程实现的
多线程模型:
1.多对一模型:将多个用户级线程映射到一个内核级线程;这些用户线程一般属于一个进程,线程的调度和管理在用户空间完成;仅当用户线程需要访问内核时,才将其映射到一个内核级线程上,且只允许一个线程进行映射
优点:线程管理在用户空间进行,效率较高
缺点:a.如果一个线程在访问内核时发生阻塞,则整个进程都会被阻塞,并发度低
b.在任何时刻,只有一个线程能访问内核,多个线程不能同时在多个处理机上运行
2.一对一模型:将每个用户级线程映射到一个内核级线程
优点:当一个线程被阻塞后,允许调度另一个线程运行,故并发性强,多线程在多核处理机上可以并行执行
缺点:每创建一个用户线程,就需要创建一个内核级线程,开销较大
3.多对多模型:将n个用户线程映射到m个内核级线程上(n≥m)
特点:兼具上述两类模型的优点且克服上述两类模型的缺点
习题总结
同一个进程中的线程之间通信可以直接通过它们共享的存储空间
动态性是进程最重要的特性,以此来区分文件形式的静态程序
优先级分动态和静态两种,动态优先级是根据运行情况而随时调整的;系统发生死锁时有可能进程全部处于阻塞态,或无进程任务
单处理机系统中同时存在10个进程,那么这10个进程最多9个在就绪队列中,可能10个都处于阻塞态
一个就能成执行完毕后由运行态转为结束态时会释放资源,例如打印机,但这并不是由于释放打印机引起的,是由于运行完成才释放了打印机
系统进程所请求的一次I/O操作完成后,将使进程状态从阻塞态变为就绪态
程序封闭性是指进程执行的结果只取决于进程本身,不受外界影响,也就是说,进程在执行过程中不管是不停顿地执行,还是走走停停,进程本身的执行速度都不会改变它的执行结果;失去封闭性后,不同速度下的执行结果可能不同
进程有它的生命周期,不会一直存在于系统中,也不一定需要用户显式地撤销,进程可在完成时撤销,或在出现内存错误等错误时撤销
进程之间有可能具有相关性,也有可能是相互独立的,即进程之间可能是无关的,但也可能是有交互性的
可以把线程理解成一种特殊的进程
C语言编写的程序在使用内存时一般分为三个段,它们一般是正文段(即代码和赋值数据段)、数据堆段、数据栈段;二进制代码和常量存放在正文段,动态分配的存储区在数据堆段,临时使用的变量在数据栈段;全局赋值变量在正文段赋值数据段,未赋值的局部变量和实参传递在栈段,动态内存分配在堆段,常量在正文段
一个进程是程序在一个数据集上的一次执行过程,运行于不同的数据集,将会形成不同的进程
进程至少由代码、数据和PCB组成,程序仅需代码和数据即可;程序代码经过多次创建可以对应不同进程,而同一个系统的进程(或线程)可以由系统调用的方法被不同的进程(或线程)多次使用
进程的就绪数目越多,争夺CPU的进程就越多,但只要就绪队列不为空,CPU就总是可以调度进程运行,保持繁忙,这与就绪进程的数目没有关系,除非就绪队列为空,此时CPU进入等待态,导致CPU的效率下降
在具有通道设备的单处理器系统中实现并发技术后,CPU与I/O设备间并行工作,也正是因为CPU和I/O设备的并行工作,才使各进程能并发执行
线程不能脱离进程单独运行,只能在进程中运行
全局变量是对同一进程而言的,在不同的进程中是不同的变量,没有任何关系,所以不能用于进程间数据交换
进程被唤醒在某种情况下优先级可以增大,但一般不会变为最大,这是由固定的算法来计算的;就绪队列是按照一定的规则赋予其位置的,如先来先服务、高优先级优先、短进程优先
进程间的通信主要有管道、消息传递、共享内存、文件映射和套接字等;数据库不能用于进程间的通信
进程可以创建进程或线程,线程可以创建线程,但线程不能创建你进程
采用轮转调度算法,进程中设置的内核级线程和用户级线程的效果完全不同;用户级线程可以在任何操作系统中运行;若系统中只有用户级线程,则处理机调度的对象是进程
在内核级线程中,同一进程中的线程切换,需要从用户态转到核心态进行,系统开销大;当进程中的内核级线程运行在内核态时,说明该进程也运行在内核态,即内核级线程的程序实体可以在内核态运行
设备分配是通过在系统中设置相应的数据结构实现的,不需要创建进程,这是操作系统中I/O核心子系统的内容
进程时间片用完,可降低其优先级以让其他进程被调度进入执行状态;进程刚完成I/O,进入就绪队列等待被处理机调度,为了让其尽快处理I/O结果,可以提高优先级;进程长期处于就绪队列,为不至于产生饥饿现象,可以适当提高优先级;进程从就绪态转为运行态,此时进程优先级不应被降低,应在时间片用完后再降低
进程中的线程共享进程内的全部资源,但进程中某进程的栈指针对其他线程是透明的,不能被其他线程共享
在引入进程后,进程依然是资源分配的基本单位,线程是调度的基本单位
P(wait)操作表示进程请求某一资源
“操作系统为每个用户线程建立一个线程控制块”属于一对一模型
父进程可与子进程共享一部分资源,但不能共享虚拟地址空间,在创建子进程时,会为子进程分配资源,如虚拟地址空间等
创建一个进程时,一般会为其分配除CPU外的大多数资源,所以一般将其设置为就绪态,让它等待调度程序的调度
静态的程序除占用磁盘空间外,不需要其他系统资源,只有执行中的进程才需要分配内存、CPU等系统资源;进程与程序相关,进程包含了程序,程序是进程的核心内容,没有程序就没有进程,进程也不仅仅是程序,还包含程序在执行过程中使用的全部资源,没有资源,程序就无法执行,因此进程是程序执行的载体;对单个进程的某个时刻而言,一个进程只能执行一个程序,进程与程序之间是一对一的关系,但对于整个系统中的进程集合及进程的生命周期而言,进程与程序之间可以形成一对一、多对一、一对多、多对多的关系;执行一条命令或运行一个应用程序时,进程和程序之间形成一一对应的关系,进程在执行过程中可以加载执行不同的应用程序,从而形成一对多的关系,以不同的参数或数据多次执行同一个应用程序时,形成多对一的关系,并发地执行不同应用程序时,形成多对多的关系
父进程创建子进程后,父进程与子进程同时执行(并发),主程序调用了子程序后,主程序暂停在调用点,子程序开始执行,直到子程序返回,主程序才开始执行
每个进程有自己独立的地址空间,在操作系统和硬件的地址保护机制下,进程无法访问其他进程的地址空间,所以必须借助于操作系统的系统调用函数实现进程之间的通信,进程通信的主要方式有:共享内存区、消息传递、管道系统、共享文件
多线程是指在一个程序中可以定义多个线程并同时运行它们,每个线程可以执行不同的任务;多任务是针对操作系统而言的,代表操作系统可以同时执行的程序个数;多线程是针对一个程序而言的,代表一个程序可以同时执行的线程个数,而每个线程可以完成不同的任务
若系统中未运行进程,则操作系统很快会选择一个就绪进程运行,只有就绪队列中无进程时,CPU才可能处于空闲状态;系统中的所有进程可能都处于等待态,可能处于死锁状态,也有可能因为等待的事情未发生而进入循环等待态;高优先级的进程有可能处于等待队列,进程调度会从就绪队列中选择一个进程占用CPU,这个被选中的进程可能优先级较低
为支持多进程的并发执行,系统为每一个进程都建立了一个数据结构:进程控制块,用于进程的管理和控制
只有采用单一时间片轮转的调度系统,当分配的时间片用完时,才能发生上图(1、6)所示情况,因此该系统一定采用时间片轮转调度算法,采用时间片轮转算法的操作系统一般均为交互式操作系统,综合上图(2、3)操作,故它是一个多阻塞队列的时间片轮转法的调度系统