您的位置:首页 > 职场人生

进程和线程常见面试

2019-07-22 20:17 183 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/hb_hdg/article/details/96894063
(一)进程和线程的主要区别:
进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位 。
在开销方面:
每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;
线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序
计数器(PC),线程之间切换的开销小。
所处环境:
在操作系统中能同时运行多个进程(程序);而在同一个进程(程序)中有多个线程同时执行
(通过CPU调度,在每个时间片中只有一个线程执行)
内存分配方面:
系统在运行的时候会为每个进程分配不同的内存空间;而对线程而言,除了CPU外,系统不
会为线程分配内存(线程所使用的资源来自其所属进程的资源),线程组之间只能共享资源。
包含关系:
没有线程的进程可以看做是单线程的,如果一个进程内有多个线程,则执行过程不是一条线的,
而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。

(二)多进程和多线程的区别:
最大的区别:是多线程可以很容易共享全局变量,而多进程共享全局变量比较困难。
多进程的优点是稳定性好,一个子进程崩溃了,不会影响主进程以及其余进程。但是缺点是创建进程的代价非常大,
因为操作系统要给每个进程分配固定的资源,并且,操作系统对进程的总数会有一定的限制,若进程过多,操作系
统调度都会存在问题,会造成假死状态。多线程优点是效率较高一些,但是致命的缺点是任何一个线程崩溃都可能
造成整个进程的崩溃,因为它们共享了进程的内存资源池。 对于任务数来说,无论是多进程或者多线程,都不能
太多。因为操作系统在切换任务时,会有一系列的保护现场措施,这要花费相当的系统资源,若任务过多,则大部
分资源都被用做干这些了,结果就是所有任务都做不好,所以操作系统会限制进程的数量。

(三)多进程和多线程的应用方面:
多线程即在一个进程中启动多个线程执行任务。一般来说使用多线程可以达到并行的目的,但由于Python中使用了
    全局解释锁GIL的概念,导致Python中的多线程并不是并行执行,而是“交替执行”。所以Python中的多线程适合
IO密集型任务(比如文件存储,网络爬虫),而不适合计算密集型任务。

    由于Python中GIL的原因,对于计算密集型任务(计算密集型任务的特点是要进行大量的计算,消耗CPU资源)
    Python下比较好的并行方式是使用多进程,这样可以非常有效的使用CPU资源。当然同一时间执行的进程数量
    取决你电脑的CPU核心数。多进程适合计算密集型任务。

(四)进程之间的通信:
常见的通信方式:
1. 管道pipe:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。
进程的亲缘关系通常是指父子进程关系。
2. 命名管道FIFO:有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
3. 消息队列MessageQueue:消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列
克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
4. 共享内存SharedMemory:共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,
但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它
往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。
5. 信号量Semaphore:信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,
防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
6. 套接字Socket:套接字也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。
7. 信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: