首先,我们介绍一下进程和线程的基本概念
进程是资源( CPU 、内存等)分配的基本单位,线程是 CPU 调度和分配的基本单位(程序执行的最小单位)。1 )当我们运行一个程序的时候,系统就会创建一个 进程 ,并分配地址空间和其他资源,最后把进程加入就绪队列直到分配到 CPU 时间就可以正式运行了。2 ) 线程 是进程的一个执行流,有一个初学者可能误解的概念,进程就像一个容器一样,包括程序运行的程序段、数据段等信息,但是进程其实是 不能用来运行代码 的,真正运行代码的是进程里的线程。3 )那么,来看看我们最熟悉的 main ()函数,我们既可以认为这是一个进程,也可以认为是一个线程。我们都知道,在 C/C++ 中 main 函数是程序入口,所以准确来说 main 函数是程序的 主线程 。然而很神奇的地方在于,当系统在执行 main 函数的时候, main 函数又是一个独立的进程,我们可以在main 函数里创建子进程,也可以创建子线程。4 )在 main 函数里创建的多个子线程中,每个线程有自己的 堆栈 和 局部变量 ,但多个线程也可共享同个进程下的所有共享资源,因此我们经常可以创建多个线程实现并发操作,实现更加复杂的功能。
多进程和多线程的比较
1 )多进程更健壮,一个进程死了不影响其他进程,子进程死了也不会影响到主进程,毕竟系统会给每个进程分配独立的系统资源。多线程比较脆弱,一个线程崩溃很可能影响到整个程序,因为多个线程是在一个进程里一起合作干活的。2 ) 进程性能大于线程,每个进程独立地址空间和资源,而多个线程是一起共享了同个进程里的空间和资源,结果就很明显了,线程的性能上限一定比不上进程。3 ) 正因为进程性能大于线程。所以这也引发了另一重要知识点,创建多进程的系统花销远大于创建多线程。4 )多进程通讯因为需要跨越进程边界,不适合大量数据的传送,更适合小数据或者密集数据的传送。而多线程无需跨越进程边界,适合各线程间大量数据的传送,甚至还有很重要的一点,多线程可以共享同一进程里的共享内存和变量哦。5 ) 多进程逻辑控制比多线程复杂,需要与主进程做好交互。根据上面几点,我们不难知道多进程是 " 要用来做大事 " 的,而多线程是 " 各自做件小事,合作完成大事 " 。所以要做大事自然就需要更复杂的逻辑控制,不像做小事那么目标明显。6 )虽然多线程逻辑控制比较简单,但是却需要复杂的线程同步和加锁控制等机制。7 )最后的一点,可能比较少见,我们可以通过增加 CPU 的数量来增加进程的数量,但增加不了线程的数量,即增加 CPU 无法提高线程数量,线程数量由进程的空间资源和线程本身栈大小确定
什么时候用线程,什么时候用进程
1 )创建和销毁较频繁使用线程,因为创建进程花销大嘛。2 )需要大量数据传送使用线程,因为多线程切换速度快,不需要跨越进程边界。3 )并行操作使用线程。线程是为了实现并行操作的一个手段,也就是刚才说的需要多个并行操作 " 合作完成大事 " ,当然是使用线程啦。4 )最后可以总结为:安全稳定选进程;快速频繁选线程;