本文的重点:什么是:进程、进程调度、线程和他们之间的联系。主讲概念知识,不讲代码实现
目录
一、认识进程
1.什么是进程
2.进程的信息
3.进程调度(***)
4.进程调度的基本过程
二、线程
1.线程的引入
2.什么是线程
3.进程于线程的联系区别
前置知识:我们写的代码是如何操作系统的
写了一个打印字符串的代码
1)应用程序执行println,调用系统提供的api
2)操作系统内核里,感知到要执行操作显示器的行为
3)操作系统内核,通过驱动程序,找到对应的硬件设备(显示器),并执行“显示字符串”操作
类似去食堂打饭,想要某个菜,并不是自己去抓取,而是通过食堂阿姨去操作。
我需要吃饭==执行程序,告诉阿姨==调用api,阿姨听到了==感知到我要吃饭,通过阿姨的眼睛找到了大白菜==通过驱动程序找到……
一、认识进程
进程,就是运行起来的程序等等,这是对进程最基本的概念
1.什么是进程
1.1.概念
(1)一个程序,允许起来,在操作系统中就会出现一个进程;可以理解成进程就是一个跑起来的程序。
(2)进程是程序的一次执行,是一组指令的集合。
(3)进程可以视为是 操作系统进行资源分配的基本单位 。
1.2.查看进程
1.3.进程运行的条件
(1)进程可以运行起来,是必须要消耗一些系统资源的。(跟人要吃饭一样)
(2)需要的资源
cpu,内存,硬盘,网络带宽,显卡等等很多资源
(3)查看进程消耗的资源
(4)进程的作用
进程可以视为是 操作系统进行资源分配的基本单位!
2.进程的信息
背景
当操作系统中的进程多起来之后,就需要对其进行管理,和分配资源,于是就出现了一些操作,用来对进程进行管理操作。
2.1.管理进程的方式
(1)通用手法:描述+组织
(2)如何描述和组织
描述:一般通过一些结构体/类,把一个进程的核心信息抽象提取出来,并进行表示(就是对一个东西就行描述,比如进行有哪些东西,描述出来)。
管理:通过一定的数据结构,把多个这样的结构体/类的对象串起来,方便进一步的各种增删查改。
(3)如何描述Ⅱ
使用名字为:PCB 的结构体描述,再使用类似链表的数据结构组织。
所以,进程的核心信息都存储在PCB的结构体中,下面了解PCB就可以了解到进程有哪些信息。
2.2.PCB的核心信息(**)
(1)pid (2)内存指针 (3)文件描述符表 (4)状态、优先级、上下文、记账信息
其中第(4)是为了支撑 进程调度而产生的。
这四点我们下面分别介绍。
2.3.pid
(1)作用:唯一身份标识,标识一个进程。就像人的身份证
(2)查看进程的pid值
(3)总结
同一个机器,同一个时刻,进程id一定是不同的
2.4.内存指针
(1)内存指针,实际上就是一组指针
(2)作用:指针,就是 指向 进程所需要的 资源在内存中的位置。
(3)哪些资源?
1. 硬件资源 2.内存资源 3.指令资源 4.依赖的数据(进程的状态)
(4)指令的作用
进程是一组指令的集合,有了指令,才知道进程接下来要做什么(比如:调用显示器等等)
2.5.文件描述符表
(1)用来记录打开的文件,结构类似顺序表
(2)作用:在进程运行的时候,会打开一些文件;而文件描述符表就会记录下来,进程都打开过哪些文件。
目前用处较少,后期还会继续介绍。
2.6.状态、优先级、上下文、记账信息
这四大属性存在是为了支撑进程调度而存在。下面先简单的介绍这四个属性,然后再介绍进程调度。
2.6.1状态
进程/线程的状态大概有五种
(1)新建态 (2)就绪态 (3)运行态 (4)阻塞态 (5)死亡态
2.6.2.优先级
这个属性,用来决定给进程分配时间的多少
2.6.3.上下文
(1)上下文,类似于书签
(2)作用:
进程第一次被调度到cpu上工作,一会后被调走,此时需要记录一些工作的进度;当第二次调度回来后,就可以继续执行。
2.6.4.记账信息
(1)用来标记每个进程所 分配到的资源大小
(2)作用:可以更好的分配系统资源,防止一些进程无法分配到(可以尽量做到雨露均沾)
3.进程调度(***)
背景引入:
在一个操作系统中,进程的数量远远大于cpu的数量(目前cpu都是多核心的,一个核心同一个时间只能执行一个进程)。有那么多的进程,是无法同时运行的,所以有了进程调度。
3.1.进程调度概念
(1)进程调度,可以说是一种手段
(2)进程调度的作用
根据不同的条件,将一个进程分配到cpu(或cpu上的核心)运行。
(3)如何调度
根据上面提到的进程中四大属性(状态、优先级、上下文、记账信息),加上一些特定的算法和规定,选择合适的进程并将其分配到cpu上进行运行
3.2.调度的效果
进程调度一般是产生并发执行的效果,下面通过半道理的方法来说明。
(1)并行执行
一个cpu,存在一个或者两个核心。一个核心,同一个时刻,只能运行一个程序;一般的系统中都存在多核心(我们以16核心举例),这个时候,就是16个核心上面同时有16个进程。这16个进程是完全同时执行的,这种情况我们称为并行执行
(2)并发执行
同一个核心,同一个时刻不能执行多个进程,但是不同时刻,可以执行不同的进程(分时复用)。
cpu就会把总的执行时间,分割成许多小的时间段;在每个小的时间段里面,执行一个进程,因为时间极短,人感知不到,因此可以认为是很多个进程在“同时执行”,这就称为并发执行,也就是进程调度的基本体现。
(3)我们把并发执行+并行执行 统称为 《并发执行》
3.3.深入理解调度
这里借用一个《渣女小故事》,结合进程的四大属性(状态、优先级、上下文、记账信息)来更好的理解。
(1)故事背景设置
背景:重生了,我是一个才貌双全的女孩子。所以,追我的男生从这里排到了法国,因此,我有了选择男朋友的权利。
选择男朋友的标准:(1)高 帅(2)富 (3)会添
但是同时具备三个条件的男生:很少/具备也看不上我
做法:同时谈三个,分别为:A(高帅) B(富) C(超级无敌三百六十度螺旋添)
为了防止被他们发现,只能运行《时间管理》对他们进行分时复用,也就是进行合理的调度。
在微观上,我是同一个时间只和一个小哥哥在一起;宏观上,我在和三个小哥哥同时在一起。
而调度发挥的作用就是:可以合理的安排时间
(2)进程的状态
在上面的时间表中,需要考虑到三个小哥哥的状态。
1)三个小哥哥随叫随到。在操作系统中,称为进程的就绪状态
2)有个小哥哥有事,无法随叫随到。在操作系统中,称为:进程处于阻塞状态
所以进程的调度就会根据不同的进程分配不同的时间。
(3)进程的优先级
三个小哥哥,我会根据给我的价值,对他们分配不同的时间。如给A分配的时间就会更多,B其次,C最少。
(4)进程的上下文
在和小哥哥约会的时候,有些事情未完成,就会记录下来这次,等到下次执行的时候就可以恢复
(5)进程的记账信息
通过一个表格,记录给每个小哥哥分配的时间,当分配时间少的时候,就适度加多时间。
每个进程都有自己的属性(如状态、优先级这些)
4.进程调度的基本过程
(1)进程的创建 (创建自己的PCB,并加入链表中)--进程的新建态
(2)就绪队列管理 (如:进程的优先级,进行排队)--进程的就绪态
(3)进程选择 (根据一些特定的算法,选择合适的进程)
(4)进程切换 (涉及上下文,当前的进程分配到cpu上,记录该线程在硬盘上的数据)
(5)进程执行(在cpu上进行执行)--进程的运行态
(6)阻塞和唤醒(如进行IO操作,如:Scanner时;此时就会先调度其他的进程)--进程的阻塞态
(7)终止(进程的任务完成,就会被移除就绪队列)--进程的死亡态
二、线程
线程是一个轻量级的进程,是系统调度执行的基本单位
1.线程的引入
(1)背景
利用多个cpu核心完成同一个任务----->引入多进程编程------>多进程编程存在问题(而且Java中也不太支持)------->引入多线程编程
(2)两个原因
1)需要把多个核心利用上
2)多进程编程,需要消耗的资源很大,时间慢,俗称:大重量。
2.什么是线程
2.1.线程由来
(1)线程其实是进程的一部分
(2)一个进程,最少有一个线程,也可以包含多个线程
2.2.线程与PCB
前面提到,PCB是描述一个进程的;本质上,一个PCB是描述一个线程的,多个PCB就构成一个进程。所以说,进程中有的,线程中都有。
(1)线程的PCB信息
pid、内存指针、文件描述符表、tgid、状态、优先级、上下文、记账信息。
(2)不同线程共享的信息
内存指针、文件描述符表、tgid
(3)线程单独一份的信息
pid、状态、优先级、上下文、记账信息
3.进程于线程的联系区别
3.1.区别
名字/不同点 | 进程 | 线程 |
---|---|---|
资源 占用 | 进程是分配资源的最小单位。不同的进程之间,拥有的资源不一样. | 不同的线程之间,共享一部分进程的资源 |
执行 方式 | 不同进程的地址空间不一样,一般一个进程崩溃后,不会影响其他的进程 | 线程没有单独的地址空间,当一个线程崩溃后,可能影响所有的线程 |
调度 速度 | 进度调度较慢 | 线程调度较快 |
系统 开销 | 系统开销大,创建/销毁慢 | 系统开销小,创建/销毁快 |
3.2.联系
(1)一个程序至少拥有一个线程,一个进程至少拥有一个线程;线程是组成进程的基本单位
(2)线程是进程内的一个执行单元,也是进程内可以调度的实体。当进程分配到资源时,该进程中的所有线程共享该资源。所以真正在处理机上运行的是线程
(3)进程和线程都可以并发执行,提供程序的执行效率。
(4)进程是系统分配资源的基本单位;线程是调度执行的基本单位。