程序是为解决一个信息处理任务而预先编制的工作执行方案,是由一串CPU能够执行的基本指令组成的序列,每一条指令规定了计算机应进行什么 *** 作(如加、减、乘、判断等)及 *** 作需要的有关数据。
进程指是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位。
线程是指线程是进程中的一个实体,是被系统独立调度和执行的基本单位。
管程
管程是指管程实际上是定义了一个数据结构和在该数据结构上的能为并发进程所执行的一组 *** 作,这组 *** 作能同步进程和改变管程中的数据。
关系
(1)作业是在较早的多道批处理系统中提出的,现代 *** 作系统基本没有这个概念。一般来说作业是可以包含多个程序或数据集,但至少有一个程序。怎么理解呢?个人任务程序和作业可以从功能的角度来理解。打个比方,今天班主任要求我们进行班级大扫除,这可以看做一个作业。而这个作业被我们分成擦窗户,洗地板等等,这些所谓的“子作业”可以看成是一个一个的程序。
(2)一个程序可以有多个进程,一个线程可以包含多个程序。前半句比较好理解,那上面那个例子来说,比如说实现擦窗户这个程序。有些人(资源)去准备好布(资源)和水(资源),供别人擦洗;有些人(资源)接布进程擦窗户。这便可以理解为实现这个程序功能的两个线程。而为什么又说一个线程可以包含多个程序?仔细看清楚是“包含”。其实便是在这个进程里面直接调用其他程序,也就是使用程序的功能。
(3)一个进程至少有一个线程. 线程的划分尺度小于进程,多个线程共享进程内存。多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但 *** 作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。 一个线程可以创建和撤销另一个线程同一个进程中的多个线程之间可以并发执行。还是拿上面的例子来讲,实现擦窗户这个功能的程序创建了两个进程。需要的资源有:人、布、水。这些资源早在创建的时候就已经申请了。第一条进程“有些人(资源)去准备好布(资源)和水(资源),供别人擦洗“现在可以开辟多个线程来细化这个任务。可以叫其中一个人去打水,其中一个人负责洗布,其中一个人传递干净的布等,这便是一个个线程。而无论开辟多少个线程,使用的资源都是来自进程已申请的,无法脱离进程而独自存在。另外,线程之间是独立的,打水的,洗布的,传递的,只要自己干好自己的活,没有必然的相互依赖的关系。而且可以同时进行,这便是多线程的好处所在。
(4)而对于管程呢?通俗的理解就是”管理进程“。死锁问题的存在导致管程于1971年被Dijkstra提出,说道:把所有进程对某一种临界资源的同步 *** 作都集中起来,构成一个所谓的秘书进程。凡要访问该临界资源的进程,都需先报告秘书,由秘书来实现诸进程对同一临界资源的互斥使用。
管程由四部分组成:
1).管程内部的共享变量。
2).管程内部的条件变量。
3).管程内部并行执行的进程。
4).对于局部与管程内部的共享数据设置初始值的语句。
回到例子,上面说道两个进程中,有些人去准备布和水的工作,有些人要擦窗户。那么问题来了。准备布工作的人的名单中却写着准备水的人,那么问题来了,这个人到底该干吗?如果准备布工作要了这个人,这个人一直工作着,而准备水的工作一直等着他去做,那么就一直等着吗?更极端的情况下,这个一直在洗布就不去换水,这便是死锁的一个情形。没关系,此时班主任来了,看到在场的情形,他决定了此时这个人应该去干嘛,解决了用人冲突的问题,其作用类似管程。
IBM有个家伙做了个测试,发现切换线程context的时候,windows比linux快一倍多。进出最快的锁(windows2k的 critical section和linux的pthread_mutex),windows比linux的要快五倍左右。当然这并不是说linux不好,而且在经过实际编程之后,综合来看我觉得linux更适合做high performance server,不过在多线程这个具体的领域内,linux还是稍逊windows一点。这应该是情有可原的,毕竟unix家族都是从多进程过来的,而 windows从头就是多线程的。如果是UNIX/linux环境,采用多线程没必要。
多线程比多进程性能高?误导!
应该说,多线程比多进程成本低,但性能更低。
在UNIX环境,多进程调度开销比多线程调度开销,没有显著区别,就是说,UNIX进程调度效率是很高的。内存消耗方面,二者只差全局数据区,现在内存都很便宜,服务器内存动辄若干G,根本不是问题。
多进程是立体交通系统,虽然造价高,上坡下坡多耗点油,但是不堵车。
多线程是平面交通系统,造价低,但红绿灯太多,老堵车。
我们现在都开跑车,油(主频)有的是,不怕上坡下坡,就怕堵车。
高性能交易服务器中间件,如TUXEDO,都是主张多进程的。实际测试表明,TUXEDO性能和并发效率是非常高的。TUXEDO是贝尔实验室的,与UNIX同宗,应该是对UNIX理解最为深刻的,他们的意见应该具有很大的参考意义。
多线程的优点:
无需跨进程边界;
程序逻辑和控制方式简单;
所有线程可以直接共享内存和变量等;
线程方式消耗的总资源比进程方式好;
多线程缺点:
每个线程与主程序共用地址空间,受限于2GB地址空间;
线程之间的同步和加锁控制比较麻烦;
一个线程的崩溃可能影响到整个程序的稳定性;
到达一定的线程数程度后,即使再增加CPU也无法提高性能,例如Windows Server 2003,大约是1500个左右的线程数就快到极限了(线程堆栈设定为1M),如果设定线程堆栈为2M,还达不到1500个线程总数;
线程能够提高的总性能有限,而且线程多了之后,线程本身的调度也是一个麻烦事儿,需要消耗较多的CPU
多进程优点:
每个进程互相独立,不影响主程序的稳定性,子进程崩溃没关系;
通过增加CPU,就可以容易扩充性能;
可以尽量减少线程加锁/解锁的影响,极大提高性能,就算是线程运行的模块算法效率低也没关系;
每个子进程都有2GB地址空间和相关资源,总体能够达到的性能上限非常大
多线程缺点:
逻辑控制复杂,需要和主程序交互;
需要跨进程边界,如果有大数据量传送,就不太好,适合小数据量传送、密集运算
多进程调度开销比较大;
最好是多进程和多线程结合,即根据实际的需要,每个CPU开启一个子进程,这个子进程开启多线程可以为若干同类型的数据进行处理。当然你也可以利用多线程+多CPU+轮询方式来解决问题……
方法和手段是多样的,关键是自己看起来实现方便有能够满足要求,代价也合适。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)