目录
1、进程的介绍
2、进程的五个基本特性
3、进程的组成
4、进程的并行和并发执行
5、进程的状态
6、进程的通信
7、线程
1、进程的介绍
进程(Process)是程序在某个数据集合上的一次运行活动,也是操作系统进行资源分配和保护的基本单位。
简单来说,进程就是程序的一次执行过程,程序是静态的,它作为系统中的一种资源是永远存在的。而进程是动态的,它是动态的产生,变化和消亡的,拥有其自己的生命周期。举例子理解:同时挂三个 QQ 号,它们就对应三个 QQ 进程,退出一个就会杀死一个对应的进程。但是,就算你把这三个 QQ 全都退出了,QQ 这个程序死亡了吗?显然没有死亡,程序还是存储在存储器中的,除非你把这个程序从存储体中给删除了(这一操作就相当于我们卸载手机里的软件)。
进程不仅包含正在运行的程序实体,它还包括这个运行的程序中占据的所有系统资源,比如说 CPU、内存、网络资源等。一些人会把进程理解为它就是一个运行的实体,而忽略掉了进程所占据的资源。比如说,同样一个程序,同一时刻被两次运行了,那么他们就是两个独立的进程,这两个进程所占用的资源是相互独立的。
2、进程的五个基本特性
(1)动态性:进程是程序的一次执行,它有着创建、活动、暂停、终止等过程,具有一定的生命周期,是动态地产生、变化和消亡的。动态性是进程最基本的特征。
(2)并发性:指多个进程实体同时存于内存中,能在一段时间内同时运行。并发性是进程的重要特征,同时也是操作系统的重要特征。引入进程的目的就是为了使程序能与其他进程的程序并发执行,以提高资源利用率。
(3)独立性:指进程实体是一个能独立运行、独立获得资源和独立接受调度的基本单元。凡未建立PCB的程序都不能作为一个独立的单元参与运行。
(4)异步性:由于进程的相互制约,使得进程具有执行的间断性,即进程按各自独立的、不可预知的速度走走停停、何时开始何时暂停何时结束不可预知的性质,就会导致执行结果的不可再现性,为此在操作系统中必须配置相应的进程同步机制。
(5)结构性:每个进程都配置一个PCB对其进行描述。从结构上看,进程实体是由程序段、数据段和进程控制块三部分组成的。
3、进程的组成
从结构上看,进程实体是由程序段、数据段和进程控制块三部分组成的。
进程控制块 PCB:每个进程有且仅有一个进程控制块(Process Control Block,PCB),或称作进程描述符,它是进程存在的唯一标识,是操作系统用来记录和刻画进程状态及环境信息的数据结构,也是操作系统掌握进程的唯一资料结构和管理进程的主要依据。所以 PCB 是提供给操作系统使用的,操作系统需要对各个进程进行管理,所有管理时所需要的信息,都会被放在 PCB 中。创建进程和撤销进程等都是指对 PCB 的操作,当进程被创建时,操作系统为其创建 PCB,当进程结束时,会回收其 PCB。
进程控制块 PCB 一般包含如下四类信息:
进程描述信息:用来让操作系统区分各个进程,当进程被创建时,操作系统会为该进程分配一个唯一的、不重复的 “身份证号”— PID(ProcessID,进程 ID)。另外,进程描述信息还包含进程所属的用户 ID(UID)
进程控制和管理信息:记录进程的运行情况。比如 CPU 的使用时间、磁盘使用情况、网络流量使用情况等。
资源分配清单:记录给进程分配了哪些资源。比如分配了多少内存、正在使用哪些 I/O 设备、正在使用哪些文件等。
CPU 相关信息:进程在让出 CPU 时,必须保存该进程在 CPU 中的各种信息,比如各种寄存器的值。用于实现进程切换,确保这个进程再次运行的时候恢复 CPU 现场,从断点处继续执行。这就是所谓的保存现场信息。
数据段:一个进程的数据段,可以是进程对应的程序加工处理的原始数据,也可以是程序执行时产生的中间或最终结果,即进程运行过程中的各种数据(比如程序中定义的变量)。
程序段:程序段就是能被进程调度时程序调度到CPU执行的程序代码段(指令序列)。注意,程序可被多个进程共享,即多个进程可以运行同一个程序。例如:同时挂三个 QQ 号,会对应三个 QQ 进程,它们的 PCB、数据段各不相同,但程序段的内容都是相同的(都是运行着相同的 QQ 程序)
4、进程的并行和并发执行
由上面的介绍可知,进程是操作系统中的一个独立执行单位,它包含了程序的代码和数据。具有以下特点:
独立地址空间:每个进程都有自己独立的地址空间,不同进程之间的数据不共享。
独立资源:每个进程有自己的资源,如文件句柄和网络连接。
互相隔离:进程之间互相隔离,一个进程的错误不会影响其他进程。
线程的并行
进程的并行性指的是多个进程在同一时间段内同时执行的能力。例:假设进程1和进程2在某个时间点同时执行任务,它们都能够在同一时间段内完成任务。这种情况下,可以说进程具有并行性。
如下图所示:
线程的并发
进程的并发性指的是多个进程在同一时间段内交替执行的能力。例:假设有两个进程,进程1和进程2,它们同时运行在操作系统中。在某个时间点,进程1执行一段代码,然后暂停;接着,进程2开始执行一段代码,然后暂停;再然后,进程1继续执行,依此类推。虽然进程1和进程2在同一时间段内交替执行,但它们不一定同时完成任务,因此可以说进程具有并发性。
如下图所示:
5、进程的状态
在计算机运行时,每时每刻都有进程的存在,而操作系统的作用就是要控制这些进程,这就是进程控制(所谓进程控制就是对系统中的所有进程实施有效的管理,实现进程状态转换功能。包括创建进程、阻塞进程、唤醒进程、终止进程等)在进程控制过程中,比如有用户登录系统、作业调度和应用程序的请求等任务出现时,就会创建进程;然后当这个任务执行时需要等待从外部读取数据时,就会阻塞进程(这里不是只有这一种情况会被阻塞,还有其他的情况),然后把CUP的使用权交给其他进程;等被阻塞进程拿到它需要的数据时,就会唤醒这个被阻塞的进程;当这个进程运行CUP的时间片用完或者被优先级更高的进程抢夺了CUP就会进行进程切换;当进程正常结束、发生异常或因为外界干预,就会终止进程。
在这一整个过程中,进程所有的状态如下:
(一)新建状态:进程正在被创建,创建好后会转到就绪状态。创建进程通常需要先申请一个空白的PCB,并向PCB中填写一些控制和管理进程的信息,然后由系统为该进程分配运行时所必须的资源,最后把该进程转入就绪状态。
(二)就绪状态:进程获得了除处理机外的一切所需资源,一旦得到处理机,便可立即运行。系统中处于就绪状态的进程可能有多个,通常将他们排成一个队列,成为就绪队列。
(三)运行状态:进程占有CUP,正在处理机上运行。在单核处理机环境下,每个时刻最多只有一个进程处于运行状态。
(四)阻塞状态:又称等待状态。进程正在等待某一事件而暂定运行,如等待某资源为可用或等待输入/输出完成。即使处理机空闲,该进程也不能运行。
(五)终止状态:进程正从系统中消失,可能是进程正常结束或其他原因中断退出运行。进程需要结束运行时,系统首先必须置该进程为结束状态,然后再进一步处理资源释放和回收等工作。
进程每种状态之间的转换关系图:
6、进程的通信
1、共享存储:在通信的进程之间存在一块可直接访问的共享空间,通过对这片共享空间进行写/读操作实现进程之间的信息交换,如下图所示,在对共享空间进行写/读操作时,需要使用同步互斥工具,对共享空间的写/读进行控制。如下图示
2、消息传递:进程通过系统提供的发送消息和接收消息两个原语进行数据交换。
(1)直接通信方式:发送进程直接把消息发送给接收进程,并将它挂在接收进程的消息缓存队列上,接收进程从消息缓冲队列中取得消息。
(2)间接通信方式:发送进程把消息发送到某个中间实体,接收进程从中间实体取得消息。这种中间实体一般称为信箱,这种通信方式又称信箱通信方式。该通信方式广泛运用于计算机网络中,相应的通信系统称为电子邮件系统。
3、管道通信:管道通信是消息传递的一种特殊方式。所谓“管道”,是指用于连接一个读进程和一个写进程以实现他们之间的通信的一个共享文件,又称pipe文件。向管道提供输入的发送进程,以字符流形式将大量的数据送入管道;而接收管道输出的接收进程则从管道中接收数据。管道机制必须提供以下三方面的协调能力:互斥、同步和确定对方的存在。如下图示
7、线程
根据前面可知进程就能达到并行的目的,那么为什么还需要线程呢?这是因为线程比进程成本更低。因为创建一个进程需要为其分配各种资源,而线程只需要使用进程事先分配好的即可;进程之间的通信成本也会较高,而线程则是在一个进程的环境下,通信起来会很方便。其实,我们可以把线程看做是一个“轻量级”的进程。
进程的代价
空间代价:进程控制块及协调各运行机构所占用的内存空间开销
时间代价:进行进程间的切换、同步及通信等所付出的时间开销
一个进程中可以有多个线程,同一个进程中的多个线程共享这个进程的资源。
比如,QQ 和 Chrome 浏览器是两个进程,Chrome 进程里面有很多线程,例如 HTTP 请求线程、事件响应线程、渲染线程等等,线程的并发执行使得在浏览器中点击一个新链接从而发起 HTTP 请求时,浏览器还可以响应用户的其它事件。
线程的特征和进程差不多,进程有的他基本都有,比如:
线程具有就绪、阻塞、运行三种基本状态,同样具有状态之间的转换关系;
线程间可以并发执行
在多 CPU 环境下,各个线程也可以分派到不同的 CPU 上并行执行
线程的优点:
(1)一个进程中可以同时存在多个线程,这些线程共享该进程的资源。进程间的通信必须请求操作系统服务(因为 CPU 要切换到内核态),开销很大。而同进程下的线程间通信,无需操作系统干预,开销更小。
不过,需要注意的是:从属于不同进程的线程间通信,也必须请求操作系统服务。(2)线程间的并发比进程的开销更小,系统并发性提升。
同样,需要注意的是:从属于不同进程的线程间切换,它是会导致进程切换的,所以开销也大。线程的缺点:
当进程中的一个线程奔溃时,会导致其所属进程的所有线程奔溃。
比如:对于游戏的用户设计,就不应该使用多线程的方式,否则一个用户挂了,会影响其他同个进程的线程。
这里只对线程做一个简单的介绍,想详细了解的可以自行去搜索线程相关的知识。
推荐:
【Java基础】IO流(三):字符流的FileReader(文件字符输入流)和 FileWriter(文件字节输出流)-CSDN博客https://blog.csdn.net/m0_65277261/article/details/136721417?spm=1001.2014.3001.5501【Java基础】IO流(二)字符集知识-CSDN博客https://blog.csdn.net/m0_65277261/article/details/136721466?spm=1001.2014.3001.5501【java基础】异常处理机制-CSDN博客https://blog.csdn.net/m0_65277261/article/details/136581375?spm=1001.2014.3001.5501