多线程编程之进程、线程、进程间通信、线程间通信简介

http://blog.csdn.net/miraclewgf/article/details/48207645

进程:进程是一个程序在一个数据集合上的一次运行过程,是内存中正在执行的一个程序,每一个进程独立的占有内存空间。

线程:是进程中的一个实体,是被系统独立调度和执行的基本单位。

进程相当于线程在内执行的一个容器,本身是不活跃的,真正活跃的是线程,多个线程共享在一个进程中的地址空间,因此可以高效的共享数据;但是多个进程只能共享代码段,而不能共享数据。

以上是进程和线程的联系与区别。

 

进程间通信

既然每个进程是占有独立的地址空间且不能共享数据,那就需要有进程通信的方式,进程间通信(IPC)方式有以下几种:

(1)共享内存,独立的开辟一段内存空间,进程1往内存中写数据,进程2从内存中读数据,如果有其他进程,则另开辟内存空间即可。

(2)消息队列:可以传递消息

(3)管道:可以用来传递消息,但是是单向的

(4)互斥器:用来进程同步和互斥

(5)信号量:用来进程同步和互斥

(6)信号:用来进程同步和互斥

 

线程间通信

因为同一个进程中的线程是共享地址空间的,可以共享数据,因此线程间的通信方式个人认为就是处理线程间的同步和互斥,常用线程间通信的方式有以下几种:

(1)原子操作符集

(2)关键代码段(Windows)

(3)互斥锁

(4)信号量

(5)条件变量(Linux)

(6)读写锁(Linux)

以上为总结,后面再详细介绍各个通信方式。

======================================================================

IPC通常包括:同步(互斥锁、条件变量(Condition)、读写锁、信号量)

      信息传递(管道、FIFO即named pipe、消息队列)

      共享内存

      过程调用RPC

      套接字socket

同步也是一种通信,但是这种通信的目的是为了实现同步。而消息传递、socket等之类的IPC是为了交换数据,而不仅仅为了实现通信。

其次信号量可以实现同步,当然也可实现IPC。

 

===============================================================

http://www.cnblogs.com/qiaoconglovelife/articles/5265500.html

进程间通信与线程间通信【转】

操作系统的主要任务是管理计算机的软件、硬件资源。现代操作系统的主要特点是多用户和多任务,也就是程序的并行执行,windows如此linux也是如此。所以操作系统就借助于进程来管理计算机的软、硬件资源,支持多任务的并行执行。要并行执行就需要多进程、多线程。因此多进程和多线程间为了完成一定的任务,就需要进行一定的通信。而线程间通信又和进程间的通信不同。由于进程的数据空间相对独立而线程是共享数据空间的,彼此通信机制也很不同。

         线程间通信:由于多线程共享地址空间和数据空间,所以多个线程间的通信是一个线程的数据可以直接提供给其他线程使用,而不必通过操作系统(也就是内核的调度)。

        进程间的通信则不同,它的数据空间的独立性决定了它的通信相对比较复杂,需要通过操作系统。以前进程间的通信只能是单机版的,现在操作系统都继承了基于套接字(socket)的进程间的通信机制。这样进程间的通信就不局限于单台计算机了,实现了网络通信。

        进程的通信机制主要有:管道、有名管道、消息队列、信号量、共享空间、信号、套接字。

        管道:它传递数据是单向性的,只能从一方流向另一方,也就是一种半双工的通信方式;只用于有亲缘关系的进程间的通信,亲缘关系也就是父子进程或兄弟进程;没有名字并且大小受限,传输的是无格式的流,所以两进程通信时必须约定好数据通信的格式。管道它就像一个特殊的文件,但这个文件之存在于内存中,在创建管道时,系统为管道分配了一个页面作为数据缓冲区,进程对这个数据缓冲区进行读写,以此来完成通信。其中一个进程只能读一个只能写,所以叫半双工通信,为什么一个只能读一个只能写呢?因为写进程是在缓冲区的末尾写入,读进程是在缓冲区的头部读取,他们各自 的数据结构不同,所以功能不同。

        有名管道:看见这个名字就能知道个大概了,它于管道的不同的是它有名字了。这就不同与管道只能在具有亲缘关系的进程间通信了。它提供了一个路径名与之关联,有了自己的传输格式。有名管道和管道的不同之处还有一点是,有名管道是个设备文件,存储在文件系统中,没有亲缘关系的进程也可以访问,但是它要按照先进先出的原则读取数据。同样也是单双工的。

        消息队列:是存放在内核中的消息链表,每个消息队列由消息队列标识符标识,于管道不同的是,消息队列存放在内核中,只有在内核重启时才能删除一个消息队列,内核重启也就是系统重启,同样消息队列的大小也是受限制的。

