进程

进程的定义(强调动态性)

进程是能和其他程序并行执行的程序段在某数据集合上的一次运行过程,它是系统资源分配和调度的基本单位。

话说为什么要引入进程呢?

在最开始是单道程序技术时,只有一个程序在运行,CPU可以很容易的找到位置,但想引入多道程序技术,就意味着我要支持并发,那并发,就是每个程序都是走走停停,我要记录当下位置,那这个时候就得引入进程,还要给他一个PCB来记录,同时需要注意的是进程是在某个程序段上的而不是程序上。

进程的组成

进程=PCB(程序控制快)+程序段(存放要执行的代码)+数据块(存放程序运行中处理的各种数据)

实际上应该说进程实体等于上面那一串,进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位,进程实体是静态的而进程是动态的。

进程的组织

(执行指针,就绪队列指针,阻塞队列指针)

链接方式

索引方式

进程的特征

动态性:进程是程序的一次执行过程,是动态发生,变化,消亡的

并发性:内存中有多个进程实体,各进程可以并发执行

独立性:进程是能独立运行,独立获得资源,独立接收调度的基本单位

异步性:各进程按各自独立的,不可预知的速度向前推进,操作系统要提供进程同步机制来解决异步问题

结构性:各个进程都会配置一个PCB,结构上看,进程由程序段,数据段,PCB组成

进程的状态

状态

需要注意的是单核处理机环境下某一时刻只能有一个进程位于执行态,而双核环境下可以同时有两个进程处于运行态;就绪态就是拥有了除处理机一切资源,万事俱备,只欠CPU;阻塞态一般是向操作系统申请I/O设备时的等待,为了提高CPU的利用率,需先将其他资源配备齐了才能获得CPU;

进程的另两种状态——创建态,终止态

创建态:进程创建需要操作系统给他分配内存,创建PCB

终止态:操作系统回收进程拥有的资源同时撤销PCB

进程状态的转换

转换

这里要区分两点,运行态到阻塞态是进程通过系统调用转换成阻塞态,是主动行为;而又阻塞态到就绪态是因为操作系统给他分他想要的资源了,是被动的;还有,不能从阻塞态转回运行态,也不能从运行态转为阻塞态,前者是因为他没有处理机,后者是阻塞态必须是在运行态才能向操作系统请求。

进程控制

简单来说,进程控制就是实现进程之间的状态转化。而操作系统一般是通过原语来操作的,原语之前记过,这里只想强调一下他的原子性,就是不可分割,必须一起呵成的执行。用来控制进程转换的原语有(创建原语,撤销原语),(阻塞原语,唤醒原语)。注意这里我打括号的是成对的意思,就是创建了肯定要撤销,阻塞了肯定要唤醒。下面来细说说

创建原语:申请一个空白PCB,为新进程分配所需资源,初始化PCB,将PCB插入就绪队列

撤销原语:从PCB集合中找到终止进程的PCB,若进程正在运行,立即剥夺CPU,将CPU分配给其他进程,终止其所有子进程,将该进程的所有资源归还给父进程或操作系统,删除PCB

阻塞原语:找到要阻塞的进程对应的PCB,保护进程运行现场,将PCB状态信息设置为阻塞态,暂时停止进程进行,将PCB插入相应事件的等待队列。

唤醒原语:在事件等待队列中找到PCB,将PCB从等待队列移除,设置进程为就绪态,将PCB插入就绪队列,等待被调度

进程通信

顾名思义,进程通信就是指进程之间的信息交换。为了保证安全,一个进程不能直接访问另一个进程的地址空间。但是进程间的信息交换又必须实现,为了保证进程间的安全通信,操作系统提供了以下方法:

通信

共享存储:

共享

因为各进程的地址是不一样的,但又要进行通信,操作系统就会分配一个共享空间出来,供各进程做读写等操作,需要注意的如下这个例子,进程1和进程2不能同时对共享空间操作,他们俩必须是互斥的。共享存储有两种,基于数据结构的共享速度慢受限制多,比如他可能只能放长度为10的数组,是一种低级的通信方式。但基于存储区的操作就要好很多,在内存中划出一个存储区,数据的形式,存放位置都由进程控制,而不是操作系统,这种通信方式就比较高级。

管道通信:

管道实际上就是可供进程连续读写数据的一个共享文件,又名pipe文件,其实就是内存中开辟的一个缓冲区。但是通道只能是半双工通信,意思就是在某一时间内,他只能是单向的

管道

如果就想实现双向的,就要用两个管道,如下图所示

双管道

现在我们就拿只有一个管道的那个说,进程1往管道写时,进程2不能从管道中读,也就是说和上面的共享通信一样,这也得是互斥的,而且每次进程1必须把管道写满了,进程2才能读,同样的,进程2没读空,进程1也不允许写。数据一旦被从管道中读出,就会被管道抛弃,就再也找不回来了,因此读进程只能有一个。

消息传递:

进程间的数据交换是以格式化消息为单位进行传递的,其中消息头中包括发送进程ID,接收进程ID,消息类型等格式化的信息。有了ID就不怕会混了。进程通过操作系统提供的“发送消息/接收消息”两个原语进行数据交换。

消息

消息传递有两种方式,直接通信就是发送进程使用发送原语将消息直接挂在到接收进程的消息缓冲队列上,然后接受进程用接收原语接受,消息间接就是操作系统提供了一个信箱,进程们都可以往里面用发送原语存消息,接受的进程通过接收原语就可以接受,因为消息里有消息头,因此不存在弄错的情况

消息

消息

-------------本文结束感谢您的阅读-------------