多进程和多线程

时间:2021-09-12 16:43:23

“进程是程序在处理机上的一个执行过程,是资源分配的基本单位”;“线程是CPU调度的一个基本单位”。概念,我们都烂熟于心了,那么是否可以究其本质的分析下,多进程和多线程的优缺点,以便在实际场景中进行合适的选择了?

一、多进程

1、概念

在同一个时间里,同一个计算机系统中如果允许两个或两个以上的进程处于运行状态,这便是多任务。现代的操作系统几乎都是多任务操作系统,能够同时管理多个进程的运行。

2、优点

1)编程相对容易,通常不需要考虑锁和同步资源的问题。
2)更强的容错性:一个进程崩溃了不会影响其他进程。

3、缺点

1)创建销毁、切换复杂,速度慢。
2)数据共享麻烦,通常要用到共享内存、信号量等IPC技术;
3)占用cpu多

二、多线程

1、概念

1.1 线程的基本概念、线程的基本状态及状态之间的关系?

线程,有时称为轻量级进程,是CPU使用的基本单元;它由线程ID、程序计数器、寄存器集合和堆栈组成。它与属于同一进程的其他线程共享其代码段、数据段和其他操作系统资源(如打开文件和信号)。

线程有四种状态:新生状态、可运行状态、被阻塞状态、死亡状态

1.2 多线程有几种实现方法,都是什么?

多线程的实现方式?
1)继承 Thread 类
2) 实现 Runnable 接口再 new Thread(YourRunnableOjbect)

1.3 线程安全

如果多线程的程序运行结果是可预期的,而且与单线程的程序运行结果一样,那么说明是“线程安全”的。

1.4 多线程同步和互斥有几种实现方法,都是什么,什么情况下使用,举例说明?

线程间的同步
线程间的同步方法大体可分为两类:用户模式和内核模式。
顾名思义,内核模式就是指利用系统内核对象的单一性来进行同步,使用时需要切换内核态与用户态,而用户模式就是不需要切换到内核态,只在用户态完成操作。
用户模式下的方法有:原子操作(例如一个单一的全局变量),临界区。内核模式下的方法有:事件,信号量,互斥量。

多线程互斥和同步的区别
1)线程同步是指线程之间所具有的一种制约关系,一个线程的执行依赖另一个线程的消息,当它没有得到另一个线程的消息时应等待,直到消息到达时才被唤醒。
2)线程互斥是指对于共享的进程系统资源,在各单个线程访问时的排它性。当有若干个线程都要使用某一共享资源时,任何时刻最多只允许一个线程去使用,其它要使用该资源的线程必须等待,直到占用资源者释放该资源。线程互斥可以看成是一种特殊的线程同步(下文统称为同步)。

2、线程优点

1)创建速度快
2)共享数据方便:多线程间可以共享同一虚拟地址空间;
3)上下文切换开销小,不用切换地址空间,不用更改寄存器,不用刷新TLB。
4)占用cpu少

3、线程缺点

1)数据共享方便的同时,也带来了同步问题。
2)一个线程挂掉将导致整个进程挂掉

三、对比

进程与线程的区别?
1)进程是资源分配的基本单位,线程是cpu调度,或者说是程序执行的最小单位。在Mac、Windows NT等采用微内核结构的操作系统中,进程的功能发生了变化:它只是资源分配的单位,而不再是调度运行的单位。在微内核系统中,真正调度运行的基本单位是线程。因此,实现并发功能的单位是线程。

2)进程有独立的地址空间,比如在linux下面启动一个新的进程,系统必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这是一种非常昂贵的多任务工作方式。而运行一个进程中的线程,它们之间共享大部分数据,使用相同的地址空间,因此启动一个线程,切换一个线      程远比进程操作要快,花费也要小得多。当然,线程是拥有自己的局部变量和堆栈(注意不是堆)的,比如在windows中用_beginthreadex创建一个新进程就会在调用CreateThread的同时申请一个专属于线程的数据块(_tiddata)。

3)线程之间的通信比较方便。统一进程下的线程共享数据(比如全局变量,静态变量),通过这些数据来通信不仅快捷而且方便,当然如何处理好这些访问的同步与互斥正是编写多线程程序的难点。而进程之间的通信只能通过进程通信的方式进行。

4)多进程比多线程程序要健壮。一个线程死掉整个进程就死掉了,但是在保护模式下,一个进程死掉对另一个进程没有直接影响。

对比维度 多进程 多线程 总结
数据共享、同步 数据共享复杂,需要用IPC; 数据是分开的,同步简单,因为共享进程数据,数据共享简单,但也是因为这个原因导致同步复杂 各有优势
内存、CPU 占用内存多,切换复杂,CPU利用率低 占用内存少,切换简单,CPU利用率高 线程占优
创建销毁、切换 创建销毁、切换复杂,速度慢 创建销毁、切换简单,速度很快 线程占优
编程、调试 编程简单,调试简单 编程复杂,调试复杂 进程占优
可靠性 进程间不会互相影响 一个线程挂掉将导致整个进程挂掉 进程占优
分布式 适应于多核、多机分布式;如果一台机器不够,扩展到多台机器比较简单 适应于多核分布式 进程占优

三、合理选择多线程还是多进程

1、需要频繁创建销毁的优先用线程
2、需要进行大量计算的优先使用线程
3、可能要扩展到多机分布的用进程,多核分布的用线程