【Linux】多线程与多进程进行多任务处理的优缺点

多线程与多进程进行多任务处理的优缺点

在讲述多进程与多线程进行多任务处理之前,让我们来进一步了解一下pcb
pcb原来是进程,但是在这里就不一样了。因为在传统操作系统中 pcb是进程。但是在linux下 因为线程是通过pcb模拟实现的,因此linux下的pcb实际上是一个线程,并且因为这些线程共用同一个虚拟地址空间,因此也把linux下的线程称为轻量级进程,相较于传统pcb更加的轻量化。所以称 pcb是轻量级进程(线程) 进程 就是 线程组 已经成为一个概念,已经成为一个线程组了。

通过上面我们都知道Linux下的pcb相较于传统的pcb更加轻量化,所以叫做轻量级进程。而且线程是cpu调度的基本单位,进程是资源分配的基本单位因为cpu调度一个程序的运行是cpu调度的,资源分配是以线程组为单位分配给整个线程组的。

多线程处理 : 有多个pcb共同调度着统一虚拟地址空间,相当于一个身体有多个头。虚拟地址空间中下面一层代码段就是要完成的任务,代码段里面有多个函数,不同的pcb调度着不同的函数同时完成多个函数。
多进程处理:启动一个进程处理一个任务,启动多个pcb进行程序调度完成多个任务,每个pcb都有一个自己独立的虚拟地址空间。

那么多任务是多进程处理好还是多线程处理好?

让我们先来了解一下多进程/多线程进行多任务处理的优缺点

多线程
优点:

  1. 线程间共用同一个虚拟地址空间,因此线程间通信更加方便灵活线程间通信更加方便灵活 (除了进程间的通信方式外,还可以使用全局变量、函数传参方式进行通信)
  2. 线程共用进程的大部分资源,线程的创建与销毁成本更低
  3. 线程间的调度切换成本更低(避免了页表的切换)

缺点:

  1. 线程间缺乏访问控制,一些异常和系统调用直接针对于整个进程生效,如exit系统调用(直接退出一个进程,进程就是线程组,组都没了,那么线程就都得退出、段错误、内存访问错误也会使整个进程崩溃)

多进程
优点:

  1. 进程间相互独立,稳定性和健壮性更高,适用于主程序安全性更高的场景(shell、服务器)
多进程和多线程进行多任务处理的共有优势在哪里?

下面再讲多任务处理优势之前先介绍两种程序:

  1. CPU密集型程序:在程序中不断进行数据运算

  2. IO密集型程序:在程序中大量进行IO操作, 操作其它的设备,意味着对CPU的消耗不高,大部分时间是进行IO就绪,拷贝
    IO操作: IO等待+ 数据拷贝(拷贝到缓冲区,或从缓冲区拷贝到设备)
    栗子1: 网卡上面获取数据,别人发了才有数据 ,别人如果不发网卡就在等待数据
    栗子2: 磁盘IO读取数据,得等待磁盘磁头指到指定位置

  • 针对于CPU密集型程序
    现在的CPU都是多核的,每个CPU上都有自己的寄存器,意味着多核CPU是可以并行,在CPU很多(资源足够)的时候,多进程和多线程进行任务处理的话都可以处理更快,尤其是进行cpu密集型程序的时候速度更快,因为IO密集型程序对cpu要求本身就不高 提高运行效率,分摊压力

  • 针对于IO密集型程序
    如果是一个执行流的话,就只能在在一个执行流中串行完成,一个完成了,才能操作下一个。如果是使用了多进程或者是多线程的情况下,一个线程就是一个执行流,在一个线程发起IO操作的时候,另一个线程也可以发起IO操作,在数据等待的阶段,就可以并行等待,因为是多个IO操作同时发起的,尽管在cpu资源不够的情况下,在多个线程里面时间片的轮转都能让多个线程快速的发起调用,进行多个IO操作,同时等待,并行压缩了等待时间。更加高效

那么线程和进程是不是越多越好?

线程不能太多,如果线程过多的,pcb会进行大量的调度切换,调度切换浪费的时间如果大于提高的效率 就得不偿失了。

总结

多线程和多进程进行多任务处理各有好坏,好并不是绝对的,在不同的场景下多线程与多进程之间各有优缺点,我们要分清楚的是什么场景下多线程的处理的优点大于多进程的优点,也就是按需求选择合适的。
就像共同追梦的我们,每个人都不是绝对的,既有优点也有缺点;每个人都不是完美的,但我们一直在追求完美。!!!

发布了55 篇原创文章 · 获赞 12 · 访问量 5264

猜你喜欢

转载自blog.csdn.net/weixin_43939593/article/details/103228532