前言
为什么出现进程,进程是什么,他解决了什么。
一、进程
1.进程的定义
为了更加贴切的描述程序并发过程中的变化,表现该动态性的特征,因为程序的静态性和顺序性无法描述该过程,添加了进程这一名称,来反馈系统的并发性,动态性,独立性,和相互制约的关系。比如我们浏览器打开一个网页,这里面就涉及到浏览器进程,网络进程,渲染进程等,而表面我们看到浏览器程序本身是没办法表示其中的变化过程。
特点
- 进程是程序的一次执行,运行实例,每一个进程有自己的独立内存空间
- 是和其他计算并发执行的计算
- 可以定义为一个数据结构及能在其上进行操作的一个程序
- 是一个程序及其数据在处理及上顺序执行时所发生的活动
- 是程序在一个数据集合上的运行过程,是系统进行资源分配和调配的一个独立单位
- 一个进程就是一个正在执行的程序,包括指令计数器,寄存器和变量的当前值
总结来说:进程是并发执行的程序在一个数据集合上的执行过程。资源分配的最小单位
2.进程间的通信方式
他丫的,记得曾经有次面试 ,就被追着这个问题问。回想当时,哎,真是狠己不争呀。
因为对于进程来说,他们的资源是独占的,进程之间的内容相互隔离,只能自己访问自己的,那么进程间如何进行通信呢?比如某个进程要把他的数据发送给别的进程。或者告诉他某些消息,比如网络进程获取到资源后,告诉渲染进程可以开始渲染了。
进程间的通信
我们说过进程间是独立的内存空间的,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程A把数据从用户空间拷到内核缓冲区,进程B再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信。
下面就有几种常见的方法:
信号量
根据交换信息量的大小,可以吧进程通信分为低级和高级通信,而信号量就是属于低级通信,因为他能传递的信息量小,效率低,但是优点是快。下面的三种都属于高级通信。
信号量机制一般是会设置初值 s.value 表示系统中某种资源的数量
同时分为 “P操作” 表示进程请求一个资源,所以又 s.value = s.value -1 当小于 0 就表示资源分配完了,需要等待。 执行 block 自我阻塞,插入到等待队列。
以及分为 “V操作” 表示进程请求一个资源,所以又 s.value = s.value +1 当小于等于 0 就表示等待队列有等待该资源的进程。 执行 waleup 唤醒等待队列中的一个进程。
信号量常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源,来解决进程同步和互斥的问题。
管道
该方式的所谓管道是指用来连接一个读进程和一个写进程,以实现进程间通信的一种共享文件(也叫pipe文件,)。数字类型只能为字符流。
消息队列
进程间的数据交换以信息为单位,用户通过使用操作系统提供的一组学习通信原语来实现信息的传递。同时根据实现的方式不同会分为直接通信方式和间接通信方式
共享内存
这种是进程通信前,可以向系统申请共享存储期间,并且指定该区间的名称。申请进程可以来连接到该共享区域中,便可以像读写普通存储区间一样对该共享区域进行读写操作,以达到传递大量学习的目的
3.IPC、LPC、RPC
IPC是进程间通信的缩写(IPC,Inter-Process Communication),进程间同信就是上面的介绍啦。这里就不过多的说了。但是进程间同信有可能是在同一台电脑上多个进程间的通信。也有可能是在网络上多台电脑间的进程通信。
同一台本机上的叫本地过程调用 (local procedure call),在我们的操作系统中,能使得多个任务同时传递信息会话,用到的也就是我们上面说的管道,共享内存等方式。
不在同一台本机上的叫远程过程调用 (remote procedure call),是指网络上的,用到网络通信协议的,比如我们用到的websocket ,http 就是。
二、线程
为了提高进程的并发性,进一步提高系统的吞吐量和效率。
优点
- 响应程度高,即使部分线程堵塞或时间很久也没关系,线程中间不会互相影响
- 资源共享,属于同一个进程的线程会共享进程的资源和内存
- 经济实惠
三、协程
- 比线程更加轻量级。一个线程可以拥有多个协程。其执行过程更类似于子例程,或者说不带返回值的函数调用。所以也可以说它的本质是一个单线程。
- 协程也相对独立,有自己的上下文,但其上下文切换由开发人员控制,不同于进程和线程由系统内核切换
- 当前协程切换到其他协程由当前协程来控制。
- 主要协程为了避免了无意义的调度,无需系统内核的上下文切换,提高性能,同时,协程也失去了标准线程使用多CPU的能力。
- 利用单线程和携程实现高并发处理
四、进程和线程的比较
- 一个程序至少有一个进程,一个进程至少有一个线程.
- 进程是拥有资源的基本单位,线程是调度和分派的基本单位,共享进程的资源
- 都具有并发性,但线程的划分小于进程,有效的提高了效率
- 多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。而是归属于的进程的下面。
- 每一个进程都有对应的接口,但线程必须依赖于进程,不能独立存在。
- 线程的意外终止会影响整个进程的正常运行,但是一个进程的意外终止不会影响其他的进程的运行。
- 进程切换开销大,效率低,线程切换开销小,效率高。
五、程序和进程的区别
- 程序是指令的集合,进程是程序的一次运行过程
- 进程是动态的,程序是静态的,并且进程会有一定的生命周期,从创建 ,执行,暂停,销毁等步骤。程序只是一组有序的指令实体。
- 进程是并发的,程序是顺序的
- 进程是有时效的(生命周期),程序是一个实体保存的具有永久性
- 一个进程可以在一个或对多个程序中执行;通过多次执行,一个程序可以对应多个进程
- 进程间的资源是独占式的,但线程间的资源是共享的
总结
总的来说,我们每一个程序都会产生一个或者多个进程,进程下面会有至少一个线程。进程有自己的独立内存空间,所以进程间的通信不能直接,需要通过一个中间介,并且可以有多种方式,比如信息号,共享内存,管道等。而线程间是共享他们同一个进程的资源的。另外进程间的通信如何避免冲突,还有很大的学问,我们有空再来探讨。