信号量:也可以说是一个计数器,常用来处理进程或线程同步的问题,特别是对临界资源的访问同步问题。临界资源:为某一时刻只能由一个进程或线程操作的资源,当信号量的值大于或等于0时,表示可以供并发进程访问的临界资源数,当小于0时,表示正在等待使用临界资源的进程数。更重要的是,信号量的值仅能由PV操作来改变。

        共享内存:就是分配一块能被其他进程访问的内存。共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式。首先说下在使用共享内存区前,必须通过系统函数将其附加到进程的地址空间或说为映射到进程空间。两个不同进程A、B共享内存的意思是,同一块物理内存被映射到进程A、B各自的进程地址空间。进程A可以即时看到进程B对共享内存中数据的更新,反之亦然。由于多个进程共享同一块内存区域,必然需要某种同步机制,互斥锁和信号量都可以。采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝。对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共享内存则只拷贝两次数据[1]:一次从输入文件到共享内存区,另一次从共享内存区到输出文件。实际上,进程之间在共享内存时,并不总是读写少量数据后就解除映射,有新的通信时,再重新建立共享内存区域。而是保持共享区域,直到通信完毕为止,这样,数据内容一直保存在共享内存中,并没有写回文件。共享内存中的内容往往是在解除映射时才写回文件的。因此,采用共享内存的通信方式效率是非常高的。

         信号:信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是异步的,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达。信号是进程间通信机制中唯一的异步通信机制,可以看作是异步通知,通知接收信号的进程有哪些事情发生了。信号机制经过POSIX实时扩展后,功能更加强大,除了基本通知功能外,还可以传递附加信息。信号事件的发生有两个来源:硬件来源(比如我们按下了键盘或者其它硬件故障);软件来源。信号分为可靠信号和不可靠信号,实时信号和非实时信号。进程有三种方式响应信号1.忽略信号2.捕捉信号3.执行缺省操作。

        套接字:这一块在网络编程那一块讲的 很多,在此就不在说拉。

 

  linux中进程间通信和线程间通信的区别

  1.linux中的进程,是有fork()系统调用创建的,进程间都有独立的地址空间,他们之间不能直接通信,必须通过一些IPC进程进程间通信机制来完成。常见的IPC有:PIPE,命名管道,信号,共享内存以及socket等;

  2.linux中的线程,是clone()系统调用创建的,一个进程下的线程间是共享内存空间的,故线程A可以之间访问线程B中定义的变量,但是必须注意并发的情况。

  另:“线程上下文”的规模要远远小于进程上下文。

 

==========================================================

进程/线程同步、互斥、通信的问题:

http://blog.csdn.net/alvin_csdn_blog/article/details/64124077

最近也是遇到很多进程、线程同步、互斥,进程间通信的问题,这些问题放在一起很容易引起混淆,最近也查阅了相关的书籍资料和一些博客,在此写出自己的一些相关总结,希望对大家有帮助。

首先要说的是进程、线程两种最基本的关系:竞争关系和协作关系
进程的互斥、同步、通信都是基于这两种基本关系而存在的:
1.为了解决进程间竞争关系(间接制约关系)而引入进程互斥;
2.为了解决进程间松散的协作关系( 直接制约关系)而引入进程同步;
3.为了解决进程间紧密的协作关系而引入进程通信
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

定义(以进程为例): 
进程互斥:指若干个进程要使用同一共享资源时,任何时刻最多允许一个进程去使用,其他要使用该资源的进程必须等待,直到占有资源的进程释放该资源。 
进程的同步:是解决进程间协作关系( 直接制约关系) 的手段。进程同步指两个以上进程基于某个条件来协调它们的活动。一个进程的执行依赖于另一个协作进程的消息或信号,当一个进程没有得到来自于另一个进程的消息或信号时则需等待,直到消息或信号到达才被唤醒 
进程通信:进程之间互相交换信息的工作称之为进程通信IPC (InterProcess Communication),多个进程之间相互通信,交换信息传递数据的方法

