目录
一、进程基础:
进程与程序的区别:
进程的组成:
1、PCB进程控制块:
2、程序段和数据段:
进程的特征:
二、进程的状态:
进程的状态:
进程的组织:
三、进程控制:(了解)
进程的创建:
进程的销毁:
进程的阻塞和唤醒:
进程的切换:
四、进程通信:
1、共享存储:
2、消息传递:
直接通信方式:
间接通信方式:
3、管道通信:
五、线程:
1、线程基础:
2、线程的实现方式及多线程模型:
用户级线程:
内核级线程:
一对一模型:
多对一模型:
多对多模型:
3、线程的切换:
4、处理机调度:
1、高级调度(作业调度)
2、中级调度(内存调度):
3、低级调度(进程调度):
总结:
5、进程调度基础:
编辑 低级调度:
进程调度方式:
6、调度程序与闲逛进程:
调度程序:
闲逛进程:
进程:是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。是动态的。
程序:是存放在磁盘中的可执行文件。,是静态的。
进程具有动态性,是进程实体的执行过程,具有生命周期;而程序是静态的,只是一组有序指令的集合。
以C语言为例,当我们将C语言程序写好之后进行编译,编译的结果是一个.exe的可执行文件,这个文件是存在我们的硬盘中的,静态的,所以它是一个程序。
当我们双击这个文件,当他运行之后,操作系统会为其创建一个进程,当我们关闭它之后它就会被销毁,所以进程是动态的,可存在可销毁。
不同点:
相同点:
拓展:程序如何变成进程的?
操作系统将所有静态数据和代码加载到内存中。
操作系统为程序的运行所需的栈和堆分配一些内存空间
操作系统会执行该程序的一些初始化工作,如IO操作等。
启动程序,开始执行程序的main入口依次执行。
当进程被创建时,要为该进程分配一个进程控制块,进程控制块记录下面信息:
1、当进程被创建时,操作系统会为进程创建一个唯一的,不重复的 标识号码-----PID
2、PCB记录当前进程被分配了哪些资源,以及当前进程的运行环境。
3、操作系统需要对各个并发运行的进程进行管理,但凡管理时所需要的信息,都会被放在PCB中
4、PCB中state变量来记录当前进程所处的状态(运行、就绪、阻塞)
还是以上面的C语言案例,当我们编译好的C语言程序放到内存中执行时,PCB存放了操作系统对进程管控的必要数据,要想我们的程序真正运行起来还需要进程自身的一些属性 代码段 和 数据段,代码段存放着要执行的每一条代码,数据段存放着我们定义的一些变量。
通过二节我们了解到,进程可以进行三种状态转化,但是进程的这种状态转化是如何实现的呢,正是这一章节介绍的内容。
原语:
进程的状态转化是通过原语来完成的。原语的执行具有原子性,即执行过程只能一气呵成,期间不允许被中断。是通过“关中断指令”和“开中断指令”这两个特权指令实现原子性。
作业调度: 程序是都存放在外存中的,作业调度就是将外存中的程序调度到主存中
PCB块一定要最后删除,因为内部记录了当前进程的必要信息,如果先删除,操作系统将找不到进程所在地址。
保护进程现场:将当前进程的上下文保存在PCB中,上下文指的就是当前进程运行的一些基本信息,比如当前进程的PC寄存器和IR寄存器的数据,或者一些寄存器已经计算出来的结果,总之上下文就是为了当CPU下次执行该进程时能将当前进程恢复到暂停之前的状态。
进程通信指两个进程之间发生了数据上的交互,因为每个进程在内存中都有独立的存储空间,不能实现进程之间的数据交换,既A进程不能访问B进程的内存空间,所以要想让A访问到B中的数据就需要借助操作系统来完成。
举一个简单的例子:使用微博的分享功能就是一个典型的进程通信,微博和微信是两个独立的进程,但是分享时微博就访问了微信的进程空间,反之从微信跳转到微博时,微信也访问了微博的内存空间,这背后就是要由操作系统来完成的。
操作系统为两个要通信的进程划分了一片共享区域,二者可以访问空想区域的数据。并且为了避免读写错误对共享区域的访问是互斥,通过PV操作完成。
1、要发送消息的进程在自己的内部封装好"消息对象"(下图,由消息头和消息体组成),将这个消息发送到操作系统内核,然后由内核通过不同消息通信方式完成不同的消息传递。
2、发送和接收消息主要由对应的原语完成。
进程指名道姓的通知操作系统这条消息要发给谁。
与共享通信的区别,共享通信时可以将数据写在共享内存那个块上的任意一个位置,然后从那个地方取走数据,而管道通信是单向的并且内部是以循环队列的方式存储数据的,即先入先出的方式读取数据。
半双工通信:同时时刻只能向一个方向传递数据,但是可以变向,A->B,B<-A但是同一时刻只能向一个方向传递。
全双工通信:同一时刻是可以两个方向传递的,相当于是两个水管,每个水管只能传递一个方向,但是有两个所以可以双向传递。
我们可以将线程理解为进程的一部分,以QQ为例,QQ是一个程序运行起来是一个进程,QQ有很多功能,发邮件、视频聊天...我们可以将这些小功能理解为线程。每一个线程相当于执行某一逻辑的代码。
线程是一个基本的CPU执行单元,也是程序执行流的最小单位。
引入线程之后,不仅是进程之间可以并发,进程内的各线程之间也可以并发,从而进一步提升了系统的并发度,使得一个进程内也可以并发处理各种任务(如QQ视频、文字聊天、传文件),进程只作为除CPU之外的系统资源的分配单元(如打印机、内存地址空间等都是分配给进程的),线程则作为处理机调度的基本单元。
线程拥有的资源几乎全部来自进程。
线程同样具有三态变化。
线程的引入就是为了缓解频繁切换进程导致的系统性能降低。
与进程类似,线程通过TCB块来记录线程的信息,最后将这些TCB块保存起来,组成线程表。
作业就是一个任务,一个需要操作系统执行的程序,高级调度(作业调度)。
操作系统按一定的原则从外存的作业后备队列中挑选一个作业调入内存,并创建进程。每个作业只调入一次,调出一次。作业调入时会建立PCB,调出时才撤销PCB,作业调度处理的主要问题是有多个作业需要启动,到底先启动哪一个。
中级调度(内存调度)按照某种策略决定将哪个处于挂起状态的进程重新调入内存。一个进程可能会被多次调出、调入内存,因此中级调度发生的频率要比高级调度更高。
内存不够时,可将某些进程的数据调出外存。等内存空闲或者进程需要运行时再重新调入内存。暂时调到外存等待的进程状态为挂起状态。被挂起的进程PCB会被组织成挂起队列。
低级调度(进程/处理机调度)按照某种策略从就绪队列中选取一个进程,将处理机分配给它。
进程调度是操作系统中最基本的一种调度,在一般的操作系统中都必须配置进程调度。进程调度的频率很高,一般几十毫秒一次。
高级调度(作业调度):将某一个程序加载到内存中并为其创建PCB。强调创建进程,装入内存的过程。
中级调度(内存调度):由高级调度将程序调入到内存,但是现在又有新的程序要调入内存,内存空间不足,所以需要将部分进程调出内存,过了一段时间该进程又需要调入内存,此时由中级调度来决定将谁调入到内存。 强调将处在阻塞或挂起的进程重新让其变为就绪态。
低级调度(进程调度):将进程分配给CPU,让其执行对应的逻辑。 强调让谁进入CPU去执行。
决定哪一个进程可以进入CPU被处理。
确定由谁去处理机运行,它能运行多久。
当CPU没有进程要执行的时候,就让闲逛进程来执行,闲逛进程级别最低,每执行完一次就会检查中断,看有无其他进程要执行。