进程间通信和线程间通信的⼏种⽅式
进程
进程(Process)是计算机中的程序关于某数据集合上的⼀次运⾏活动,是系统进⾏资源分配和调度的基本单位,是结构的基础。在早期⾯向进程设计的计算机结构中,进程是程序的基本执⾏实体;在当代⾯向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。
进程是⼀个具有独⽴功能的程序关于某个数据集合的⼀次运⾏活动。它可以申请和拥有系统资源,是⼀个动态的概念,是⼀个活动的实体。它不只是程序的,还包括当前的活动,通过的值和处理的内容来表⽰。
进程的概念主要有两点:第⼀,进程是⼀个实体。每⼀个进程都有它⾃⼰的地址空间,⼀般情况下,包括区域(text region)、数据区域(data region)和(stack region)。⽂本区域存储处理器执⾏的代码;数据区域存储变量和进程执⾏期间使⽤的动态分配的内存;堆栈区域存储着活动过程调⽤的指令和本地变量。第⼆,进程是⼀个“执⾏中的程序”。程序是⼀个没有⽣命的实体,只有器赋予程序⽣命时(操作系统执⾏之),它才能成为⼀个活动的实体,我们称其为。
进程是具有⼀定独⽴功能的程序关于某个数据集合上的⼀次运⾏活动,进程是系统进⾏资源分配和调度的⼀个独⽴单位。每个进程都有⾃⼰的独⽴内存空间,不同进程通过进程间通信来通信。由于进程⽐较重量,占据独⽴的内存,所以上下⽂进程间的切换开销(栈、寄存器、虚拟内存、⽂件句柄等)⽐较⼤,但相对⽐较稳定安全。
线程
线程是进程的⼀个实体,是CPU调度和分派的基本单位,它是⽐进程更⼩的能独⽴运⾏的基本单位.线程⾃⼰基本上不拥有系统资源,只拥有⼀点在运⾏中必不可少的资源(如程序计数器,⼀组寄存器和栈),但是它可与同属⼀个进程的其他的线程共享进程所拥有的全部资源。线程间通信主要通过共享内存,上下⽂切换很快,资源开销较少,但相⽐进程不够稳定容易丢失数据。
⼀个线程可以创建和撤消另⼀个线程,同⼀进程中的多个线程之间可以并发执⾏。由于线程之间的相互制约,致使线程在运⾏中呈现出间断性。线程也有、和三种基本状态。就绪状态是指线程具备运⾏的所有条件,逻辑上可以运⾏,在等待处理机;运⾏状态是指线程占有处理机正在运⾏;阻塞状态是指线程在等待⼀个事件(如某个信号量),逻辑上不可执⾏。每⼀个程序都⾄少有⼀个线程,若程序只有⼀个线程,那就是程序本⾝。
线程是程序中⼀个单⼀的顺序控制流程。进程内⼀个相对独⽴的、可调度的执⾏单元,是系统独⽴调
度和分派CPU的基本单位指中的程序的调度单位。在单个程序中同时运⾏多个线程完成不同的⼯作,称为。
协程
协程是⼀种⽤户态的轻量级线程,协程的调度完全由⽤户控制。协程拥有⾃⼰的寄存器上下⽂和栈。协程调度切换时,将寄存器上下⽂和栈保存到其他地⽅,在切回来的时候,恢复先前保存的寄存器上下⽂和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下⽂的切换⾮常快。
进程、线程、协程的区别
概念
对于进程来说,⼦进程是⽗进程的复制品,从⽗进程那⾥获得⽗进程的数据空间,堆和栈的复制品。
⽽线程,相对于进程⽽⾔,是⼀个更加接近于执⾏体的概念,可以和同进程的其他线程之间直接共享数据,⽽且拥有⾃⼰的栈空间,拥有独⽴序列。
进程、线程共同点
它们都能提⾼程序的并发度,提⾼程序运⾏效率和响应时间。线程和进程在使⽤上各有优缺点。线程执⾏开销⽐较⼩,但不利于资源的管理和保护,⽽进程相反。同时,线程适合在SMP机器上运⾏,⽽进程可以跨机器迁移。
一个线程可以包含多个进程进程、线程不同点
多进程中每个进程有⾃⼰的地址空间,线程则共享地址空间。
所有其他区别都是因为这个区别产⽣的。⽐如说:
1) 地址空间:线程是进程内的⼀个执⾏单元,进程内⾄少有⼀个线程,它们共享进程的地址空间,⽽进程有⾃⼰独⽴的地址空间
2) 资源拥有:进程是资源分配和拥有的单位,同⼀个进程内的线程共享进程的资源
3) 线程是处理器调度的基本单位,但进程不是
4) ⼆者均可并发执⾏
5) 每个独⽴的线程有⼀个程序运⾏的⼊⼝、顺序执⾏序列和程序的出⼝,但是线程不能够独⽴执⾏,必须依存在应⽤程序中,由应⽤程序提供多个线程执⾏控制
1. 速度。线程产⽣的速度快,通讯快,切换快,因为他们处于同⼀地址空间。
2. 线程的资源利⽤率好。
3. 线程使⽤公共变量或者内存的时候需要同步机制,但进程不⽤。
⽽他们通信⽅式的差异也仍然是由于这个根本原因造成的。
线程、协程⽐较
1) ⼀个线程可以多个协程,⼀个进程也可以单独拥有多个协程,这样python中则能使⽤多核CPU。
2) 线程进程都是同步机制,⽽协程则是异步
3) 协程能保留上⼀次调⽤时的状态,每次过程重⼊时,就相当于进⼊上⼀次调⽤的状态
通信⽅式之间的差异
因为那个根本原因,实际上只有进程间需要通信,同⼀进程的线程共享地址空间,没有通信的必要,但要做好同步/互斥,保护共享的全局变量。⽽进程间通信⽆论是信号,管道pipe还是共享内存都是由操作系统保证的,是系统调⽤。
进程通信
管道(pipe)
管道是⼀种半双⼯的通信⽅式,数据只能单向流动,⽽且只能在具有亲缘关系的进程间使⽤。进程的亲缘关系通常是指⽗⼦进程关系。
有名管道 (namedpipe)
有名管道也是半双⼯的通信⽅式,但是它允许⽆亲缘关系进程间的通信。
信号量(semaphore)
信号量是⼀个计数器,可以⽤来控制多个进程对共享资源的访问。它常作为⼀种锁机制,防⽌某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同⼀进程内不同线程之间的同步⼿段。
消息队列(messagequeue)
消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载⽆格式字节流以及缓冲区⼤⼩受限等缺点。
信号 (sinal)
信号是⼀种⽐较复杂的通信⽅式,⽤于通知接收进程某个事件已经发⽣。
共享内存(shared memory)
共享内存就是映射⼀段能被其他进程所访问的内存,这段共享内存由⼀个进程创建,但多个进程都可以访问。共享内存是最快的 IPC ⽅式,它是针对其他进程间通信⽅式运⾏效率低⽽专门设计的。它往往与其他通信机制,如信号量,配合使⽤,来实现进程间的同步和通信。
套接字(socket)
套接⼝也是⼀种进程间通信机制,与其他通信机制不同的是,它可⽤于不同设备及其间的进程通信。
线程间的通信⽅式
锁机制:包括互斥锁、条件变量、读写锁
互斥锁提供了以排他⽅式防⽌数据结构被并发修改的⽅法。
读写锁允许多个线程同时读共享数据,⽽对写操作是互斥的。
条件变量可以以原⼦的⽅式阻塞进程,直到某个特定条件为真为⽌。对条件的测试是在互斥锁的保护下进⾏的。条件变量始终与互斥锁⼀起使⽤。
wait/notify 等待
Volatile 内存共享
CountDownLatch 并发⼯具
CyclicBarrier 并发⼯具
信号量机制(Semaphore)
包括⽆名线程信号量和命名线程信号量。
信号机制(Signal)
类似进程间的信号处理。
线程间的通信⽬的主要是⽤于线程同步,所以线程没有像进程通信中的⽤于数据交换的通信机制。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论