进程间通信和线程间通信&&进程和线程的区别

进程间的通讯方式

  1. 管道:管道的传递数据是单向性的,只能从一方流向另一方,是一种半双工的通信方式;只用于有亲缘关系的进程间通信(父子进程);管道他就像一个特殊的文件,但这个文件存在于内存之中,在创建管道时,系统为管道分配两个数据缓冲区,一个用来读数据,一个用来写数据,所以叫半双工。
  2. 信号:在原理上,一个进程收到一个信号和收到一个中断请求差不多。信号是异步的,一个进程不必通过任何操作来等待信号的到来,事实上,进程也不知道信号到底什么时候到达。信号是进程间通信机制中唯一的一部通信机制。信号一般是使用信号处理器来进行的。
  3. 信号量:信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它通常作为一种锁机制,防止某进程正在访问共享资源时,其它进程也在访问该资源。因此主要作为进程间以及同一进程内不同线程之间的同步手段。主要使用P,V操作来实现的。
  4. 消息队列:消息队列是一种比较高级的进程间通信方式,因为消息对垒是真的可以在进程间传送message,连传送一个“ I love you”都可以。消息队列是由消息组成的链表(有些书中也叫信箱),它可以被多个进程共享,可以供所有的进程在发送消息和接收消息时使用,并初始化一个无内容的消息。希望进入临界区的进程首先试图接收一条消息,若信箱为空,则阻塞该进程;一旦进程获得消息,它就执行其临界区然后把该消息放回信箱。注意一点:若有一条消息,则它仅仅能传递给一个进程,而其他进程被阻塞。若消息队列为空,则所有的进程被阻塞;一条消息可用时,仅仅激活一个阻塞进程并得到这一条消息。
  5. 共享内存:共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存可以说是最快的进程间通信方式。两个不同的进程A、B共享内存的意思是同一块物理内存被映射到A、B各自的进程地址空间。进程A可以即时看到进程B对共享内存中数据的更新,反之亦然。采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝。对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共享内存则只需要两次数据拷贝:一次是输入文件到共享内存中,另一次从共享内存区到输出文件。
  6. 套接字:主要指TCP/IP这一块,与其他通信机制不同的是它可以用于不同设备间的通讯。
  7. 有名管道:有名管道也是半双工的通信方式,允许无亲缘关系进程间的通信。

线程间的通信方式

  1. 锁机制:互斥锁,条件变量,自旋锁,读写自旋锁

       互斥锁:互斥锁和二元信号量原理基本上差不多。互斥是一个编程标志位,用来获取和释放一个对象。当需要的数据不能被分享或处理,进而在系统中的其他地方不能同时执行时,互斥被设置为锁定(一般为0),用于阻塞其它程序使用数据。当数据不再需要或程序运行结束时,互斥设定为非锁定。二元信号量和互斥量的区别在于,为互斥量加锁的进程和为互斥量解锁的进程必须是同一个进程。相比之下,二元信号量可能由某个进程执行加锁操作,但由另一个进程为其解锁。

       自旋锁:在Linux保护临界区的常用技术通常是自旋锁。在同一时刻,只有一个线程能获得自旋锁。其他任何试图获得自旋锁的线程将一直尝试(即自旋),直到获得了该锁。原理:自旋锁建立在内存中的一个整数上,任何线程进入临界区前都必须检查该值。若该值为0,则线程将该值设置为1,然后进入临界区。若该值非0,则该线程继续检查该值,直到它为0。

       读写自旋锁:读写自旋锁机制允许在内核中达到比基本自旋锁更高的并发程度。读写自旋锁允许多个线程同时以只读的方式访问同一数据结构。只有当一个进程想要更新数据结构时,才会互斥的访问改自旋锁。自旋锁在被读者拥有时,只要至少存在一个读者拥有该锁,写者就不能抢占该锁。而且,即使已有写者在等待改锁,新来的读者仍会抢先获得该自旋锁。

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

    2. 信号量机制:信号量机制中的信号量包括信号量和二元信号量。

        信号量用于进程间和线程间的同步,它是一个整数值。在信号量上只可以进行三种操作,即初始化、递增、递减。这三种操作都是原子操作。递减用于阻塞一个进程,递增用于接触一个进程的阻塞。信号量也被称为计数信号量或者一般信号量。

        二元信号量:只取0值和1值的信号量。

    3. 信号机制:信号是用于像一个进程或线程发生异步始键的机制。信号类似于硬件中断,没有优先级,即内核会公平的对待所有的信号量。对于同时发生的信号,一次只给进程一个信号,而没特定的次序。

常用的信号有:

1) SIGHUP 阻塞

2) SIGINT 中断

3) SIGQUIT 停止

9) SIGKILL 杀死:终止进程

15) SIGTERM 软件终止

进程和线程的区别

地址空间:同一进程的线程共享本进程的地址空间,而进程之间则是独立的地址空间。

资源享有:同一进程内的线程共享本进程的资源如内存、I/O、cpu等,但是进程之间的资源是独立的。

健壮性:一个进程奔溃后在保护模式下不会多其他进程产生影响,但是一个线程奔溃整个进程都死掉,所以多进程要比多线程健壮。

消耗:进程切换时,消耗的资源大,效率低。所以涉及到频繁的切换时,使用多线程比多进程好。同样如果要求同时进行并且又要共享某些变量的并发操作,只能用于线程不能用进程。

线程是程序执行的最小单位,进程是资源分配的最小单位。

两者均可以并发执行。

优缺点:

线程执行开销小,但是不利于资源的管理和保护。要求效率高,平凡切换时,资源的保护管理要求不是很高时,使用多线程。

进程执行开销大,但是能很好的进行资源管理和保护。对资源的管理和保护要求较高,不限制开销和效率时,使用多进程。

 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值