美文网首页
计算机基础知识—进程通信线程同步专题

计算机基础知识—进程通信线程同步专题

作者: zuoerfeng | 来源:发表于2018-11-06 15:56 被阅读0次

2018-11-06

进程通信方法:

套接字socket

a、使用socket通信的方式实现起来简单,可以使用因特网域和UNIX域来实现,使用因特网域可以实现不同主机之间的进出通信。
b、该方式自身携带同步机制,不需要额外的方式来辅助实现同步。
c、随进程持续。

共享内存

a、最快的一种通信方式,多个进程可同时访问同一片内存空间,相对其他方式来说具有更少的数据拷贝,效率较高。
b、需要结合信号灯或其他方式来实现多个进程间同步,自身不具备同步机制。
c、随内核持续,相比于随进程持续生命力更强。

管道

a、较早的一种通信方式,缺点明显:只能用于有亲缘关系进程之间的通信;只支持单向数据流,如果要双向通信需要多创建一个管道来实现。
b、自身具备同步机制。
c、随进程持续。

命名管道(FIFO)

a、是有名管道,所以支持没有亲缘关系的进程通信。和共享内存类似,提供一个路径名字将各个无亲缘关系的进程关联起来。但是也需要创建两个描述符来实现双向通信。
b、自身具备同步机制。
c、随进程持续。

信号

a、这种通信可携带的信息极少。不适合需要经常携带数据的通信。
b、不具备同步机制,类似于中断,什么时候产生信号,进程是不知道的。

消息队列

a、与共享内存和FIFO类似,使用一个路径名来实现各个无亲缘关系进程之间的通信。消息队列相比于其他方式有很多优点:它提供有格式的字节流,减少了开发人员的工作量;消息具有类型(system V)或优先级(posix)。其他方式都没有这些优点。
b、具备同步机制。
c、随内核持续。

线程通信同步机制

1、锁机制

互斥锁:提供了以排它方式阻止数据结构被并发修改的方法。互斥锁的作用就是互斥,mutual exclusive,是用来保护临界区(critical section)的。所谓临界区就是代码的一个区间,如果两个线程同时执行就有可能出问题,所以需要互斥锁来保护。

自旋锁是一种互斥锁的实现方式而已,相比一般的互斥锁会在等待期间放弃cpu,自旋锁(spinlock)则是不断循环并测试锁的状态,这样就一直占着cpu。

读写锁:允许多个线程同时读共享数据,而对写操作互斥。

条件变量:可以以原子的方式阻塞进程,直到某个特定条件为真为止。对条件测试是在互斥锁的保护下进行的。条件变量始终与互斥锁一起使用。

2、信号量机制:包括无名线程信号量与有名线程信号量

信号量(semaphore)是一种更高级的同步机制,mutex可以说是semaphore在仅取值0/1时的特例。Semaphore可以有更多的取值空间,用来实现更加复杂的同步,而不单单是线程间互斥。

3、信号机制:类似于进程间的信号处理。


协程

协程,又称微线程,纤程。英文名Coroutine。
协程的概念很早就提出来了,但直到最近几年才在某些语言(如Lua)中得到广泛应用。

子程序,或者称为函数,在所有语言中都是层级调用,比如A调用B,B在执行过程中又调用了C,C执行完毕返回,B执行完毕返回,最后是A执行完毕。

所以子程序调用是通过栈实现的,一个线程就是执行一个子程序。子程序调用总是一个入口,一次返回,调用顺序是明确的。而协程的调用和子程序不同。

协程看上去也是子程序,但执行过程中,在子程序内部可中断,然后转而执行别的子程序,在适当的时候再返回来接着执行。注意,在一个子程序中中断,去执行其他子程序,不是函数调用,有点类似CPU的中断。

比如子程序A、B:
def A():
    print '1'
    print '2'
    print '3'

def B():
    print 'x'
    print 'y'
    print 'z'

假设由协程执行,在执行A的过程中,可以随时中断,去执行B,B也可能在执行过程中中断再去执行A,
结果可能是:

1
2
x
y
3
z

但是在A中是没有调用B的,所以协程的调用比函数调用理解起来要难一些。
看起来A、B的执行有点像多线程,但协程的特点在于是一个线程执行,那和多线程比,协程有何优势?
最大的优势就是协程极高的执行效率。因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显。

第二大优势就是不需要多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多。
因为协程是一个线程执行,那怎么利用多核CPU呢?最简单的方法是多进程+协程,既充分利用多核,又充分发挥协程的高效率,可获得极高的性能。

相关文章

  • 计算机基础知识—进程通信线程同步专题

    2018-11-06 进程通信方法: 套接字socket a、使用socket通信的方式实现起来简单,可以使用因特...

  • 进程的同步与通信,进程与线程同步的区别,进程与线程通信的区别

    进程同步与互斥的区别? 进程的同步方式有哪些? 进程的通信方式有哪些? 进程同步与通信的区别是什么? 线程的同步/...

  • 浏览器运行原理

    进程 申请和拥有计算机资源 不同进程间通信通过进程间通信管道IPC 线程 一个进程多个线程,每个线程执行不同的任务...

  • python之多线程与多进程入门

    python之多线程与多进程 关键词: GIL锁,IO繁忙,线程安全,线程同步,进程池,进程通信,队列 GIL锁;...

  • 进程/多线程

    进程与线程 线程 创建定时器 线程同步synchronized 线程通信-wait/notify Lock&Con...

  • [python] 多进程通信

    引言 进程间通信与线程间通信有相同的地方,也有不同的地方。threading模块中用于线程同步的机制在进程中是不能...

  • Java 多线程入门

    目录 基本概念:程序、进程、线程线程的创建与使用线程的生命周期线程的同步线程的通信 一 程序、进程、线程 程序(p...

  • 线程间通信

    线程间的通信目的主要是用于线程同步,所以线程没有像进程通信中的用于数据交换的通信机制。 1)锁机制:包括互斥锁、条...

  • 操作系统拾遗--进程同步、互斥

    进程通信 进程通信--进程之间的信息交换,如同步、互斥。 进程通信分为: 低级通信方式:同步与互斥 高级通信方式:...

  • 什么是线程安全?一文带你深入理解

    上篇文章有介绍过进程与线程的基础知识,进程下拥有多个线程,虽然多线程间通信十分方便(同进程),但是却带来了线程安全...

网友评论

      本文标题:计算机基础知识—进程通信线程同步专题

      本文链接:https://www.haomeiwen.com/subject/gtuuxqtx.html