2.1.1进程的基本概念、组成、特征
概念:进程是动态的,是程序的一个执行过程,
当进程创建时,会为进程创建一个PID,这个ID是独有的,还有进程所属用户UID
还要记录进程的各种信息(所用内存、所用文件、所用I/O设备等等),这些信息保存在进程控制块(PCB)中,PCB是进程存在的唯一标志。当进程结束时,操作系统会回收他的PCB。
PCB:
进程描述信息(PID、UID)
进程控制和描述信息:CPU、磁盘、进程当前状态
资源分配清单:正在使用哪些文件、使用哪些设备等等
处理机相关信息:PSW、PC等寄存器的值
进程的组成(进程实体(进程映像)的组成): 进程是动态的,进程实体是静态的。是某一时刻进程的状态
PCB
程序段:程序的代码
数据段:运行程序过程中生成的数据(各种变量)
可以说,进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。
进程的特征
动态性:最基本特征
并发性
独立性:能够独立的获得资源,独立接受调度的基本单位
异步性:各进程以不可预知的速度独立进行
结构性:由PCB,程序段、数据段组成
2.1.2进程的状态与转换、进程的组织。
进程的状态:
基本状态:
就绪态—>只是因为没有空闲CPU,不能运行
运行态—>就绪态运行在CPU上,出于运行态
阻塞态(等待态):某进程运行之前,可能会等待一个事件的发生(比如等待系统资源的分配),在这个时间发生之前,他不会运行,这个时候,他会下CPU,转化为阻塞态
————————————————————————
另外的状态
创建态—>为进程创建PCB、分配资源
终止态:当进程结束时,会调用exit—>回收PCB等空间资源
进程状态的转换(五状态模型):
补充:七状态模型
进程的组织:
链接方式:(链表)
索引方式(数组)
2.1.3进程控制
什么是进程控制:对系统中的所有进程实现状态转换,它具有创建新进程,撤销已有进程、实现进程状态转换等功能。
怎么实现:需要用到原语:
原语的原子性是不可中断的,是一气呵成的。
怎么实现的:CPU在执行了一个指令之后,会检查中断信号。当执行了关中断指令后,就不会检查了,当再执行开中断之后,就继续检查,利用开中断和关中断可以实现原语。
进程的创建:
创建原语
申请空白PCB
为新进程分配资源资源
初始化PCB
将PCB插入就绪队列 创建态-→就绪态
引起进程创建的事件:
用户登录
作业调度:新作业放入内存时
提供服务:用户向系统提出请求时
应用请求,进程主动请求
进程的终止
撤销原语
找到要终止进程的PCB
剥夺CPU
杀掉所有子进程
将资源归还给父进程
删除PCB
引起终止的原因
主动结束
异常结束(执行有问题(除数为0))
外界干预(任务管理器杀死进程)
进程的阻塞和唤醒
阻塞原语
找到PCB
保护进程现场,将其标记为阻塞态,暂停进行
将该进程的PCB插入到等待队列
唤醒原语
找到PCB
标记为就绪态,从等待队列中剔除
插入到就绪队列中
进程的切换 //这个得补补计组。
切换原语
将运行环境写进PCB
PCB进入相应队列
选择另一个进程执行,并更新PCB
根据PCB恢复新进程所需的运行环境.
2.1.4 进程通信
定义:两个进程之间的数据交互(通信)。
进程通信需要操作系统的支持,因为各个进程在操作系统上拥有的内存地址相互独立。
共享存储:操作系统划定一片内存区域(共享空间),两个进程在这篇区域内进行数据交互。该区域是互斥的(避免两个进程之间数据覆盖)
基于存储区的共享(高级的通信方式):这片区域的数据形式以及存储位置都由进程支配,而不是操作系统
基于数据结构的共享:存放的数据形式有限制,速度慢,限制多。
消息列表:以格式化的消息为单位(该单位包含消息体和消息头),通过操作系统提供的原语(send(obj,msg),receive(obj,&msg) )
自我理解:操作系统内核作为中介,例如,进程A使用原语将消息发送到操作系统内核中的进程B的消息队列,然后进程B使用原语从操作系统内核进程B的消息队列中接收消息。)
直接通信:发送和接受的对象是直接点明的。
间接通信:加了个信箱中介,进程A的消息send到一个信箱中,例如信箱C,该信箱存在于操作系统内核中,然后进程B从信箱C中receive信息,注:可以同时存在多个信箱,各个进程也可以随意向同一个信箱中send或者receive消息。
自我理解:对避免资源浪费,例如,一对多的信息传递只需要一个邮箱,如果是直接通信,需要
分别send
管道通信:管道是一个特殊的共享文件(pipe),在内存中开辟一个大小固定的内存缓存区。这个缓存区是一个循环队列,数据的读写是先进先出的。(管道是允许多个写进程,多个读进程的。)
2.1.5什么是线程
在没有线程之前,进程就是cpu调度的最小单位。一个进程对应一份代码,但是有时候一个进程需要执行多个功能,这个时候,就引入了线程,在这之后,线程就是cpu调度的最小单位了。进程只是资源分配的最小单位了,而不是调度的最小单位。
线程出现之后的变化:
提高了并发度(线程之间也可以并发)
降低了系统开销,在线程出现之前,进程之间并发需要切换运行环境,而线程之间并发不需要
属性:
多CPU计算机中,不同线程可以占用不同CPU
各个线程拥有自己的线程ID、线程控制块(TCB)
他也有就绪、阻塞、运行三种基本状态
线程几乎不占用系统资源
同一进程的不同线程间共享进程之间的资源
同一进程之间的不同线程通信不需要系统干预,因为是共享内存地址的
同一进程内的线程切换不会引起进程切换
2.1.6线程的实现方式以及模型
线程的实现方式
用户级线程(线程库):程序员自己编写的线程库,实现了逻辑上的线程,在操作系统层面上,线程是不存在的
优点:不需要切换到核心态,系统开销小,效率高。
缺点:当一个线程堵塞之后,整个进程就被堵塞了。 并发度低
内核级线程:在物理层面上,内核支持线程,该线程由操作系统内核完成,该线程的调度,切换cpu都必须在核心态下实现
优点:当一个线程堵塞之后,别的线程还可以继续,并发度高
缺点:线程管理需要频繁从核心态到用户态之间切换,系统开销大
多线程模型
多对一模型:多个用户级线程映射到一个内核级线程,且一个进程只被分配一个内核级线程
优点:不需要切换到核心态,系统开销小,效率高
缺点:当一个用户级线程堵塞之后,整个进程就被堵塞了。 并发度低
留个疑问:这个模型和单纯的用户级线程有什么区别?
多对多模型:n个用户级线程映射到m个内核级线程(n>m)
克服了多对一线程阻塞之后就进程阻塞的缺点
也缓解了了一对一的系统开销大的缺点
自我理解:介于多对一和一对一之间,系统开销比一对一小,但是比多对一大,但是可以克服致命的缺点,一堵全堵。
2.1.7线程的状态与转换、组织与控制
和进程基本一样
该学操作系统了!