线程、进程及其联系与区别

在python基础里面,进程和线程在实际开发使用中一直很常用,所以,今天为大家整理一下关于线程与进程的总结,哈哈哈

 

           线程、进程及其联系与区别_第1张图片

有一句总结话方便记忆:“进程是操作系统分配资源的最小单元,线程是操作系统调度的最小单元”

一、进程

        1、进程的概念

                进程是操作系统实现并发执行的重要手段,也是操作系统为程序提供的重要运行环境抽象。

                进程最根本的属性是动态性和并发性。以下是从不同角度对进程的解释:

                a、进程是程序的一次执行

                b、进程是可以与其他计算并发执行的计算

                c、进程是一个程序程序及其数据在处理器上顺序执行时发生的活动

                d、进程是程序在一个数据集合上的运行过程,是系统进行资源分配和调度的一个独立单位

                e、进程是进程实体的一次活动

                f、进程是支持程序运行的机制

        2、进程的定义

                进程是具有一定功能的程序在一个数据结合上的运行过程,它是系统进行资源分配和调度管理的一个可并发执行的基本单位。

        3、进程的基本特性

                a、动态性:进程的实质是程序的一次执行过程,它由系统创建而产生,能够被调度而执行,因申请的共享资源被其他进程占用而暂停,完成任务后被撤销。动态性是进程最重要的特性。

                b、独立性:系统内多个进程可以并发执行,引入进程的目的也是为了使系统某个程序能够和其他进程并发执行。

                c、异步性:进程由于共享资源和协同合作,因此产生了相互制约的关系,进程实体通过进程管理以异步的方式使用处理器和其他资源,系统必须统一调度,依据一定的算法来保证各个进程能够协同运行并共享处理器和其他资源。

                d、结构特性:系统中运行的进程实体通常由程序、数据和一个PCB(进程控制块)组成。

        4、进程的基本状态和转换

                线程、进程及其联系与区别_第2张图片

 

                        上图中的    运行——>阻塞中的事件请求即等待资源、事件

                                           阻塞——>就绪中的事件发生即事件发生,资源释放。

二、线程

        1、线程的概念

                线程是进程中实施调度和分派的基本单位。

                操作系统提供现成的目的就是为了方便高效地实现并发处理(进一步提高并发度)。

        2、线程分类

                线程一般分为用户级线程和核心级线程。

        3、线程池

                设计思想:在创建一个进程是,相应地创建若干个线程,将它们放在一个缓冲池中,这些线程在等待工作。当服务器接收到一个请求时,系统就唤醒其中的一个线程,并将请求传给它,由这个线程进行服务。当完成任务后,线程重新被放入线程池中,等待下面新的请求和服务。如果线程池中没有可用的线程,服务器就要等待,直到有一个线程被释放。

 

三、线程和进程的关系

        1、一个进程可以有多个线程,但至少有一个线程;而一个线程只能在一个进程的地址空间内活动。

        2、资源分配给进程,同一个进程的所有线程共享该进程所有资源。

        3、CPU分配给线程,即真正在处理器运行的是线程。

        4、线程在执行过程中需要协作同步,不同进程的线程间要利用消息通信的办法实现同步。

注:进程是最基本的资源拥有单位和调度单位。        

        进程间通信方式:(1)消息传递(2)共享存储(3)管道通信

 

举个例子来粗浅的理解这几个概念,假设在有一间屋子需要打扫卫生,打扫卫生包含了擦桌子、扫地、拖地、擦窗户。

  • 如果是按顺序一件一件的完成这些事,那么这就是同步编程,打扫卫生的人就是进程;
  • 如果有2个人来一起来打扫卫生,那么就有了2个进程,打扫的速度自然就快了一倍;
  • 如果每个人的左手和右手也可以分别擦桌子和擦窗户,那么每个进程就有了2个线程,打扫速度又快了很多;
  • 但上面都是按顺序来打扫卫生的(同步编程),先擦桌子,再扫地,再拖地,最后擦窗户。假设完成每件事情需要5分钟,其中拖地要拖5分钟然后等地面干燥10分钟,那么1个人完成所有事情的时间就是5+5+15+5=30分钟,2个进程则需要15分钟。
    如果需要更快呢?
    那就可以在等地面干燥时,先去擦窗户,擦完窗户之后再看看地面有没有干,如果干了,则事情就完成了。如果是1个人打扫房间,整个时间就直接缩短为擦桌子5分钟,扫地5分钟,5分钟拖地,5分钟擦窗户,再等待5分钟,共计25分钟。
    这就是异步编程。

但对于程序来说,cpu的计算速度实在是太快了,速度只能用快的飞起来形容,大部分任务中耗时的是磁盘读取和写入、等待服务器响应等等,所以cpu通常都是1秒就做完了自己的事情(其实远没有1秒,可能只要毫秒或者纳秒),而要傻傻的等磁盘或者网络加载到天荒地老。

此时在编程中就需要采取异步的思想,cpu做完自己的事情后,可以先去干别的事情,让磁盘或者网络慢慢的去写入和加载,cpu只需要偶尔过来瞄一眼看看磁盘有没有做完,如果磁盘做完了事情,那么cpu就继续往下做事,如果磁盘还没做完,cpu就继续做别的事情,直到磁盘做完。

 

最后再总结一下  进程VS线程

1. 进程采用fork创建,线程采用clone创建
2. 进程fork创建的子进程的逻辑流位置在fork返回的位置,线程clone创建的KSE的逻辑流位置在clone调用传入的方法位置,比如Java的Thread的run方法位置
3. 进程拥有独立的虚拟内存地址空间和内核数据结构(页表,打开文件表等),当子进程修改了虚拟页之后,会通过写时拷贝创建真正的物理页。线程共享进程的虚拟地址空间和内核数据结构,共享同样的物理页
4. 多个进程通信只能采用进程间通信的方式,比如信号,管道,而不能直接采用简单的共享内存方式,原因是每个进程维护独立的虚拟内存空间,所以每个进程的变量采用的虚拟地址是不同的。多个线程通信就很简单,直接采用共享内存的方式,因为不同线程共享一个虚拟内存地址空间,变量寻址采用同一个虚拟内存
5. 进程上下文切换需要切换页表等重量级资源,线程上下文切换只需要切换寄存器等轻量级数据
6. 进程的用户栈独享栈空间,线程的用户栈共享虚拟内存中的栈空间,没有进程高效
7. 一个应用程序可以有多个进程,执行多个程序代码,多个线程只能执行一个程序代码,共享进程的代码段

8. 进程采用父子结构,线程采用对等结构

 

大家看看就好,希望能帮到大家。

你可能感兴趣的:(学习,python基础)