💕"i need your breath"💕
作者:Mylvzi
文章主要内容:操作系统,进程与线程
一.操作系统
1.什么是操作系统
操作系统本质上就是一个"搞管理"的软件
日常生活中经常听到windows操作系统,Linux操作系统,Mac os操作系统,这些操作系统本质上都是一个个用于管理计算机的软件,当然这个软件十分复杂
2.操作系统的功能
操作系统的功能主要有两点
- 对上给各种软件提供一个稳定的运行环境
- 对下管理各种硬件设备
说明:给各种软件提供一个稳定的运行环境是指各个软件在运行的过程中互相独立,互不干扰(也就是后面要讲的进程的独立性),一个程序的崩溃并不影响到其他程序的正常运行(总不能你女朋友打进来个电话,你游戏就自动退出吧)
管理各种硬件设备:市面上有许许多多的硬件设备,但是操作系统就那几套,它是如何管理各种硬件设备呢?硬件生产的厂商在生产硬件的时候还会开发硬件对应的驱动程序,操作系统通过这些驱动程序就能管理对应的硬件设备,不同的硬件设备有着不同的驱动程序,但是能保证操作系统通过这些驱动程序进行硬件的管理
使用一张图更清晰的了解操作系统的功能
3.操作系统包含什么
一个操作系统主要由内核+各种应用程序组成,内核是操作系统最核心的部分
硬件的驱动程序就是在内核中运行的,内核也会给许多的应用程序提供支持
二.进程
1.什么是进程
进程(task/process)就是正在进行的程序(必须是已经运行起来的),在我们的电脑上有很多的进程,由系统自带的,有我们自己下载的,可以在任务管理器中观察我们当前运行的进程
2.进程有什么特点
进程就是跑起来的程序,程序一旦运行,就要吃cpu资源,占用系统内存
所以,一个进程就对应着一定的系统资源,或者说
进程是系统资源分配的基本单位
3,进程在系统中是如何管理的
一个计算机中,大大小小的进程有很多,如何管理这些线程是一个很大的挑战
这么多进程仅需要进行有效的管理,要管理先要明确管理的对象,再去考虑管理的方式,所以进程的管理分为两步
- 描述:使用PCB(进程控制块)来组织进程的各种属性(明确管理的对象)
- 组织:使用双向链表管理管理PCB
使用PCB描述进程的属性,一个进程可能对应着多个PCB,再通过"双向链表"这种数据结构来管理PCB,也就是管理相应的进程
也就是说:
- 创建新的进程就是创建PCB,并插入到双向链表之中
- 删除进程就是删除双向链表中对应的PCB
- 展示进程,就是遍历双向链表的每一个结点
4.PCB的一些属性
进程的属性都被PCB(进程控制块)组织起来,PCB中有很多重要的属性
- pid:进程的标识 当程序运行起来之后就会产生pid
- 内存指针:用于确定当前进程在内存中的存储位置与空间大小 对于一个进程来说,其实有很多需要存储的数据 常见的有进程执行所需要的指令 进程执行所依赖的数据 进程执行过程中产生的临时数据
- 文件描述符表:用于描述进程都和哪些文件有关联 也就反映了进程所持有的硬盘资源
一个进程来说可能由多个PCB组织起来,那就对应多个pid
一个chrome浏览器就有多个pid
如何理解内存指针呢?可以以写博客为例
进程所需要的指令:打开CSDN,点击发布文章,敲文字
进程执行所依赖的数据:学习笔记,同学交流
进程执行过程中产生的临时数据:你对某个点很感兴趣,询问了chatgpt,他额外给你补充了一些知识
5.什么是进程的调度
在之前的计算机中,我们只有一个cpu,也称作"单核操作系统",同一时刻只能有一个进程运行,要进行其他的进程必须先把上一个进程关闭,那又是如何实现多个进程同时运行呢?其核心思路是:通过快速的轮转,在宏观上实现了"同时运行"
就是只要我足够快,在一个进程结束的时候特别快的运行另一个进程,在宏观上就能实现"同时运行"的效果
同时,现在的计算机大多都是"多核操作系统",也就是含有多个cpu,这是就可以把其他进程转移到其他的cpu上,如果两个进程分别在两个cpu上运行,宏观微观上都是同时运行,称作"并行"
一个cpu通过快速的轮转,实现宏观上的同时运行,称作"并发",但实际上我们并不需要严格区分是并发还是并行,同时使用"并发"来统称
6.PCB中与进程调度有关的属性
1.状态
状态就是进程当前的运行情况 常见的有两种情况 就绪状态和阻塞状态 就绪状态分为两种,正在运行和准备运行 阻塞状态就是进程暂时不参与调度 最常见的是等待用户输入密码
2.优先级:
系统再分配硬件资源的时候并不是一视同仁的,而是根据进程的优先级去分配资源 优先级高的就优先分配更多的资源 优先级低的就晚分配/少分配资源 就像你在打游戏的时候还看着qq,肯定是希望先保证游戏的流畅运行 qq接收消息的优先级就低 其实优先级也是操作系统为了提高效率的一种体现
3.上下文:
就是"存档"保存当前进程执行时的cpu状态(更具体的来说是寄存器的状态)这样做是为了当下次再执行当前进程时能够直接利用上次的"存档" 比如你在打游戏的时候女朋友打电话过来了,你肯定得接是吧,就得先退出游戏 先打完电话再重新进入游戏 在你退出打电话的时候进程就保存了当时的运行状态 这样你打完电话之后也能再次回到离开前的游戏界面
4.记账信息:
存储进程所持有的cpu资源 以便合理的用于系统资源的调度 通过优先级我们为不同的进程分配了不同权重的硬件资源 但是在某些情况下可能会发生一些极端情况 为某个进程分配了过量的资源 而另一个进程就没有被分配到资源导致无法正常运行 记账信息就是为了解决这个问题 通过记录当前进程所持有的硬件资源 当发现不合理的资源调配时及时做出调整
7.虚拟地址空间
在早期的操作系统中,程序运行时,系统分配的内存是实打实的"物理内存"
当B进程中存在bug,发生了越界访问,导致在同一块内存中的A进程无法运行,我们希望的是当一个程序崩溃的时候另一个程序不受影响,为了解决这个问题引入了虚拟地址空间
- 对于进程A,B来说,他们并不知道自己在物理内存中的对应位置,操纵内存不是物理内存,而是系统为他们分配的虚拟内存
- 虚拟内存通过映射器与物理内存一一映射(类似于哈希表的映射),进程在虚拟内存中进行的操作都会被映射到物理内存中
- 进程直接操纵虚拟内存,在映射到物理内存之前会先对执行操作进行检查,看其是否发生不合理行为(如越界访问),如果发生错误就不会被执行,这样就算当前存在bug也不会影响另一个进程的正常运行(传输到物理内存中的操作都是被检验好的合理的数据)
- 虚拟地址空间的存在进一步提高了进程之间的独立性 在进行进程的调度时就避免了进程冲突的出现
注:虚拟地址空间实现了进程之间的隔离,保证了进程的独立性但是在有些需求下各个进程之间是需要合作的,所以在保证进程之间的隔离性的前提下,我们还要想办法让进程之间能够相互通信,进程间的通信方式有很多,常见的有
- 通过网络传输
- 通过文件
这些通信的核心思想都是相同的,即:
借用同一块内存空间实现数据的交互。
操作系统,进程与线程(一)(下)+https://developer.aliyun.com/article/1413563