精华内容
下载资源
问答
  • 进程和线程的区别(超详细)

    万次阅读 多人点赞 2019-10-03 21:57:46
    进程和线程 进程 一个在内存中运行的应用程序。每个进程都有自己独立的一块内存空间,一个进程可以有多个线程,比如在Windows系统中,一个运行的xx.exe就是一个进程线程 进程中的一个执行任务(控制单元),负责...

    进程和线程

    进程

    一个在内存中运行的应用程序。每个进程都有自己独立的一块内存空间,一个进程可以有多个线程,比如在Windows系统中,一个运行的xx.exe就是一个进程。

    任务管理器

    线程

    进程中的一个执行任务(控制单元),负责当前进程中程序的执行。一个进程至少有一个线程,一个进程可以运行多个线程,多个线程可共享数据。

    与进程不同的是同类的多个线程共享进程的方法区资源,但每个线程有自己的程序计数器虚拟机栈本地方法栈,所以系统在产生一个线程,或是在各个线程之间作切换工作时,负担要比进程小得多,也正因为如此,线程也被称为轻量级进程。

    Java 程序天生就是多线程程序,我们可以通过 JMX 来看一下一个普通的 Java 程序有哪些线程,代码如下。

    public class MultiThread {
    	public static void main(String[] args) {
    		// 获取 Java 线程管理 MXBean
    		ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
    		// 不需要获取同步的 monitor 和 synchronizer 信息,仅获取线程和线程堆栈信息
    		ThreadInfo[] threadInfos = threadMXBean.dumpAllThreads(false, false);
    		// 遍历线程信息,仅打印线程 ID 和线程名称信息
    		for (ThreadInfo threadInfo : threadInfos) {
    			System.out.println("[" + threadInfo.getThreadId() + "] " + threadInfo.getThreadName());
    		}
    	}
    }
    

    上述程序输出如下(输出内容可能不同,不用太纠结下面每个线程的作用,只用知道 main 线程执行 main 方法即可):

    [6] Monitor Ctrl-Break //监听线程转储或“线程堆栈跟踪”的线程
    [5] Attach Listener //负责接收到外部的命令,而对该命令进行执行的并且把结果返回给发送者
    [4] Signal Dispatcher // 分发处理给 JVM 信号的线程
    [3] Finalizer //在垃圾收集前,调用对象 finalize 方法的线程
    [2] Reference Handler //用于处理引用对象本身(软引用、弱引用、虚引用)的垃圾回收的线程
    [1] main //main 线程,程序入口
    

    从上面的输出内容可以看出:一个 Java 程序的运行是 main 线程和多个其他线程同时运行

    进程与线程的区别总结

    线程具有许多传统进程所具有的特征,故又称为轻型进程(Light—Weight Process)或进程元;而把传统的进程称为重型进程(Heavy—Weight Process),它相当于只有一个线程的任务。在引入了线程的操作系统中,通常一个进程都有若干个线程,至少包含一个线程。

    根本区别:进程是操作系统资源分配的基本单位,而线程是处理器任务调度和执行的基本单位

    资源开销:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。

    包含关系:如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。

    内存分配:同一进程的线程共享本进程的地址空间和资源,而进程之间的地址空间和资源是相互独立的

    影响关系:一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。所以多进程要比多线程健壮。

    执行过程:每个独立的进程有程序运行的入口、顺序执行序列和程序出口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制,两者均可并发执行

    从 JVM 角度说进程和线程之间的关系(重要)

    图解进程和线程的关系

    下图是 Java 内存区域,通过下图我们从 JVM 的角度来说一下线程和进程之间的关系。

    在这里插入图片描述

    从上图可以看出:一个进程中可以有多个线程,多个线程共享进程的方法区 (JDK1.8 之后的元空间)资源,但是每个线程有自己的程序计数器虚拟机栈本地方法栈

    程序计数器为什么是私有的?

    程序计数器主要有下面两个作用:

    1. 字节码解释器通过改变程序计数器来依次读取指令,从而实现代码的流程控制,如:顺序执行、选择、循环、异常处理。
    2. 在多线程的情况下,程序计数器用于记录当前线程执行的位置,从而当线程被切换回来的时候能够知道该线程上次运行到哪儿了。

    需要注意的是,如果执行的是 native 方法,那么程序计数器记录的是 undefined 地址,只有执行的是 Java 代码时程序计数器记录的才是下一条指令的地址。

    所以,程序计数器私有主要是为了线程切换后能恢复到正确的执行位置

    虚拟机栈和本地方法栈为什么是私有的?

    • 虚拟机栈:每个 Java 方法在执行的同时会创建一个栈帧用于存储局部变量表、操作数栈、常量池引用等信息。从方法调用直至执行完成的过程,就对应着一个栈帧在 Java 虚拟机栈中入栈和出栈的过程。
    • 本地方法栈:和虚拟机栈所发挥的作用非常相似,区别是: 虚拟机栈为虚拟机执行 Java 方法 (也就是字节码)服务,而本地方法栈则为虚拟机使用到的 Native 方法服务。 在 HotSpot 虚拟机中和 Java 虚拟机栈合二为一。

    所以,为了保证线程中的局部变量不被别的线程访问到,虚拟机栈和本地方法栈是线程私有的。

    一句话简单了解堆和方法区

    堆和方法区是所有线程共享的资源,其中堆是进程中最大的一块内存,主要用于存放新创建的对象 (所有对象都在这里分配内存),方法区主要用于存放已被加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

    多进程和多线程区别

    多进程:操作系统中同时运行的多个程序

    多线程:在同一个进程中同时运行的多个任务

    举个例子,多线程下载软件,可以同时运行多个线程,但是通过程序运行的结果发现,每一次结果都不一致。 因为多线程存在一个特性:随机性。造成的原因:CPU在瞬间不断切换去处理各个线程而导致的,可以理解成多个线程在抢CPU资源。

    多线程提高CPU使用率

    多线程

    多线程并不能提高运行速度,但可以提高运行效率,让CPU的使用率更高。但是如果多线程有安全问题或出现频繁的上下文切换时,运算速度可能反而更低。

    Java中的多线程

    Java程序的进程里有几个线程:主线程,垃圾回收线程(后台线程)等

    在 Java 中,当我们启动 main 函数时其实就是启动了一个 JVM 的进程,而 main 函数所在的线程就是这个进程中的一个线程,也称主线程。

    Java支持多线程,当Java程序执行main方法的时候,就是在执行一个名字叫做main的线程,可以在main方法执行时,开启多个线程A,B,C,多个线程 main,A,B,C同时执行,相互抢夺CPU,Thread类是java.lang包下的一个常用类,每一个Thread类的对象,就代表一个处于某种状态的线程

    展开全文
  • 终于把进程和线程学会了

    万次阅读 多人点赞 2020-07-24 23:59:36
    主要有:线程和进程的讲解、Java实战多线程、进程和线程的面试题总结等内容

    前言

    本篇文章保质保量,内容如下:关注我,不迷路,后续还会加餐哦!!!!
    注:打开PC端,到我主页,可以扫面一侧的微信二维码,加我哦,方便交流问题。
    在这里插入图片描述

    一、进程和线程的概念

    人人都说进程(process)是资源分配的最小单位,线程(thread)是CPU调度的最小单位

    太抽象了,不好理解,我们来形象的理解一下。

    (一)形象的例子1

    这是阮一峰老师的一段比较有意思的介绍:

    原地址在:http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html

    为了防止连接失效,还是把原作者的给拿过来了:

    1、计算机的核心是CPU,它承担了所有的计算任务。它就像一座工厂,时刻在运行。

    在这里插入图片描述

    2、假定工厂的电力是有限的,一次只能供给一个车间使用。也就是说,一个车间开工的时候,其他车间都必须停工。背后的含义就是,单个CPU一次只能运行一个任务

    在这里插入图片描述

    3、进程就好比工厂的车间,它代表CPU所能处理的单个任务。任一时刻,CPU总是运行一个进程,其他进程处于非运行状态。
    在这里插入图片描述

    4、一个车间里,可以有很多工人。他们协同完成一个任务。

    在这里插入图片描述

    5、线程就好比车间里的工人。一个进程可以包括多个线程。

    在这里插入图片描述

    6、车间的空间是工人们共享的,比如许多房间是每个工人都可以进出的。这象征一个进程的内存空间是共享的,每个线程都可以使用这些共享内存。

    在这里插入图片描述

    7、可是,每间房间的大小不同,有些房间最多只能容纳一个人,比如厕所。里面有人的时候,其他人就不能进去了。这代表一个线程使用某些共享内存时,其他线程必须等它结束,才能使用这一块内存。

    在这里插入图片描述

    8、一个防止他人进入的简单方法,就是门口加一把锁。先到的人锁上门,后到的人看到上锁,就在门口排队,等锁打开再进去。这就叫"互斥锁"(Mutual exclusion,缩写 Mutex),防止多个线程同时读写某一块内存区域。

    在这里插入图片描述

    9、还有些房间,可以同时容纳n个人,比如厨房。也就是说,如果人数大于n,多出来的人只能在外面等着。这好比某些内存区域,只能供给固定数目的线程使用。

    在这里插入图片描述

    10、这时的解决方法,就是在门口挂n把钥匙。进去的人就取一把钥匙,出来时再把钥匙挂回原处。后到的人发现钥匙架空了,就知道必须在门口排队等着了。这种做法叫做"信号量"(Semaphore),用来保证多个线程不会互相冲突。

    ​ 不难看出,mutex是semaphore的一种特殊情况(n=1时)。也就是说,完全可以用后者替代前者。但是,因为mutex较为简单,且效率高,所以在必须保证资源独占的情况下,还是采用这种设计。

    在这里插入图片描述

    11、操作系统的设计,因此可以归结为三点:

    • (1)以多进程形式,允许多个任务同时运行;
    • (2)以多线程形式,允许单个任务分成不同的部分运行;
    • (3)提供协调机制,一方面防止进程之间和线程之间产生冲突,另一方面允许进程之间和线程之间共享资源。

    在这里插入图片描述

    (二)形象的例子2

    如果还不理解就看这个来自一位知乎的动感例子:

    原文连接:https://www.zhihu.com/question/25532384

    为了防止连接失效,还是把原作者的给拿过来了:

    做个简单的比喻:进程=火车线程=车厢

    • 线程在进程下行进(单纯的车厢无法运行
    • 一个进程可以包含多个线程(一辆火车可以有多个车厢
    • 不同进程间数据很难共享(一辆火车上的乘客很难换到另外一辆火车,比如站点换乘
    • 同一进程下不同线程间数据很易共享(A车厢换到B车厢很容易
    • 进程要比线程消耗更多的计算机资源(采用多列火车相比多个车厢更耗资源
    • 进程间不会相互影响,一个线程挂掉将导致整个进程挂掉(一列火车不会影响到另外一列火车,但是如果一列火车上中间的一节车厢着火了,将影响到所有车厢
    • 进程可以拓展到多机,进程最多适合多核(不同火车可以开在多个轨道上,同一火车的车厢不能在行进的不同的轨道上
    • 进程使用的内存地址可以上锁,即一个线程使用某些共享内存时,其他线程必须等它结束,才能使用这一块内存。(比如火车上的洗手间)-"互斥锁"
    • 进程使用的内存地址可以限定使用量(比如火车上的餐厅,最多只允许多少人进入,如果满了需要在门口等,等有人出来了才能进去)-“信号量”

    (三)形象的例子3

    我们打开QQ、微信、IDEA等运行起来就是在运行一个进程。

    在这里插入图片描述

    当你用QQ打开多个窗口与多人聊天时,这时会QQ这个进程会创建几个线程。

    如上图所示,我就用QQ打开了三个窗口进行在聊天中。

    (四)进程和线程的概念

    进程(process)是资源分配的最小单位,线程(thread)是CPU调度的最小单位

    进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。

    线程(thread)操作系统能够进行运算调度的最小单位。它被包含在[进程]之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。在Unix System V及SunOS中也被称为轻量进程(lightweight processes),但轻量进程更多指内核线程(kernel thread),而把用户线程(user thread)称为线程。

    二、进程和线程的特征

    • 动态性:进程是程序的执行;
    • 并发性:多个进程可同存于内存中,能在一段时间内同时运行;
    • 独立性:独立运行的基本单位,独立获得资源和调度的基本单位;
    • 异步性:各进程按各自独立的不可预知的速度向前推进;
    • 结构特征:由程序段 、数据段、进程控制块(PCB)三部组成。

    三、进程一点通

    我们要知道:进程有三种基本状态: 进程在生命消亡前处于且仅处于三种基本状态之一

    不同系统设置的进程状态数目不同(但都基于三种基本状态)

    (一)进程的三种基本状态

    1、就绪状态(Ready):存在于处理机调度队列中的那些进程,它们已经准备就绪,一旦得到CPU,就立即可以运行。这些进程所处的状态为就绪状态。

    2、运行状态(Running):正在运行的进程所处的状态为运行状态。

    3、等待状态(Wait / Blocked ):若一进程正在等待某一事件发生(如等待输入输出工作完成),这时,即使给它CPU,它也无法运行,称该进程处于等待状态、阻塞、 睡眠、封锁状态。

    在这里插入图片描述

    (二)进程的三种基本状态的转换

    三种基本状态的转换如下:

    就绪态–>到运行态

    运行态–>到就绪态;

    运行态–>到阻塞态;

    阻塞态–>到就绪态

    在这里插入图片描述

    一般了解到三状态就够了。当然了,还有五状态、七状态、九状态。这些都是在三状态的基础上扩展的,所以是三状态是最重要的。

    (三)扩展:进程的五状态模型

    除此之外还有2种状态,创建状态终止状态

    • 新状态(创建)与退出(僵死)状态
    • 新状态(创建状态)是指利用fork系统调用来创建于进程时,被创建的新进程所处的状态;
    • 退出状态(僵死状态)是在进程执行了exit系统调用后所处的状态,此时该进程实际上已不存在,但还留下一些信息供父进程搜集。

    五状态图如下:

    在这里插入图片描述

    (四)扩展:进程的七状态模型

    进程的挂起状态:

    引起挂起的原因:终端用户的请求—程序运行期间用户发现问题,希望程序暂停执行,以便研究执行情况或修改程序

    父进程的请求:以便考察和修改该子进程,或者协调各子进程间的活动

    负荷调节的需要:实时系统的工作负荷重时,挂起一些不重要的进程,保证系统正常运行

    操作系统的需要:检查运行中资源使用情况或者进行记帐

    引入挂起后的状态转换:

    活动就绪—静止就绪

    活动阻塞—静止阻塞

    静止就绪—活动就绪

    静止阻塞—活动阻塞

    状态如下:

    在这里插入图片描述

    (五)扩展:进程的九状态模型

    被抢占的就绪状态:

    “被抢占”状态,也称为“被剥夺状态”。当正在核心态执行的进程要从核心态返回到用户态执行时,如果此时已有一优先级更高的进程在等待处理机,则此时内核可以抢占(剥夺)已分配给正在执行进程的处理机,去调度该优先级更高的进程执行。

    这时,被抢占了处理机的进程便转换为“被抢占”状态。处于“被抢占”状态的进程与处于“内存中就绪”状态的进程是等效的,它们都被排列在同一就绪队列中等待再次被调度。

    在这里插入图片描述

    四、线程一点通

    (一)有了进程为什么还要线程?

    线程的引入

    1、引入进程的目的是为了使多个程序并发执行,以改善资源利用率、提高系统吞吐量

    2、引入线程则是为了减少程序并发执行时的所付出的时空开销

    进程是一个可拥有资源的基本单位。

    进程同时又是一个可独立调度和分派的基本单位。

    进程作为一个资源拥有者,在创建、撤消、切换中,系统必须为之付出较大时空开销。所以系统中进程的数量不宜过多,进程切换的频率不宜过高,但这也就限制了并发程度的进一步提高。

    为解决此问题,人们想到将进程的上述两个属性分开,即对作为调度和分派的基本单位,不同时作为独立分配资源的单位;对拥有资源的单位,不对之进行频繁切换。

    在这里插入图片描述

    (二)引入线程的好处

    • 1、创建一个新线程花费时间少(结束亦如此);
    • 2、两个线程的切换花费时间少;
    • 3、因为同一进程内的线程共享内存和文件,因此它们之间相互通信无须调用内核;
    • 4、适合多处理机系统。

    (三)线程的五种状态

    • 1、创建(new)状态: 准备好了一个多线程的对象,即执行了new Thread(); 创建完成后就需要为线程分配内存
    • 2、就绪(runnable)状态: 调用了start()方法, 等待CPU进行调度
    • 3、运行(running)状态: 执行run()方法
    • 4、阻塞(blocked)状态: 暂时停止执行线程,将线程挂起(sleep()、wait()、join()、没有获取到锁都会使线程阻塞), 可能将资源交给其它线程使用
    • 5、死亡(terminated)状态: 线程销毁(正常执行完毕、发生异常或者被打断interrupt()都会导致线程终止)

    (四)线程的状态转换模型

    在这里插入图片描述

    五、Java中线程的创建与运行

    (一)由Thread的子类创建线程(小朋友数数字)

    创建一个类作为Thread类的子类,由它通过继承Thread类重写其中的run()方法来定义线程体以实现线程的具体行为。

    1、创建一个学生类:

    /**
     * @Auther: truedei
     * @Date: 2020 /20-7-24 22:56
     * @Description:
     */
    public class Student {
    
        private String name;
    
        public Student() {
        }
    
        public Student(String name) {
            this.name = name;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }
    
    

    2、创建学生类的线程类:

    /**
     * @Auther: truedei
     * @Date: 2020 /20-7-24 22:56
     * @Description:
     */
    public class StudentThread extends Thread {
    
        private Student student;
    
        public StudentThread(Student student) {
            this.student = student;
        }
    
        public StudentThread() {
    
        }
    
        @Override
        public void run() {
            for (int i = 0; i < 100; i++) {
                System.out.println("【"+this.student.getName()+"】在查数-->"+i);
            }
        }
    
    }
    

    3、创建测试类:

    /**
     * @Auther: truedei
     * @Date: 2020 /20-7-24 23:02
     * @Description:
     */
    public class StudentThreadTest {
    
        public static void main(String[] args) {
    
            Student xiaohong = new Student("小红");
            Student xiaoming = new Student("小明");
    
            StudentThread st1 = new StudentThread(xiaohong);
            StudentThread st2 = new StudentThread(xiaoming);
    
            st1.start();
            st2.start();
        }
    }
    

    4、结果:

    从结果中可以看出小红和小明是交替着在执行的,而且每一次运行该程序都会有不同的结果

    在这里插入图片描述

    (二)由Runnable接口实现多线程

    1、创建一个StudentRunnable类实现Runnable接口

    /**
     * @Auther: truedei
     * @Date: 2020 /20-7-24 23:12
     * @Description:
     */
    public class StudentRunnable implements  Runnable {
    
    
        private Student student;
    
        public StudentRunnable(Student student) {
            this.student = student;
        }
    
        public StudentRunnable() {
    
        }
    
        @Override
        public void run() {
            for (int i = 0; i < 100; i++) {
                System.out.println("【"+this.student.getName()+"】在查数-->"+i);
            }
        }
    }
    

    2、创建测试类:

    /**
     * @Auther: truedei
     * @Date: 2020 /20-7-24 23:02
     * @Description:
     */
    public class StudentRunnableTest {
    
        public static void main(String[] args) {
    
            Student xiaohong = new Student("小红");
            Student xiaoming = new Student("小明");
    
            StudentRunnable st1 = new StudentRunnable(xiaohong);
            StudentRunnable st2 = new StudentRunnable(xiaoming);
    
            Thread t1 = new Thread(st1);
            t1.start();
    
            Thread t2 = new Thread(st2);
            t2.start();
    
        }
    }
    

    执行结果都是和第一种是差不多的。

    在这里插入图片描述

    六、进程和多线程面试题总结

    (一)来源阿里巴巴(Java方向面经)

    1、进程和线程的概念

    答:

    进程(process)是资源分配的最小单位

    线程(thread)是CPU调度的最小单位

    2、进程或者线程的三个状态

    答:

    我们要知道:进程有三种基本状态: 进程在生命消亡前处于且仅处于三种基本状态之一

    不同系统设置的进程状态数目不同(但都基于三种基本状态)

    (1)进程的三种基本状态

    1、就绪状态(Ready):存在于处理机调度队列中的那些进程,它们已经准备就绪,一旦得到CPU,就立即可以运行。这些进程所处的状态为就绪状态。

    2、运行状态(Running):正在运行的进程所处的状态为运行状态。

    3、等待状态(Wait / Blocked ):若一进程正在等待某一事件发生(如等待输入输出工作完成),这时,即使给它CPU,它也无法运行,称该进程处于等待状态、阻塞、 睡眠、封锁状态。

    在这里插入图片描述

    (2)进程的三种基本状态的转换

    三种基本状态的转换如下:

    就绪态–>到运行态

    运行态–>到就绪态;

    运行态–>到阻塞态;

    阻塞态–>到就绪态

    在这里插入图片描述

    一般了解到三状态就够了。当然了,还有五状态、七状态、九状态。这些都是在三状态的基础上扩展的,所以是三状态是最重要的。

    展开全文
  • 操作系统——进程和线程的区别

    千次阅读 2019-11-13 20:11:57
    操作系统——进程和线程的区别 最近学习了操作系统中的进程和线程这两个知识点,昨天老师给我们出了一道题:进程和线程的区别。听完题目后一脸懵逼,只想到了进程的一部分概念,回来之后就查书,找到了答案。 1.进程...

    操作系统——进程和线程的区别

    最近学习了操作系统中的进程和线程这两个知识点,昨天老师给我们出了一道题:进程和线程的区别。听完题目后一脸懵逼,只想到了进程的一部分概念,回来之后就查书,找到了答案。

    1.进程和线程的主要区别在于它们是操作系统不同的资源管理方式;

    2.进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径;

    3.线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程;

    简而言之:

    (1)一个程序至少有一个进程,一个进程至少有一个线程。

    (2)线程的划分尺度小于进程,使得多线程程序的并发性高。

    (3)进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。

    (4)线程在执行过程中与进程也是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

    (5)从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这是进程和线程的重要区别。

    展开全文
  • 进程和线程的深入理解

    万次阅读 多人点赞 2019-04-25 00:14:40
    进程和线程的深入理解精确概括进程和线程的区别 既然要谈区别,那么首先需要理解什么是进程和线程。 之前,我读到一篇材料,发现有一个很好的类比,可以把它们解释地清晰易懂。 1.计算机的核心是CPU,它承担了所有的...

    进程和线程的深入理解


    下面是抽象类比:

    单CPU:一台单核处理器计算机 = 一个车间;
    多CPU:一台多核处理器计算机 = 一座工厂;

    进程:一个车间 = 一个进程; (即一个运行的程序)
    多进程:一座工厂可以同时运行多个车间;
    CPU和进程单CPU只能同时运行单个进程,多CPU可以同时运行多个进程

    线程:车间内一个工人 = 一个线程;
    进程与线程一个进程可以包括多个线程

    线程间内存共享:车间的空间是工人们共享的,比如许多房间是每个工人都可以进出的。
    一个进程的内存空间是共享的,每个线程都可以使用这些共享内存

    内存安全:可是,每个车间容纳大小不同,有的最多只能容纳一个人。车间人满的时候,其他人就进不去了。
    一个线程使用某些共享内存时,其他线程必须等它结束,才能使用这一块内存。

    互斥锁:一个防止他人进入的简单方法,就是门口加一把锁。先到的人锁上门,后到的人看到上锁,就在门口排队,等锁打开再进去。
    这就叫"互斥锁"–Mutex,防止两个线程同时读写某一块内存区域

    信号量:这时的解决方法,就是在门口挂n把钥匙。进去的人就取一把钥匙,出来时再把钥匙挂回原处。后到的人发现钥匙架空了,就知道必须在门口排队等着了。
    这种做法叫做"信号量"(Semaphore),用来保证多个线程不会互相冲突

    锁和信号量:不难看出,互斥锁是信号量的一种特殊情况(n=1时)。也就是说,完全可以用后者替代前者。但是,因为mutex较为简单,且效率高,所以在必须保证资源独占的情况下,还是采用这种设计。

    操作系统的资源分配与调度逻辑

    • 以多进程形式,允许多个任务同时运行;
    • 以多线程形式,允许单个任务分成不同的部分运行;
    • 提供协调机制,一方面防止进程之间和线程之间产生冲突,另一方面允许进程之间和线程之间共享资源。

    下面是严谨的解释:

    进程

    进程是程序的一次执行过程,是一个动态概念,是程序在执行过程中分配和管理资源的基本单位,每一个进程都有一个自己的地址空间,至少有 5 种基本状态,它们是:初始态,执行态,等待状态,就绪状态,终止状态。

    线程

    线程是CPU调度和分派的基本单位,它可与同属一个进程的其他的线程共享进程所拥有的全部资源。

    进程和线程的关系

    线程是进程的一部分
    一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程

    进程和线程的区别

    理解它们的差别,我从资源使用的角度出发。(所谓的资源就是计算机里的中央处理器,内存,文件,网络等等)

    根本区别:进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位

    开销方面:每个进程都有独立的代码和数据空间(程序上下文),进程之间切换开销大;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小

    所处环境:在操作系统中能同时运行多个进程(程序);而在同一个进程(程序)中有多个线程同时执行(通过CPU调度,在每个时间片中只有一个线程执行)

    内存分配:系统为每个进程分配不同的内存空间;而对线程而言,除了CPU外,系统不会为线程分配内存(线程所使用的资源来自其所属进程的资源),线程组之间只能共享资源

    包含关系:线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程

    展开全文
  • 这个问题也曾困扰过我,在之前,都是百度搜索一下,记一下答案,就糊弄过去了,一直不曾深入的去研究,今天通过这篇博客,以操作系统的发展作为脉络,从操作系统的出现发展来大家一起学习进程和线程,并分析进程...
  • 深入一点谈谈进程和线程的区别

    千次阅读 2020-01-05 16:14:48
    背景: 这个问题虽然常见,但想说清楚还真不容易,在这整理下思路聊聊吧。 文章目录1....进程有一个相当精简的解释:进程是对操作系统上正在运行程序的一个抽象。 这个概念确实挺抽象,仔细想想却也挺...
  • 进程和线程的区别(操作系统级别解析)

    万次阅读 多人点赞 2018-12-03 16:21:05
    关于进程和线程,大家总是说的一句话是“进程是操作系统分配资源的最小单元,线程是操作系统调度的最小单元”。这句话理论上没问题,我们来看看什么是所谓的“资源”呢。   什么是计算机资源 经典的冯诺依曼结构...
  • Python中进程和线程的区别详解

    千次阅读 2019-03-04 09:30:46
     进程进程时计算机程序一次执行的实例,由 程序段 数据段 PCB组成,是计算机资源分配调度的基本单位,也是线程的容器  线程线程也叫作轻量级进程,是程序执行的最小单位,他本身只拥有少部分执行必须的资源...
  • java--进程和线程

    千次阅读 多人点赞 2018-11-25 22:55:49
    进程和线程的概述 在学习线程之前要先知道什么是进程进程就是正在运行的程序,它是系统资源调度的独立单位,并且一个进程可以执行多个任务,而线程就是程序执行的任务,它是程序使用CPU的基本单位,因此也可以说...
  • 进程和线程的区别(c++)

    千次阅读 2019-06-17 16:57:26
    进程和线程的区别 进程 process 什么是进程 一个具有一定独立功能的程序关于某个数据集合的一次运行活动,是系统进行资源分配调度运行的基本单位 进程与程序的差别 进程是一个动态的概念,而程序只是一组指令。 ...
  • 进程线程的概念、区别及进程线程间通信

    千次阅读 多人点赞 2020-08-02 16:24:25
    进程与线程的概念,以及为什么要有进程线程,其中有什么区别,他们各自又是怎么同步的? 1. 基本概念: 进程是对运行时程序的封装,是系统进行资源调度分配的的基本单位,实现了操作系统的并发; 线程是进程的子...
  • 进程和线程的关系

    万次阅读 2018-08-19 10:54:35
    **一、进程 1、进程的概念** 进程是操作系统实现并发执行的重要... 进程最根本的属性是动态性并发性。以下是从不同角度对进程的解释: a、进程是程序的一次执行 b、进程是可以与其他计算并发执行的计算...
  • 进程和线程

    千次阅读 2019-07-29 13:15:02
    错误:线程是系统进行资源分配调度的一个独立单位 进程是抢占处理机的调度单位;线程属于某个进程,共享其资源 线程是程序的多个顺序的流动态执行 线程不能够独立执行,必须依存在应用程序中,由...
  • 进程和线程的区别联系

    万次阅读 多人点赞 2019-04-20 15:16:01
    进程是一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程,是操作系统进行资源分配调度的一个独立单位,是应用程序运行的载体。进程是一种抽象的概念,从来没有统一的标准定义。进程一般由程...
  • 进程和线程的区别

    千次阅读 2018-12-21 15:19:18
    进程和线程的区别 进程:指在系统中正在运行的一个应用程序;程序一旦运行就是进程;或者更专业化来说:进程是指程序执行时的一个实例,即它是程序已经执行到课中程度的数据结构的汇集。从内核的观点看,进程的目的...
  • 进程和线程的主要区别(总结)

    万次阅读 多人点赞 2018-06-13 10:11:52
    根本区别:进程是操作系统资源分配的基本单位,而线程是任务调度执行的基本单位在开销方面:每个进程都有独立的代码数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类...
  • java中的进程和线程区别

    千次阅读 2019-03-12 20:19:10
    进程:是并发执行的程序在执行过程中分配管理资源的基本单位,竞争计算机系统资源的基本单位。 线程:是进程的一个执行单元,是进程内科调度实体。比进程更小的独立运行的基本单位。线程也被称为轻量级进程。 一个...
  • 进程和线程的联系区别

    千次阅读 2019-05-31 10:28:57
    进程和线程的联系区别 定义: 一、进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配调度的一个独立单位。 二、线程进程的一个实体,是CPU调度分派的基本单位,他是比进程...
  • 进程和进程进程和线程

    千次阅读 2017-08-25 16:03:13
    进程继承的来自父进程的属性: ● ● ● ● ● ● ● ●已打开的文件描述符 ●实际用户ID、实际组ID、有效用户ID、有效组ID ●附属组ID ●进程组ID ●会话ID
  • 进程和线程的本质区别

    千次阅读 2018-04-11 09:18:02
    程序和进程的区别就在于:程序是指令的集合,它是进程运行的静态描述文本;进程是程序的一次执行活动,属于动态概念。在多道编程中,我们允许多个程序同时加载到内存中,在操作系统的调度下,可以实现并发地执行。这...
  • linux查看进程所有子进程和线程

    万次阅读 2018-08-28 14:58:42
    linux查看进程所有子进程和线程 原文连接:https://blog.csdn.net/uestczshen/article/details/74091892   问题: 我的程序在其内部创建并执行了多个线程,我怎样才能在该程序创建线程后监控其中单个线程?我想...
  • Java面试常客——进程和线程

    千次阅读 2020-08-10 15:43:21
    线程进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程。一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序。 线程调度: 1.分时调度 所有线程轮流使用CPU的使用权,...
  • 一个任务既可以是一个进程,也可以是一个线程。简而言之,它指的是一系列共同达到某一目的的操作。例如,读取数据并将数据放入内存中。这个任务可以作为一个进程来实现,也可以作为一个线程(或作为一个中断任务)来实现...
  • 如何查询一个进程下面的线程数(进程和线程区别) https://www.cnblogs.com/kevingrace/p/5252919.html在平时工作中,经常会听到应用程序的进程和线程的概念,那么它们两个之间究竟有什么关系或不同呢?一、对比...
  • 进程和线程的区别(重点)

    千次阅读 2017-08-03 15:03:00
    简而言之,一个程序至少有一个进程,一个进程至少有一个线程. 线程的划分尺度小于进程,使得多线程程序的并发性高。 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率...
  • 【操作系统】进程和线程调度

    千次阅读 2020-03-20 13:38:38
    用于决定就绪队列中的哪个进程(或内核级线程,为叙述方便,以后只写进程)应获得处理机,然后再由分派程序执行把处理机分配给该进程的具体操作。 1 主要功能过程 保存处理机的现场信息。在进程调度进行调度时,...
  • 程序,进程和线程的区别与联系

    千次阅读 2018-05-18 03:01:21
    借鉴了各大网站,总结出的个人心得体会,转载请注明出处提到线程和进程,必须先了解一些预备知识。 程序: 程序是为实现特定目标或解决特定问题而用计算机语言编写的命令序列的有序集合。 程序(这里和前边指的是...
  • 进程和线程的区别,最简单的解释说明

    万次阅读 多人点赞 2019-05-16 14:52:10
    2、进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段数据段,这种操作非常昂贵。 而线程是共享进程中的数据的,使用相同的地址空间,因此CPU切换一个线程的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 855,846
精华内容 342,338
关键字:

进程和线程