不会有人真的以为进程与线程是一个东西吧! 不会吧!不会吧!(进程与线程的区别及各自概念详解)

进程和线程的区别

(1) 进程是资源的分配和调度的一个独立单元,而线程是CPU调度的基本单元
(2) 同一个进程中可以包括多个线程,并且线程可以共享进程的资源 (进程代码段、进程的公有数据) ,线程之间可以共享资源 (堆,全局变量,静态变量),一个进程至少包括一个线程(主线程)。
因为内核只识别PCB,一个进程可能和多个PCB对应,一个线程只和一个PCB对应
在这里插入图片描述
(3) 进程和线程的创建不同,进程结束后它拥有的所有线程都将销毁,而线程的结束不会影响同个进程中的其他线程的结束
(4) 线程是轻量级的进程,它的创建和销毁所需要的时间比进程小很多,所有操作系统中的执行功能都是创建线程去完成的
(5) 线程中执行时一般都要进行同步和互斥,因为他们共享同一进程的所有资源
(6) 线程有自己的私有属性Pid,寄存器、硬件上下文,而进程也有自己的私有属性进程控制块PCB,这些私有属性是不被共享的,用来标示一个进程或一个线程的标志

一个进程中的线程数量
1、CPU的个数相关
2、和线程执行的任务类型也有关

类型a:CPU密集,程序是纯执行计算任务,线程数目CPU数目==
类型b:IO密集,程序没怎么进行计算,主要是进行输入输出操作,理论上线程的数目不限
实际生活中介于两者之间,实践中通过测试方式来找到合适的线程数。

进程(Process)

概念

进程是一种操作系统中的非常重要的软件资源,一个可执行程序运行起来,系统就会创建一个对应的进程,如果这个程序执行结束了,系统就会随之销毁对应的的进程。
进程也是操作系统分配资源的最小单位。一个进程在内核中都会对应一个PCB对象。

程序/可执行文件和进程的区别
可执行文件
程序:是一个磁盘上的文件,静态的,如果不启动就不会有变化。
在这里插入图片描述
进程:如果双击这个exe文件,操作系统就会把exe文件中的内容加载到内存中,分配一些资源,并开始执行这个可执行程序中的包含的指令。

进程管理

先描述再组织,用类描述,用数据结构进行组织。

以Linux为例,内核中使用一个 task_struct/PCB(进程控制块)结构体来描述进程(C语言),因为Linux开源所以我们可以了解到其中的操作系统工作原理。

进程运行的原理:每创建一个进程都会同时创建一个PCB这样的类的实例,使用双向链表把所有的PCB对象串到一起。

双击一个exe文件,创建一个进程的时候,本质上就是在内核中,先创建了一个PCB对象,然后把这个对象加入到链表中

关闭一个程序,结束一个进程的时候,本质上就是在内核中,找到这个对应的PCB对象,然后从链表上删除,并且释放资源。
在这里插入图片描述
当我们通过任务管理器查看到所有的进程信息,本质上就是在遍历内核中的这个链表,依次读取对应PCB中的节点信息

进程调度

目前的市面上的计算机CPU普遍都是多核,如何让进程在8个CPU上很好的工作,就要依赖进程的调度了。操作系统中实现进程调度的模块叫做“调度器”,实现具体调度的时候有很多策略,这些策略都要依赖PCB中的属性。

进程调度就是为了让多个进程能够很好的在有限的CPU上进行并发执行。

状态、优先级、进程的记账信息、上下文,这四个属性是为了实现 “进程的调度”,如果系统的资源非常的充裕,那么就不需要调度,但是实际上,在系统运行的过程中大部分都是处于资源不够进程分配,同一时刻CPU只能运行一个进程,狼(进程)多肉(CPU)少的情况。

并发式执行

进程的调度就是依靠并发式执行

从宏观上看,系统是在同时运行这些进程,但是从微观上来看,这些进程的指令是串行执行的,只不过CPU的切换速度极快,人宏观上感受不到这就是并发。
在这里插入图片描述

