目录
1. 进程
进程是操作系统分配资源的基本单位
,⼀个进程拥有的资源有⾃⼰的堆、栈、虚存空间
(⻚表)、⽂件描述符等信息。
简单来说,将⼀个可执⾏⽂件运⾏起来就是⼀个进程。
进程可以看作⼀个程序运⾏的“过程”。
注意区分:程序(可执⾏⽂件)和进程:
1. 程序是⼀个静态的磁盘上的⼀个⽂件。
2. 进程将可执⾏⽂件加载到系统中,加载就是将信息放⼊内存中,分配⼀些资源,并且执⾏程 序包含的所有指令。
1.1 进程的本质
进程本质就是⼀个 PCB
(
Process Control Block)
结构体,类似于 Java 中的类,⽽这个 Java 中的类包含了:
1.PID:进程的唯⼀身份标识。进程ID并不是固定不变的,它是么粗启动进程时动态分配。
2.进程状态包括:
新建状态
就绪状态
运⾏状态
阻塞状态
销毁状态
3.优先级:决定进程的执⾏顺序。
4.记账信息:为了保证进程执⾏的相对公平。记录CPU调用的次数和执行间隔,为进程调度器提供数据支持,可以规避进程饿死。(进程通过调度算法来决定调用哪个进程)
5.上下⽂:保存本次的执⾏状态,以便下次继续执⾏,整个过程就称之为⼀个上下⽂。
6
.⼀组内存:指定进程需要使⽤的资源。
1.2 进程关联的概念
时间⽚:每个进程得的 CPU 执⾏的时间叫做时间⽚。
内核态和⽤户态:内核态表示操作系统作为最底层的软件拥有最⾼的权限就叫做内核态,⽤户态指⽤户编写的程序。
2. 线程
线程(Thread)是操作系统能够进⾏运算调度的最⼩单位。
它被包含在进程之中,是进程中的实际运作
单位。⼀条线程指的是进程中⼀个单⼀顺序的控制流,⼀个进程中可以并发多个线程,每条线程并⾏执
⾏不同的任务。
2.1 线程的优势
线程的创建和消耗⽐进程成本低很多,效率更⾼,⽽且同⼀个进程中的多个线程是可以共享资源⽂件的,⽽进程和进程之间是不能共享资源的,因此这就是线程的诞⽣的意义。
线程间可以共享的资源:
1.
内存可以共享
2.
打开的⽂件可以共享
线程间不可⽤共享的资源:
1.
线程的上下⽂、状态、优先级、记账信息不共享。
2.
每个线程有⼀个栈空间不共享。
线程可以理解为⼀个轻量级的“进程”。进程是操作系统资源分配的最⼩单位,线程是操作系统执⾏和调度(运⾏)的最⼩的单位。
2.2 进程VS线程
① 单进程单线程
② 多进程单线程
③ 单进程多线程
④ 多进程多线程
进程和线程的区别主要体现在以下⼏点:
区别1:从属关系不同
从属关系不同:进程是正在运⾏程序的实例,进程中包含了线程,⽽线程中不能包含进程。
区别2:描述侧重点不同
描述侧重点不同:进程是操作系统分配资源的基本单位,⽽线程是操作系统调度的基本单位。
区别3:共享资源不同
共享资源不同:多个进程间不能共享资源,每个进程有⾃⼰的堆、栈、虚存空间(⻚表)、⽂件描述符等信息,⽽线程可以共享进程资源⽂件(堆和⽅法区)。
区别4:上下⽂切换速度不同
上下⽂切换速度不同:线程上下⽂切换速度很快(上下⽂切换指的是从⼀个线程切换到另⼀个线程),⽽进程的上下⽂切换的速度⽐较慢。
区别5:操纵者不同
操纵者不同:⼀般情况下进程的操纵者是操作系统,⽽线程的操纵者是编程⼈员。
2.3 线程并不是越多越好
同⼀时间可以运⾏线程的 CPU 是固定的,如果超过了最⼤值,其他的只能排队处理,这样就起不到多的作⽤了,并且线程的调度也需要消耗时间,因此并
不是线程越多越好。
线程的数量和两个因素有关系:
1.
CPU 的数量。
2.
任务的类型,计算密集型任务/IO 密集型任务(要深度使⽤ CPU),如果是计算密集型任务线程数量约定于 CPU 数量,如果是 IO 密集型任务(不太⽤ CPU 资源),原则上是线程数量越多好。