zoukankan      html  css  js  c++  java
  • 进程和线程的区别

    引用文章:http://blog.csdn.net/zheng548/article/details/54669908

    进程之前---多道程序设计

    多道程序设计技术出现之前多个程序串行执行。只存在一个程序计数器,一个程序执行完毕之后,才会执行下一个程序。

    设计思想是允许多个程序同时进入内存并同时运行(宏观上并行,微观上串行,各道程序轮流使用CPU,交替执行),其目的是为了CPU的利用率,进而提高系统效率。

    如果内存中有四个程序在并发执行,那就需要四个程序计数器

    新技术带来的问题

    一个技术、一个机制的引入,一方面解决了以前棘手的问题,但同时,往往带来新的问题

    多道程序设计技术允许多个程序同时进入内存并运行,在这样的并发环境下,如何描述、刻画这样执行的程序呢?因此引入了“进程”。

    这也是进程的作用

    百科说法:

    操作系统引入进程的概念的原因:
    从理论角度看,是对正在运行的程序过程的抽象;
    从实现角度看,是一种数据结构,目的在于清晰地刻画动态系统的内在规律,有效管理和调度进入计算机主存储器运行的程序。
    进程

    进程:操作系统进行资源分配和调度的基本单位,是一个具有独立功能的程序关于某种数据集合上的一次活动。

    资源:如内存、文件

    程序:指令的集合
    指令:是机器所能识别的一组编制成特定格式的代码串。由操作码OP和操作数地址AD组成

    特点:

    动态性:进程的实质是程序在多道程序系统中的一次执行过程,进程是动态产生,动态消亡的。
    并发性:任何进程都可以同其他进程一起并发执行(同时运行)
    独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位;
    异步性
    结构特征:进程由程序、数据和进程控制块(PCB)三部分组成。
    多个不同的进程可以包含相同的程序:一个程序在不同的数据集里就构成不同的进程,能得到不同的结果;但是执行过程中,程序不能发生改变。
    引入线程
    为什么引入线程 有了进程这概念之后 应用程序可以并发地去执行了 那么为什么要在进程当中再派生出线程呢?
    进程有利于资源的管理和保护,但是进程有这样的问题:
    1. 进程切换的代价、开销比较大; 
    2. 在一个进程内也需要并行执行多个程序,实现不同的功能。 
    3. 进程有时候性能比较低。
    引入线程有以下三个方面的考虑
    1. 应用的需要。比如打开一个浏览器,我想一边浏览网页,一边下载文件,一边播放音乐。如果一个浏览器是一个进程,那么这样的需求需要线程机制。
    2. 开销的考虑。在进程内创建、终止线程比创建、终止进程要快。同一进程内的线程间切换比进程间的切换要快,尤其是用户级线程间的切换。线程之间相互通信无须通过内核(同一进程内的线程共享内存和文件)
    3. 性能的考虑。多个线程中,任务功能不同(有的负责计算,有的负责I/O),如果有多个处理器,一个进程就可以有很多的任务同时在执行。
    线程

    线程的属性

    线程

    • 有标识符ID
    • 有状态及状态转换—->>需要提供一些状态转换操作
    • 不运行时需要保存上下文环境—>>需要程序计数器等寄存器
    • 有自己的栈和栈指针
    • 共享所在进程的地址空间和其它资源
    • -

    进程与线程区别

    1. 定义方面:进程是程序在某个数据集合上的一次运行活动;线程是进程中的一个执行路径。
    2. 角色方面:在支持线程机制的系统中,进程是系统资源分配的单位,线程是系统调度的单位。
    3. 资源共享方面:进程之间不能共享资源,而线程共享所在进程的地址空间和其它资源。同时线程还有自己的栈和栈指针,程序计数器等寄存器。
    4. 独立性方面:进程有自己独立的地址空间,而线程没有,线程必须依赖于进程而存在。

    Android中的进程和线程

    关于这方面内容,可以参考 android中的线程与进程 
    在此感谢。

    Android系统中,每一个App都是一个Linux用户。一般情况下,每个App都是运行在一个进程的一个线程中,这个线程习惯称为主线程(Main Thread). 
    Zygote是一个虚拟机进程,同时也是一个虚拟机实例的孵化器,每当系统要求执行一个 Android应用程序,Zygote就会FORK出一个子进程来执行该应用程序。 
    这样做的好处显而易见:Zygote进程是在系统启动时产生的,它会完成虚拟机的初始化,库的加载,预置类库的加载和初始化等等操作,而在系统需要一个新的虚拟机实例时,Zygote通过复制自身,最快速的提供个系统。 
    另外,对于一些只读的系统库,所有虚拟机实例都和Zygote共享一块内存区域,大大节省了内存开销。

  • 相关阅读:
    这一次搞懂Spring自定义标签以及注解解析原理
    为什么要谨慎使用Arrays.asList、ArrayList的subList?
    【踩坑系列】使用long类型处理金额,科学计数法导致金额转大写异常
    小心使用 Task.Run 解惑篇
    小心使用 Task.Run 续篇
    为什么要小心使用 Task.Run
    Visual Studio 调试技巧之即时窗口的妙用
    审计系统的一剂良方——事件溯源
    [C#.NET 拾遗补漏]13:动态构建LINQ查询表达式
    再聊 Blazor,它是否值得你花时间学习
  • 原文地址:https://www.cnblogs.com/gne-hwz/p/6692718.html
Copyright © 2011-2022 走看看