认识进程
到底啥是进程呢!!!
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。
简单讲就是跑起来的应用程序(exe)就是进程!!!
我们电脑磁盘上有很多exe文件,我们如果双击这个exe文件,那这个文件只会静静的躺在磁盘上和咸鱼无异!!!
只有exe文件(可执行文件)运行了才能称作为进程!!!
我们可以打开我们的计算机任务管理,看看此时我们的操作系统上都跑了那些进程!!!
一个执行文件(exe)是如何跑起来变成一个进程的呢?
一开始在磁盘上的exe文件
运行后由操作系统进行资源分配和调度!
将文件加载到内存
cpu开始执行exe中的一些指令
线程
我们经常听到的线程又是个啥呢?和进程又有什么关系呢?
线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。在Unix System V及SunOS中也被称为轻量进程(lightweight processes,但轻量进程更多指内核线程(kernel thread),而把用户线程(user thread)称为线程。
我们知道进程是操作系统资源分配和调度的基本单元!!!
就比方进程就是我们生活中的一个个工厂!!而线程就是工厂中的车间或者流水线!!!
一个工厂可以有一个或多个流水线!
一个进程也可以包含一个或多个线程!!!
线程是操作系统进行运算调度的最小单位!!!
就是说,操作系统需要给进程分配资源和空间,而多个线程公用这块块空间和资源!
进程process也称为task任务! 任务管理系统,也就是我们操作系统的进程管理系统!!!
进程的属性和管理
计算机是如何管理进程的?
首先我们需要描述一个进程(明确出进程的一些重要属性)
然后组织若多个线程(使用数据结构把多个进程描述信息放在一起用于增删查改)
我们的的进程都是由操作系统分配和调度的!
而操作系统是由C/C++编写的!
我们通过结构体来描述进程的属性
然后通过双向链表将若干个进程组织起来,就可以进行增删查改操作!!!
进程属性
基础属性
我们知道我们每个人都有自己的名字和特点!而进程也是如此!
每个进程有自己的属性用来区分不同的进程!!!
PCB
为了描述控制进程的运行,系统中存放进程的管理和控制信息的数据结构称为进程控制块(PCB Process Control Block),它是进程实体的一部分,是操作系统中最重要的记录性数据结构。它是进程管理和控制的最重要的数据结构,每一个进程均有一个PCB,在创建进程时,建立PCB,伴随进程运行的全过程,直到进程撤消而撤消。
我们通过PCB就可以知道这个进程的信息!
pcb 中的一些属性
pid
进程id对进程进行身份标识!
内存指针
指明该进程要执行的指令和代码或者资源在内存的具体位置
文件描述符表
一个进程可能关联多个其他文件,给该进程提供资源,所以我们需要知道该进程要要用到那些文件! 打开一个文件后,文件描述符表就会增加一个信息,文件描述符表可以视为一个数组,元素为结构体!
我们一个进程会默认打开三个文件(系统自动打开):
标准输入(System.in)
标准输出(System.out)
标准错误(System.err)
实现进程调度的属性
并发和并行
我们提到进程调度就不得不提并发和并行!
我们知道现在的计算机的cpu都是采用多个核心的cpu!
一个cpu核心某一时刻只能执行一个进程!!!
但是多个cpu核心可以同时执行不同的进程!这就是并行!
微观上:
并行: 每个cpu核心同一时刻执行不同的任务!
并发:一个cpu核心先执行任务1,在进行任务2!!!
但是我们知道cpu的执行速度超乎你的想象! 快的一批!
所以再宏观上我们无法感受到进程某时刻是并发执行还是并行执行!通常我们将并发和并行通常为并发我们只是在操作系统,区别这两个,其他地方我们都默认叫并发!!!
状态
这个状态就描述了该进程如何调度
就绪状态 : 随时可以上CPU执行
阻塞状态/睡眠状态:占时不能上CPU执行
还有其他的状态以后在介绍!
优先级
我们的计算机一般都是多个进程并发执行
那么就需要明确一个进程的优先级
先给那个进程分配时间,分配多久时间!
以及谁分配的时间多少!
记账信息
统计每个进程分别执行的时间,分别执行了那些指令!
等待了多久,给进程调度提供依据!
上下文
记入上次进程调度出CPU时的执行状态!
我们的进程不可能一直执行下去,当我们的CPU需要调度其他进程时,那么该进程就要出cpu,当我们需要再次执行该进程时,上下文属性就可以精准的恢复到上次进程执行的位置!
就是在进程调出CPU时,我们吧寄存器中的数据保存在内存中(存档),下次执行该进程时在调回寄存器(读档)
我们举一个生活中的例子便于理解上述进程调度属性!
假如有一个海王(操作系统)
海王同时谈了3个对象!!!
一个富婆
一个辣妹
一个甜妹
我们知道该操作明显就是不道德的! 但是只要这3个对象没有见面就问题不大海王只需要安排好在某一时间约一个妹子!(也就是宏观上cpu只执行了一个进程)
假如海王比较喜欢辣妹,再是富婆,最后是甜妹(可爱在性感面前不值一提)(这里也就是进程的优先级)
星期一二三 和辣妹一起
星期四五 和富婆在一起
星期六 和甜妹在一起
周天休息
正常情况下,三个妹子随叫随到(也就是进程就绪)
结果辣妹去出差去了一个月回不来!!(此时该进程就是阻塞状态/睡眠状态)
海王和甜妹待的时间太少了,甜妹不愿意了(进程的记账信息存档)
所以此时海王就要给甜妹安排更多的时间!!!
当某一天,富婆说要带海王去讲父母, 辣妹说要带他去见闺蜜,都叫他准备好礼物! 结果海王把给富婆父母的礼物给了,辣妹闺蜜!如果记入了(进程上下文属性)就不会搞错!!!
显然海王是不对的!!!令人唾弃!!!
进程调度
无论是在批处理系统还是分时系统中,用户进程数一般都多于处理机数、这将导致它们互相争夺处理机。另外,系统进程也同样需要使用处理机。这就要求进程调度程序按一定的策略,动态地把处理机分配给处于就绪队列中的某一个进程,以使之执行。
就是cpu如何给进程分配资源!
我们知道每个进程都分配了自己的空间!但是cpu,内存资源有限!!!
当我们的一个进程出bug因为在不同的空间,并不会影响其他进程!
进程的独立性
就比如现在的疫情
如果一个居民感染了,那么只需要将该栋楼封锁即可!!!(该进程出现bug了)并不会影响其他进程!!!
进程间的通信
但是显然进程间不可能一直独立,不进行交流,cpu会分配一些公共空间供进程进行通信!!!
主要通信方式有两种:
文件操作
网络操作(socket)
后面我们会介绍!!!
进程和线程的区别
高频面试题
进程是系统分配资源的基本单位!
线程是系统调度运行的最小单位!
一个进程包含一个或多个线程!
进程和线程都是为了处理并发编程!
进程缺点,创建和销毁效率较低(需要分配资源),而线程弥补了该缺点!(轻量级进程),一个线程执行一段代码!!!
进程具有独立性,每个进程会有自己的虚拟空间! 一个进程挂了不会影响另一个进程!
但是一个进程有多个线程,一个线程挂了可能影响其他线程,甚至导致进程奔溃!!!