欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

进程、线程

最编程 2024-07-19 08:53:31
...

进程和线程的基本概念和区别?

进程是对运行时程序的封装,是系统进行资源调度和分配的的基本单位,是一个能独立运行的活动实体。

线程是进程的一个实体,是CPU调度和分派的基本单位,用于保证程序的实时性,实现进程内部的并发。线程是操作系统可识别的最小执行和调度单位。每个线程都独自占用一个虚拟处理器:独自的寄存器组,指令计数器和处理器状态。每个线程完成不同的任务,但是共享同一地址空间(也就是同样的动态内存,映射文件,目标代码等等),打开的文件队列和其他内核资源。

1.一个线程只能属于一个进程,而一个进程可以有多个线程。线程依赖于进程而存在。

2.进程在执行过程中拥有独立的内存单元,而多个线程共享进程的内存。(资源分配给进程,同一进程的所有线程共享该进程的所有资源。同一进程中的多个线程共享代码段(代码和常量),数据段(全局变量和静态变量),扩展段(堆存储)。但是每个线程拥有自己的栈段,栈段又叫运行时段,用来存放所有局部变量和临时变量。)

3.进程是资源分配的最小单位,线程是CPU调度的最小单位;

4.系统开销: 由于在创建或撤消进程时,系统都要为之分配或回收资源,如内存空间、I/o设备等。因此,操作系统所付出的开销将显著地大于在创建或撤消线程时的开销。类似地,在进行进程切换时,涉及到整个当前进程CPU环境的保存以及新被调度运行的进程的CPU环境的设置。而线程切换只须保存和设置少量寄存器的内容,并不涉及存储器管理方面的操作。可见,进程切换的开销也远大于线程切换的开销。

5.通信:由于同一进程中的多个线程具有相同的地址空间,致使它们之间的同步和通信的实现,也变得比较容易。进程间通信IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信——需要进程同步和互斥手段的辅助,以保证数据的一致性。在有的系统中,线程的切换、同步和通信都无须操作系统内核的干预

6.进程编程调试简单可靠性高,但是创建销毁开销大;线程正相反,开销小,切换速度快,但是编程调试相对复杂。

7.进程间不会相互影响 ;线程间一个线程挂掉有可能导致整个进程挂掉

8.进程适应于多核、多机分布;线程适用于多核

9.一个进程内的线程通信比进程之间的通信更快速,有效。(因为共享变量,如程序计数器,一组寄存器和栈)

多进程、多线程的区别:

**多线程:**同一时刻执行多个线程。如,用浏览器一边下载,一边听歌,一边看视频,一边看网页…

**多进程:**同时执行多个程序。如,同事运行YY,QQ,以及各种浏览器。

​ 进程是资源分配的最小单位,而线程时CPU调度的最小单位。多线程之间共享同一个进程的地址空间,线程间通信简单,同步复杂,线程创建、销毁和切换简单,速度快,占用内存少,适用于多核分布式系统,但是线程间会相互影响,一个线程意外终止会导致同一个进程的其他线程也终止,程序可靠性弱。而多进程间拥有各自独立的运行地址空间,进程间不会相互影响,程序可靠性强,但是进程创建、销毁和切换复杂,速度慢,占用内存多,进程间通信复杂,但是同步简单,适用于多核、多机分布。

多进程和多线程的优缺点和选择问题

多进程优点:

1、每个进程互相独立,不影响主程序的稳定性,子进程崩溃没关系;

2、通过增加CPU,就可以容易扩充性能;

3、可以尽量减少线程加锁/解锁的影响,极大提高性能,就算是线程运行的模块算法效率低也没关系;

多进程缺点:

1、逻辑控制复杂,需要和主程序交互;

2、需要跨进程边界,如果有大数据量传送,就不太好,适合小数据量传送、密集运算 多进程调度开销比较大;

3、最好是多进程和多线程结合,即根据实际的需要,每个CPU开启一个子进程,这个子进程开启多线程可以为若干同类型的数据进行处理。当然你也可以利用多线程+多CPU+轮询方式来解决问题……

多线程的优点:

1、无需跨进程边界;

2、程序逻辑和控制方式简单;

3、所有线程可以直接共享内存和变量等;

4、线程方式消耗的总资源比进程方式好。

多线程缺点:

1、每个线程与主程序共用地址空间,受限于2GB用户地址空间;

2、线程之间的同步和加锁控制比较麻烦;

3、一个线程的崩溃可能影响到整个程序的稳定性;

4、到达一定的线程数程度后,即使再增加CPU也无法提高性能,例如Windows Server 2003,大约是1500个左右的线程数就快到极限了(线程堆栈设定为1M),如果设定线程堆栈为2M,还达不到1500个线程总数;因为线程的上线背景文切换同样消耗资源和时间。

5、线程能够提高的总性能有限,而且线程多了之后,线程本身的调度也是一个麻烦事儿,需要消耗较多的CPU。

单核多线程

单核多线程指的是单核CPU轮流执行多个线程,通过给每个线程分配CPU时间片来实现,只是因为这个时间片非常短(几十毫秒),所以在用户角度上感觉是多个线程同时执行。

多线程上下文切换

在这里也引出多线程上下文切换,也就是CPU通过时间片分配算法来循环执行任务,当前任务执行一个时间片后会切换到下一个任务。并且在切换前会保存上一个任务的状态,当切换回上一个任务时可以继续加载该任务的状态,从任务保存到再加载的过程就是一次上下文切换。

例如:我们在看网上大牛的博客笔记的时候,看到别人引用到自己不知道的技术的时候,我们往往会先去大概了解下这个技术到底是什么,能做什么等等,但是在这之前我们需要加个标签(或者其他标识)记住这篇博客我看到哪里。把这个技术了解完之后再返回去看这篇博客,从标记的地方继续往下看(这就是上下文切换的例子)。不过在看到一半然后去看别的文章,会影响到效率,多线程也一样,会影响到多线程执行速度。

多核多线程

多核多线程,可以把多线程分配给不同的核心处理,其他的线程依旧等待,相当于多个线程并行的在执行,而单核多线程只能是并发。

单CPU中进程只能是并发,多CPU计算机中进程可以并行。
单CPU单核中线程只能并发,单CPU多核中线程可以并行。
无论是并发还是并行,使用者来看,看到的是多进程,多线程。