进程和线程常见面试

(一)进程和线程的主要区别:
     进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位 。
     在开销方面:
         每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;
         线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序
         计数器(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 ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
说法一:进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源. 一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行 说法二:进程线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。进程线程的区别在于: 简而言之,一个程序至少有一个进程,一个进程至少有一个线程. 线程的划分尺度小于进程,使得多线程程序的并发性高。 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。 线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程线程的重要区别。 说法三:多线程共存于应用程序中是现代操作系统中的基本特征和重要标志。用过UNIX操作系统的读者知道进程,在UNIX操作系统中,每个应用程序的执行都在操作系统内核中登记一个进程标志,操作系统根据分配的标志对应用程序的执行进行调度和系统资源分配,但进程线程有什么区别呢? 进程线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。进程线程的区别在于: 线程的划分尺度小于进程,使得多线程程序的并发性搞。 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。 线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值