线程和进程的区别

进程和线程的区别

进程的概念:

基本概念: 进程是操作系统资源分配的最小单元。一个进程拥有的资源有⾃⼰的堆、栈、虚存空间(页表)、文件描述符等信息。 从编程的角度来理解进程,可以把它看作是⼀个类或一个 PCB。
通俗来说,进程也叫作"任务",一个跑起来的程序就叫作进程,而类似于QQ.exe的叫作可执行程序,是一个存储在硬盘上的文件(静态的,未执行的)。当我们双击这个exe文件时,操作系统就会把这个文件的核心数据加载到内存里,同时在系统中就会生成一个"进程",可以在任务管理器中看到。
示例1:
在这里插入图片描述
注意: 只有执行了的可执行程序,才会产生进程,不双击,不执行 ,也就不会产生任何动作。而平常我们说的安装了太多的程序,导致电脑很卡的说法都是错的,因为通过上面我们知道,静态的可执行程序平时是放在硬盘上的,占用的是硬盘空间(除非C盘满了),不会影响电脑卡不卡。而只有当我们双击可执行文件,它开始运行的时候,数据加载到内存,内存中的数据又被cpu读取进行运算。此时内存和cpu都被占用了资源,才会导致电脑卡。即运行程序多了,进程多了占用的内存和cpu资源多了,才会卡。

C盘满了导致电脑卡的原因: 因为内存空间不够的话,会使用部分硬盘空间(C盘)作为"交换分区",这时如果你C盘满了或者只剩少数空间能用时,会影响到"交换分区"的使用,电脑就会卡。

进程的管理:

操作系统中通过结构体( PCB(进程控制块))来描述进程有哪些属性和信息。通过一定的数据结构( 双向链表 ),把若干用来描述的实体,放在一起,并且进行增删查改。
注意: 一个进程可能是一个PCB也可能对应多个,而且系统管理PCB的链表也不只一个,同时创建进程本质上就是创建PCB节点并且加入到链表中,销毁进程的本质就是从链表中删除对应的PCB节点,而查看任务管理器的进程链表本质就是在遍历链表。
进程中PCB中具体包含的信息(关键要素):

  1. pid: 进程的的身份标识:一个主机,同一时刻,这些进程的pid是唯一的,所以我们可以通过pid来区分进程
  2. 内存指针: 由于可执行文件的运行,操作系统需要把该文件的核心数据加载到内存,此时由于要创建进程,那么势必要在内存中给该进程分配相应的内存空间,而内存空间本来就有很多区域,有的用来存放指令,有的用来存放数据,还有的用来维护运行状态等。 用来描述进程持有的内存资源。
  3. 文件描述表: 每个进程都可以都可以打开一些文件(文件其实是存储在硬盘上的数据),而文件描述表里面就记录了当前进程都打开了哪些文件(打开文件之后就可以对这些文件进行读写操作了)。用来描述进程持有的文件资源。
    4. 进程的状态:
    a.新建状态(new)
    b.就绪状态 :进程随时都可以被调度到cpu上 执行
    c.运行状态
    d.阻塞状态 :进程无法被调度到cpu上执行
    e.销毁状态
    5. 进程的优先级: 决定进程的执行顺序,调度时根据进程的优先级来给进程安排时间。
    6. 进程的上下文: 保存并记录本次的执行状态(存档),以便下次定位和执行。对于cpu来说上下文就是寄存器中的值
    7. 进程的记账信息: 保证进程执行的公平性,它记录CPU调用次数和执行间隔,为进程调度器提供数据支持,规避有些进程饿死(被cpu忽视的进程)。
    注意: 4至7和 “进程调度” 有关系的,所谓进程调度就是通过并发和并行的方式,让计算机可以"同时"执行多个任务。
    “并行”: 每个cpu核心上都可以独立的运行一个进程(运行进程的相关指令),多个cpu核心就可以同时独立的运行多个进程。
    “并发”: 一个cpu核心,在短时间内切换,先运行进程1,然后运行进程2,然后运行进程3…只要微观上切换够快,宏观上看起来就好像多个进程同时运行一样。
    虚拟地址空间(“隔离性”,进程的独立性): 多个进程会分配到不同的内存空间,一般正常情况下,它们都是在自己的固定范围空间内执行的,但是偶尔会出现极端情况,某个进程的出现了内存越界访问(解引用 野指针),而且对于本进程来说,这个是无效的内存地址,但对于其他的进程来说可能是有效的,所以一旦发生内存越界访问就会带来进程之间的相互影响。而为了避免出现内存越界访问,进程之间相互影响,给每个进程都划分内存空间,叫做虚拟地址空间 (不是真是的物理内存地址,而是通过专门的设备MMU来完成虚拟地址到物理地址的映射)。 MMU会针对地址进行校验,如果发现非法地址,就直接通知进程(比如把进程杀死)从而及时止损,避免影响到其他进程的执行。

线程的概念:

线程的基本概念: 线程是操作系统能够进行运算调度的最小单元。它被包含在进程中,是进程中实际运行的单位。一个线程如果对应一个PCB,那么一个进程就是对应一组PCB(每个线程都是独立的拥有一份(文件描述表,内存指针)),一个进程中可以并发多个线程,每个线程执行不同的任务 。轻量级"进程"。
为什么会使用线程的原因: 本来进程其实已经可以实现**“并发编程”** 但是由于频繁的创建和销毁进程的代价太大,开销比较高。而引入线程不仅可以实现并发编程,同时代价和开销远比进程要小 (进程创建和销毁,会不断的去向操作系统申请和归还系统资源(内存资源和文件资源)。但是同一个进程之间的多个线程是同时共享同一份系统资源的,这些资源在进程创建时就已经申请过了,不用在向系统申请了,并且销毁时,如果还有其他线程执行的话,系统资源也不用还给操作系统)
多线程程序能够有效的提高程序的运行效率(更充分利用多核cpu)。

线程的优势:
创建线程比创建进程更快
销毁线程比销毁进程更快
调度线程比调度进程更快

进程与线程的对比:

包含关系: 一个进程包含一个或者多个线程,线程是从属于进程。
本质区别: 进程是操作系统分配系统资源的最小单圆,线程是操作系统进行运算调度的最小单元。
开销对比: 创建,销毁,调度进程的开销远大于线程。
系统资源: 不同的进程之间拥有自己独立的,不同的的系统资源;一个进程中不同的线程之间是共享该进程所分配的系统资源。
影响关系: 进程之间是相互独立不会影响彼此,一个进程崩溃了,对其的进程没有影响。但是同一个进程中,一个线程若是崩溃了,会导致整个进程崩溃。总的来说多进程比多线程更健壮。
上下文切换: 线程的切换速度要比进程快,线程对于cpu的利用率也比进程高。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值