一、进程和线程的区别:
- 关系:进程包含线程。
- 根本区别:进程是系统分配资源的最小单位;线程是系统调度CPU执行的最小单位。
- 存储:多个进程的内存是隔离开的,一个进程中的多个线程可以共享内存。
- 开销:线程的创建、销毁的代价都比进程小。即 进程的状态转换 开销大于线程。
- 线程(假如有bug)可能会导致整个进程挂掉无法运行;而 进程间是独立运行的(也可能存在进程通信)
- 操纵者不同:进程的操纵者是操作系统(OS);线程的操纵者一般是程序员。
-
拥有资源不同:每个进程有自己的内存和资源,一个进程中的线程会共享这些内存和资源。
-
CPU利用率不同:进程的CPU利用率较低,因为上下文切换开销较大,而线程的CPU的利用率较高,上下文的切换速度快。
简单用图记忆一下 进程与线程之间的关系:
二、什么是进程?——Process
每个应用程序运行于现代操作系统之上时,操作系统会提供一种抽象,好像系统上只有这个程序在运 行,所有的硬件资源都被这个程序在使用。这种假象是通过抽象了一个进程的概念来完成的,进程可以说是计算机科学中最重要和最成功的概念之一。 进程是操作系统对一个正在运行的程序的一种抽象,换言之,可以把进程看做程序的一次运行过程; 同时,在操作系统内部,进程又是操作系统进行资源分配的基本单位。
- 进程是系统分配资源的最小单位。
- 操纵者:进程是由操作系统创建及管理的。(操作系统管理进程:(1)先创建一个PCB结构体——>用于 描述进程信息;(2)把多个进程PCB结构体,通过一定的数据结构组织起来)
- 系统对进程的调度:主要以 时间片轮转调度算法(一个CPU以时间片轮转调度的方式,依次执行多个进程)
- 进程的状态:创建状态、就绪状态、运行状态、阻塞状态、终止/销毁状态。
程序 和 进程
· 程序是在一个静态磁盘上的一个可执行文件。
· 进程是动态的,将可执行文件加载到系统中。加载就是将信息放在内存中,分配一些资源,并且执行程序中所有指令。
进程的存储—虚拟地址空间:
- 进程不直接使用物理内存,而是使用虚拟地址空间;
- 虚拟内存空间 里面里面是使用 分页式存储管理(页-Page-类似于书页目录)
PCB结构体:
(1)PID:进程ID,是进程的唯一身份标识(类似于数据库 主键,唯一性),但是它不是固定不变的,是每次启动进程时动态分配的。
(2)进程状态:5个。
(3)内存指针:进程内存地址
(4)资源清单:io设备,(硬件设备),硬盘文件
文件描述符表:定位硬盘中的文件,包括 默认创建三个文件描述符(输入输出):类似于java中的System.out(标准输出) 、 System.err(错误输出) 、System.in(标准输入)。
(5)调度信息:进程执行了多少代码,等待了多久.....
(5)上下文:保存本次的执行状态,以便下次执行。
三、什么是线程?——Thread
- 线程是系统调度CPU执行的最小单位。
- 操纵者:线程的操纵者一般是编程人员。
- Java线程的状态:创建状态、可运行状态、等待状态、超时等待状态、阻塞状态、销毁状态。
-
线程比进程更轻量级。所以虽然多进程也可以并发,也选择多线程。
-
线程的优势:(1)创建线程比创建进程更快;(2)销毁线程比销毁进程更快;(3)调度线程比调度进程更快
Java中常见创建线程的方式:
- 继承Thread类;
- 实现Runnable接口;
- 实现Callable接口;
详细会写于另一个帖子。
四、总结
一个程序至少有一个进程,一个进程至少有一个线程。
重点是:区别(在一里面)。