操作系统—进程

x33g5p2x  于2021-11-22 转载在 其他  
字(2.2k)|赞(0)|评价(0)|浏览(476)

操作系统概念

操作系统是一组做计算机资源管理的软件的统称
(搞管理的软件:一方面管理计算机的硬件设备,另一方面管理计算机的软件资源)
目前常见的操作系统有:Windows系列、Unix系列、Linux系列、OSX系列、Android系列、iOS系列、鸿蒙…等

进程(Process)

进程是一种操作系统中非常重要的软件资源
把一个可执行程序跑起来,系统中就会创建一个对应的进程;如果这个程序执行结束了,系统就会随之销毁对应的进程 (进程就可以看成是一个程序执行的"过程")

进程是操作系统对一个正在运行的程序的一种抽象,换言之,可以把进程看做程序的一次运行过程;
同时,在操作系统内部,进程又是操作系统进行资源分配的基本单位

上述这个即是一个:可执行文件 / 程序
就是一个磁盘上的文件,是静态的,如果不去动,就不会发生变化
当双击这个 exe 文件时,操作系统就会加载这个 可执行程序
加载: 把 exe 文件中的很多内容,都加载到内存中了,分配一些资源,并开始执行这个可执行程序中包含的指令 (进程)
.

这块的腾讯会议,就是一个进程;当我们退出程序时,进程也随之关闭

进程管理(重难点)

管理: 先描述,再组织

描述: 以Linux 为例:在内核中,使用一个 task_struct / PCB(进程控制块) 结构体来描述进程 (C语言)
每创建一个进程,就同时创建一个 PCB 这样的类的实例

组织: 使用双向链表,把所有的 PCB 对象串到一起 (将 PCB 对象,放到双向链表中)
双击一个exe,创建一个进程的时候,本质上就是在内核中,先创建了一个 PCB 对象,然后把这个对象加入到链表中
关闭一个程序,结束一个进程的时候,本质上就是在内核中,找到这个对应的 PCB 对象,然后从链表上删掉,并且释放该对象
通过任务管理器查看到的所有的进程信息,本质上就是在遍历内核中的这个链表,依次读取对应 PCB 中的节点信息

PCB

包含信息:

  1. PID (进程 id):进程的身份标识
  2. 一组内存指针:指向该进程持有的一些重要数据在内存中的位置
    重要数据:a) 执行的指令; b) 指令依赖的数据
    内存:系统给该进程分配的资源的一部分
  3. 状态 (文章后面:进程的状态)
  4. 优先级:进程是优先上 CPU 执行还是放到后面上
  5. 进程的记账信息:记录了进程在 CPU 上一共执行了多长时间,通过这个时间来限制不要让某个进程来霸占 CPU 太久,导致其他进程无法执行
  6. 上下文:保存了上次进程在 CPU 上执行的进度,以便下次进程上 CPU 的时候能够继续执行
    3,4,5,6,都是为了实现"进程调度"

进程的状态

R — 就绪状态: 正在CPU上执行,或者即将执行
S — 睡眠状态: 这些进程没法在 CPU 上执行,而是在等待
D — 深度睡眠状态: 进程在长时间的忙于 IO 操作,没精力理会 CPU
X — 退出状态: 进程已经被销毁

🔺并发式执行:

处理 “狼多肉少” 问题;进程太多,CPU太少

一台计算机,同时运行着多个应用程序,同一时刻一个 CPU 上只能执行一个程序的指令,由于 CPU 计算 / 执行指令速度极快,我们就可以让 CPU 先执行进程1 的指令,执行一小会儿之后,执行进程2的指令,再执行一小会儿之后,执行进程3的指令…过了一段时间(人感知不到这个时间,算的速度太快了)之后,继续执行进程1的指令…
从微观上看,CPU上的这些进程的指令都是串行执行的,但是由于 CPU 切换速度极快,从宏观上看,人感知不到,感觉是多个程序好像是“同时”执行 —— 这就是并发
多线程是解决并发编程的方式之一,还有多进程,多协成,actor模型…

并行: 宏观上是同时执行,微观上也是同时执行 (两个 CPU 就可以同时执行两个进程的指令)

进程调度目的: 为了让这么多进程,能够很好的在有限的 CPU 上并发执行

时间片

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

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

这样每个任务都能得到执行,由于 CPU 的执行效率非常高,时间片非常短,在各个任务之间快速的切换,给人的感觉就是多个任务在"同时进行",这也就是我们所说的 “并发

并发和并行

并发: 多个进程在一个 CPU 下采用时间片轮转的方式,在一段时间内,让多个进程都得以推进
并行: 多个进程在多个 CPU 下分别,同时进行运行

内核态和用户态

一般的操作系统对执行权限进行分级:用户态和内核态 (为了安全性)
内核态的权限比用户态高很多的,用户态的权限比较小,只能进行一些风险比较低的操作

上古时代的操作系统,是没有用户态和内核态之分的,可能一不小心一个误操作就对计算机造成很大的伤害

举例: 去银行存款,得在窗口和柜员交互
存款的过程:
1.先和柜员沟通,要存多少,存到那个账户上
2.把钱和卡给柜员
3.柜员拿到钱和卡后,在电脑上一顿操作(用户看不到)
4.柜员:“先生 / 美女,您的业务办理完了~”
1,2,4 是用户能感知到的动作,相当于代码在用户态执行
3 是用户感知不到的,相当于代码在内核态执行

调度器

操作系统中实现进程调度的模块:调度器
操作系统的调度器会非常频繁的进行进程切换
实现具体调度的时候,有很多策略:这些策略都要依赖 PCB 中对应的属性

相关文章