进程与线程及进程间通信

进程与线程及进程间通信

进程与线程

进程是操作系统OS分配资源的最小单元,是一个独立的应用程序代码基于一个数据集合的一次运行活动,它可以申请和拥有系统资源,是一个动态概念,而不仅仅是这串代码,也是活动,它拥有一个独立的虚拟内存地址空间。

线程是操作系统OS调度的最小单元,通常在一个进程中可以包含若干个线程,它们可以利用进程所拥有的资源。在引入线程的操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位。由于线程比进程更小,基本上不拥有系统资源(只是利用进程独有的资源),故对它的调度所付出的开销就会小得多,能更高效的提高系统内多个程序间并发执行的程度。

两者可以类比是进程是一个工厂,拥有独立的资源,不同工厂之间不能共享资源,而线程是工厂里各司其职的工人,共享工厂里资源即共享内存,通信速率很快,工厂各内存看成是个房间。

内存空间分布如下:


可知内存空间分布为用户空间(进程虚拟存储器)和内核空间(内核虚拟存储器)。用户空间从低端地址往高端地址发展,内核空间从高端地址往低端地址发展。用户空间存放着这个进程的代码段和数据段,以及运行时的堆和用户栈。堆是从低端地址往高端地址发展,栈是从高端地址往低端地址发展。内核空间存放着内核的代码和数据,以及内核为这个进程创建的相关数据结构,比如页表数据结构,task数据结构,area区域数据结构等等。

线程的特点:

1、一个进程可以产生多个线程,线程也可以产生另一个线程;

2、一个进程里的所有线程共享该进程独有的虚拟内存地址空间以达到共享内存,这是进程之间做不到的;

3、一个线程在使用某些某些共享内存时,其他内存必须等待,当然也可能是能供给固定数目的线程,当多余该数目时也需要等待;

4、为防止多个线程同步读写某一块内存,产生了锁机制。对于单一进程情况,产生互斥锁即先到先使用,后一个需要等待前者开锁;对于固定数目情况产生信号量机制,可引入固定数目的钥匙,进去的人就取一把钥匙,出来时再把钥匙挂回原处。后到的人发现钥匙架空了,就知道必须在门口排队等着了;

多进程优点:
每个进程互相独立,不影响主程序的稳定性,子进程崩溃没关系;
通过增加CPU,就可以容易扩充性能;
可以尽量减少线程加锁/解锁的影响,极大提高性能,就算是线程运行的模块算法效率低也没关系;
每个子进程都有2GB地址空间和相关资源,总体能够达到的性能上限非常大
 多进程缺点:
逻辑控制复杂,需要和主程序交互;
需要跨进程边界,如果有大数据量传送,就不太好,适合小数据量传送、密集运算
多进程调度开销比较大

多线程的优点:
无需跨进程边界;
程序逻辑和控制方式简单;
所有线程可以直接共享内存和变量等;
线程方式消耗的总资源比进程方式好;
  多线程缺点:
每个线程与主程序共用地址空间,受限于2GB地址空间;
线程之间的同步和加锁控制比较麻烦;
一个线程的崩溃可能影响到整个程序的稳定性;
到达一定的线程数程度后,即使再增加CPU也无法提高性能,例如Windows Server 2003,大约是1500个左右的线程数就快到极限了(线程堆栈设定为1M),如果设定线程堆栈为2M,还达不到1500个线程总数;线程能够提高的总性能有限,而且线程多了之后,线程本身的调度也是一个麻烦事儿,需要消耗较多的CPU

操作系统的设计,因此可以归结为三点:

(1)以多进程形式,允许多个任务同时运行。

(2)以多线程形式,允许单个任务分成不同的部分运行。

(3)提供协调机制,一方面防止进程之间和线程之间产生冲突,另一方面允许进程之间和线程之间共享资源。

(4)因为线程共享内存,故线程上下文切换比进程上下午切换快得多。

进程间通信

一个进程需要把它的数据发送给另一个进程,一般发送的数据量在一个字节或者几兆字节之间,常用通信情形:

共享数据:多个进程共享数据,一个进程对共享数据的修改,其他进程需要立刻看到;

通知事件:通知紧急事件;

资源共享:共享同样的资源;

进程控制:有些进程希望控制另一个进程的进行

Linux下进程间通信主要方式:

a)管道(pipo)和有名管道(FIFO)

b)消息队列

c)信号

d)共享内存

e)信号量

f)socket

1)管道(pipe)
管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用.进程的亲缘关系一般指的是父子关系.管道一般用于两个不同进程之间的通信.当一个进程创建了一个管道,并调用fork创建自己的一个子进程后,父进程关闭读管道端,子进程关闭写管道端,这样提供了两个进程之间数据流动的一种方式.

2)有名管道(named piep)
有名管道也是一种半双工的通信方式,但是它允许无亲缘关系进程间的通信.FIFO是一种先进先出的队列.它类似于一个管道,只允许数据的单向流动.每个FIFO都有一个名字,允许你不相关的进程访问同一个FIFO,因此也成为命名管.

3)信号

信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生.

4)消息队列
消息队列是消息的链表,存放在内核中并由消息队列标识符标识.消息队列克服了信号传递信息少,管道只能承载无格式字节流以及缓冲区大小受限等特点.消息队列是UNIX下不同进程之间可实现共享资源的一种机制,UNIX允许不同进程将格式化的数据流以消息队列形式发送给任意进程.对消息队列具有操作权限的进程都可以使用msget完成对消息队列的操作控制.通过使用消息类型,进程可以按任何顺序读信息,或为消息安排优先级顺序.

5)信号量
信号量是一个计数器,可以用来控制多个线程对共享资源的访问.,它不是用于交换大批数据,而用于多线程之间的同步.它常作为一种锁机制,防止某进程在访问资源时其它进程也访问该资源.因此,主要作为进程间以及同一个进程内不同线程之间的同步手段.


6)共享内存
共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问.共享内存是最快的IPC(进程间通信)方式,它是针对其它进程间通信方式运行效率低而专门设计的.它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步与通信.

7)套接字(socket)
套接口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同进程及其间进程的通信.具体socket也将应用与进程间网络通信,内容将在下一篇详述。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值