接下来分别说一下各部分:


进程同步: 
不同的操作系统下进程同步的方式不同: 
Linux 下: 
Linux 下常见的进程同步方法有:SysVIPC 的 sem(信号量)、file locking / record locking(通过 fcntl 设定的文件锁、记录锁)、futex(基于共享内存的快速用户态互斥锁)。针对线程(pthread)的还有 pthread_mutex 和 pthread_cond(条件变量)。

Windows下: 
在Windwos中,进程同步主要有以下几种:互斥量、信号量、事件、可等计时器等几种技术。

在Windows下,进程通信主要有以下几种:内存映射、管道、消息等,但是内存映射是最基础的,因为,其他的进程通信手段在内部都是考内存映射来完成的


以上所说的是进程的同步方式,接下来介绍线程常见的同步方式,这也是进程常见的同步方式:

线程间的同步方式:常见的同步机制主要是:临界区、互斥区、事件、信号量这四种

临界区: 
临界区对应着一个CcriticalSection对象,当线程需要访问保护数据时,调用EnterCriticalSection函数;当对保护数据的操作完成之后,调用LeaveCriticalSection函数释放对临界区对象的拥有权,以使另一个线程可以夺取临界区对象并访问受保护的数据。 
PS:关键段对象会记录拥有该对象的线程句柄即其具有“线程所有权”概念,即进入代码段的线程在leave之前,可以重复进入关键代码区域。所以关键段可以用于线程间的互斥,但不可以用于同步(同步需要在一个线程进入,在另一个线程leave)

互斥量: 
互斥与临界区很相似,但是使用时相对复杂一些(互斥量为内核对象),不仅可以在同一应用程序的线程间实现同步,还可以在不同的进程间实现同步,从而实现资源的安全共享。

信号量: 
信号量的用法和互斥的用法很相似,不同的是它可以同一时刻允许多个线程访问同一个资源,PV操作

事件: 
事件分为手动置位事件和自动置位事件。事件Event内部它包含一个使用计数(所有内核对象都有),一个布尔值表示是手动置位事件还是自动置位事件,另一个布尔值用来表示事件有无触发。由SetEvent()来触发,由ResetEvent()来设成未触发。

注:信号量是进程同步与互斥的常用方法,也可以作为低级的进程通信方法
  • 1

接下来说一下进程间的通信方式:

进程同信: 
根据进程通信时信息量大小的不同,可以将进程通信划分为两大类型: 
1、低级通信,控制信息的通信(主要用于进程之间的同步,互斥,终止和挂起等等控制信息的传递) 
2、高级通信,大批数据信息的通信(主要用于进程间数据块数据的交换和共享,常见的高级通信有管道,消息队列,共享内存等).

进程通信的具体方式: 
1.管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,提供的共享文件通信机制 
2.有名管道 (named pipe) : 有名管道也是半双工的通信方式 
3.信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。不是用于交换大批数据,而用于多线程之间的同 步.常作为一种锁机制,防止某进程在访问资源时其它进程也访问该资源。 
4.消息队列( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。 
5.信号 ( signal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。 
6.共享内存( shared memory ):共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。 
7.套接字( socket ) : 套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信。

注:管道与管程是不同的,管程是进程同步的方式,而管道则是进程通信的方式
  • 1

这里再简单介绍一下线程通信的三种方式: 
线程间通信: 
1.使用全局变量 
主要由于多个线程可能更改全局变量,因此全局变量最好声明为violate 
2.使用消息实现通信 
在Windows程序设计中,每一个线程都可以拥有自己的消息队列(UI线程默认自带消息队列和消息循环,工作线程需要手动实现消息循环),因此可以采用消息进行线程间通信 
3.使用事件CEvent类实现线程间通信 
Event对象有两种状态:有信号和无信号,线程可以监视处于有信号状态的事件,以便在适当的时候执行对事件的操作。


综上所述:进程互斥、同步与通信的关系:互斥是一种特殊的同步,进程同步是一种进程通信,由此看来,进程互斥、同步都可以看做进程的通信

posted on 2017-10-28 21:24  小西红柿  阅读(4314)  评论(0编辑  收藏  举报

导航