由于CPU计算速度贼快,在进程调度的时候,我们可以先执行进程1的指令,执行一会之后,执行进程2的指令,执行一会之后再执行下一个指令,因为是双向链表所以过上一段时间后又可以循环执行进程1了,其中的间隔时间极短,我们人感知不到。

并行

宏观上是同时执行,微观上也是同时执行(只要有两个CPU就可以同时执行两个进程的指令,就跟100米赛跑一样,所有的运动员几乎都是同时一起跑的)

PCB的六个属性

创建一个进程的时候,就是在内核中创建了一个PCB对象。

Pid

进程id,表示进程的身份标识,就相当于每个人的身份证一样。

内存指针

指向该进程持有的一些重要数据 (执行的指令、指令依赖的数据) 在内存 (系统给该进程分配的资源的一部分) 中的位置。

状态

在这里插入图片描述
此出处列举出一些主要状态:

R:就绪/运行状态,正在CPU上执行,或者即将执行
S:睡眠状态,这些进程无法在CPU上执行,而是在等待获取到资源
D:深度睡眠状态,进程在长时间的忙于IO操作(磁盘输入输出,也就是进行键盘读入类似这的时候,进程就被挂起等待了),没有精力理会CPU
X:退出状态,进程已经被销毁

优先级

决定这个进程是优先上CPU执行还是放到后面。 比如在医院排队治病,突然来了一个急诊病人,那急诊病人就要优先治疗,急诊病人的优先级就要高于普通病人了。

上下文

保存了上次进程在CPU执行的进度,以便下次进程上CPU的时候能够继续进行。

记账信息

==记录了进程在CPU上一共执行了多长时间,==通过这个时间来限制不要让某个进程霸占CPU时间太久,导致其他进程无法执行。

时间片

任务执行的一小段时间叫做时间片,任务正在执行时的状态叫运行状态,任务执行一段时间后强制暂停去执行下一个
任务,被暂停的任务就处于就绪状态等待下一个属于它的时间片的到来。

操作系统(如Windows、Linux)的任务调度是采用时间片轮转的抢占式调度方式,也就是说一个任务执行一小段时间后强制暂停去执行下一个任务,每个任务轮流执行。

内核态与用户态

为了操作系统的安全性,就分成了内核态和用户态。
内核态:操作系统内核作为直接控制硬件设备的底层软件,权限最高
用户态:用户程序的权限最低

比如在银行张三去填表,自己写姓名,电话,邮箱等等,做着自己的事情,这叫做用户态
而张三通过窗口的工作人员,把自己的需求给工作人员,自此,张三在等,银行工作人员在忙,对张三来讲,就叫做陷入内核。那么内核态是什么意思?就是工作人员在帮你办理业务时的状态,工作人员执行过程就是内核态。

线程(Thread)

操作系统进行进程调度,本质上就是操作系统针对这个进程的若干个线程进行调度

进程是系统分配资源的最小单位
线程是系统调度的最小单位。

为什么要引入线程

线程可以理解为一种轻量级的进程,也是一种实现并发编程的方式。

创建一个线程比创建一个进程的成本要低,因为线程的资源可以共享,不需要分配太多资源,但是进程不能共享,需要分配很多资源;销毁一个线程比销毁一个进程效率高。

线程的特点

1、线程包含在进程之中
2、一个进程中可能会有多个线程,每个进程至少有一个线程存在,即主线程
创建一个进程的时候,就会自动创建一个线程(主线程)
3、每个线程都有自己要执行的逻辑指令,每个线程都是一个独立的“执行流”
4、一个进程内的线程之间是可以共享资源的。

共享的资源:
1、内存资源(线程可以共享,但是两个进程之间的内存不能共享)
2、打开的文件

非共享资源:
1、上下文、状态、优先级、记账信息(每个线程都要独立的参与CPU的调度)
2、内存中的特殊区域,栈

操作系统如何管理线程

使用PCB进行描述,利用双向链表来组织,和进程的管理基本类似。

线程不安全

1、线程是部分资源共享, 当俩个或者多个线程需要相同资源时,就有可能发生不安全的情况
2、一个线程出现异常,整个进程就会被直接终止,此时其他线程就没法继续工作

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值