Linux 进程PK线程;互斥量PK信号量

一.进程与线程
1.进程
进程是一个具有一定独立功能的程序的一次运行活动,同时也是资源分配的最小单元
进程是程序执行时的一个实例,即它是程序已经执行到某种程度的数据结构的汇集。
从内核的观点看,进程的目的就是担当分配系统资源(CPU时间、内存等)的基本单位。
Linux系统是一个多进程的系统,它的进程之间具有并行性、互不干扰等特点。
每个进程都是一个独立的运行单位,拥有各自的权利和责任。各个进程都运行在独立的虚拟地址空间,因此,即使一个进程发生异常,它也不会影响到系统中的其他进程。

2.线程
线程是进程的一个执行流,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。
一个进程由几个线程组成(拥有很多相对独立的执行流的用户程序共享应用程序的大部分数据结构),线程与同属一个进程的其他的线程共享进程所拥有的全部资源。

3.区别
1)”进程——资源分配的最小单位,线程——程序执行的最小单位”
2)进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响;而线程只是一个进程中的不同执行路径,当其中一个线程出现错误会直接导致主线程崩溃,即导致这个进程结束。
3)线程有自己的堆栈和局部变量,但线程没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
4)进程有独立的地址空间,线程没有单独的地址空间(同一进程内的线程共享进程的地址空间)。

4.多进程的优点
1)多进程更稳定(一个线程挂掉整个程序挂,而一个进程挂掉不会影响其它进程)每个进程互相独立,不影响主程序的稳定性,子进程崩溃没关系;
2)可以尽量减少线程加锁/解锁的影响,极大提高性能,就算是线程运行的模块算法效率低也没关系
3) 每个子进程都有4GB地址空间和相关资源,总体能够达到的性能上限非常大。

5.多进程的缺点
1)操作系统调度切换多个进程要比切换调度线程在速度上慢的多,对不同进程来说,它们具有独立的数据空间,要进行数据的传递只能通过进程间通信的方式进行,这种方式不仅费时,而且很不方便。
2)在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这是一种”昂贵”的多任务工作方式

6.多线程的优点
1)和进程相比,它是一种非常“节俭”的多任务操作方式。运行于一个进程中的多个线程,它们之间使用相同的地址空间,而且线程间彼此切换所需的时间也远远小于进程间切换所需要的时间.据统计,一个进程的开销大约是一个线程开销的30倍左右
2)线程间方便快捷的通信机制。由于同一进程下的线程之间共享数据空间,所以一个线程的数据可以直接为其它线程所用,这不仅快捷,而且方便
3)使多CPU系统更加有效.操作系统会保证当线程数不大于CPU数目时,不同的线程运行于不同的CPU上.
4)改善程序结构.一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独立的运行部分,这样的程序会利于理解和修改.

7.多线程的缺点
1)每个线程与主程序共用地址空间,受限于4GB地址空间
2)线程之间的同步和加锁控制比较麻烦
3)一个线程的崩溃影响到整个程序的稳定性
4)到达一定的线程数程度后,即使再增加CPU也无法提高性能,例如在Linux环境下,每个线程私有空间大约是2M,因此运行1500个左右的线程数就已经 极限了(当然线程的私用空间大小可以改变)
5)线程能够提高的总性能有限,而且线程多了之后,线程本身的调度也是一个麻烦事儿,需要消耗较多的CPU。

二.互斥量与信号量
1.互斥量Mutex
对共享资源的访问, 要使用互斥量进行加锁, 如果互斥量已经上了锁, 调用线程会阻塞, 直到互斥量被解锁。
在操作完成后,必须给互斥量解锁,也就是前面所说的释放。这样其他等待该锁的线程才有机会获得该锁,否则其他线程将会永远阻塞。

2.信号量Semaphore
又名:信号灯,与其他进程间通信方式不大相同,主要用途是保护临界资源.
进程可以根据它判定是否能够访问某些共享资源。除了用于访问控制外,还可用于进程同步
信号灯强调共享资源,只要共享资源可用,其他进程同样可以修改信号灯的值;
互斥锁更强调进程,占用资源的进程使用完资源后,必须由进程本身来解锁。
计数信号灯:信号灯的值可以取任意非负值
二值信号灯:信号灯的值只能取0或1,类似于互斥锁。 但两者有不同:

3.区别
Mutex是一把钥匙,一个人拿了就可进入一个房间,出来的时候把钥匙交给队列的第一个。
Semaphore是一件可以容纳N人的房间,如果人不满就可以进去,如果人满了,就要等待有人出来。
对于N=1的情况,称为binary semaphore(二值信号量)。
Binary semaphore与Mutex的差异:
1. mutex要由获得锁的线程来释放(谁获得,谁释放)。而semaphore可以由其它线程释放
2. 初始状态可能不一样:mutex的初始值是1 ,semaphore的初始值可能是0(或者为1)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值