文章目录
- 前言
- 操作系统的概念及常见的OS举例
- 操作系统的定位以及它的功能/职责/作用
- 全程高能!!!敲黑板警告!!!
- 一、进程概念(感性认知)
- 二、进程的描述和组织!!!
- 描述
- 组织
- 大体认知
- 三、进程描述之进程调度/CPU分配详解!!!
- 四、进程描述之内存管理/内存分配!
- 五、进程之间通信
- 六、相关拓展知识(了解即可)
- 进程和线程的区别
- 内存管理主要研究的问题
- 参考
前言
虽然,本文我们主要讨论的是软件视角下的操作系统,但是我们还是对操作系统做一个整体概述即软件+硬件角度说明。因为细节很多,所以整篇文章会比较长,请屏幕前的你做好准备嗷~
文章最后附本文的思维导图
操作系统的概念及常见的OS举例
定义:操作系统就是一组做计算机资源管理的软件统称,英文名字叫做operating system,简称OS。
简而言之,它就是一类用来做管理的、分配资源的软件。如果把整个电脑比成一个公司,那么操作系统就相当于是董事长或者总经理。
常见OS举例:
- windows系列,我们常用的基本上就是这个windows系列。
- Linux系统,是我们程序猿必须要掌握的系统。为什么呢?因为它特别适合开发和部署,比如服务器、嵌入式设备以及移动端设备基本上都是使用的linux系统,并且目前公司中绝大多数使用的都是这个系统,而非我们更为熟知的Windows。
- Mac系统,也就是苹果电脑中用的系统。
- Android系列,是手机端的操作系统,在谷歌旗下,本质上也是linux
- ios系列,也就是苹果手机中的OS,与mac系列是同根同源的。
- 鸿蒙……
操作系统的定位以及它的功能/职责/作用
定位:
1.是设备中软硬资源的管理者
2.是程序跑起来的必备条件
补充知识:
电脑能直接识别的只有机器语言(机器码、0、1组成的字符串序列),前辈们为了方便使用,设计了汇编语言(指令集,由一些单词组成的字符集),通过汇编语言操作电脑。但是这还不够方便,所以后来又发展出来了高级语言,我们可以通过高级语言来操作。例如java,编译后生成字节码文件(高级语言----》汇编语言),运行时,字节码变成机器码,被电脑识别(汇编语言—》机器语言)。
操作系统因为对硬件和软件方向都需要是绿灯,所以,需要提供一套指令集方便使用者编写、同时方便电脑硬件识别,以便于驱动硬件,完成程序的执行。但是不同的OS厂商设计的指令集会有所不同,所以,他们提供的驱动程序也不尽相同。
功能:
操作系统(OS)是硬件、软件、用户之间交互的媒介。对上(一般的app),起着给软件提供稳定的运行环境的作用;对下,起着硬件设备管理的作用。
全程高能!!!敲黑板警告!!!
一、进程概念(感性认知)
我们已经知道了,OS为软件提供了操作环境。那么具体是怎么操作的呢?OS对软件通过进程来管理。那么什么是进程呢?
概念:一个跑起来的程序,就叫做进程/任务。进程英文名字叫做process,任务名字叫做task。
例如,我们windows系统就可以通过ctrl+alt+delete调出我们的任务管理器,其实也就是我们这里的进程管理器。
这里我们需要区分两个概念:
进程&程序
1.从概念角度而言
程序:是一套数据处理的步骤,是静态的,表现为一个或一组文件。
进程:进程是程序的一次执行过程。
2.从用户角度而言
一个程序可以多次执行即有多个进程,甚至可以多次同时执行(宏观角度)。进程是程序在运行时的视觉主体。
3.从OS角度而言
进程是OS进行资源分配的基本单位/最小实体。
进程是一个非常重要的软件资源,是由操作系统内核负责管理(描述和组织)的。
那么OS究竟是怎么进行描述和组织的呢?我们接下来详细讨论讨论这个问题。
二、进程的描述和组织!!!
描述
进程的描述一般并不是单个数据能够描述清楚的,往往是一组数据。
在java中,我们可以用类/对象来描述这一组数据,C/C++中用的是结构体来描述的。他们都有一个共同的名字叫做进程控制块****,英文名字叫做process control block简称PCB。
而不管是结构体表示还是类/对象表示,它们的组成都是不变的,都必须包含以下四部分/具有以下四部分特征:
①进程的唯一标识——pid
②内存指针。注意这里的指针不是C/C++的指针,而是一个形象比喻,毕竟我们还有说java呢–它描述了进程关联的程序信息,例如那个程序加载到那个内存里去了。主要解决的就是内存分配的问题,比较重要!。
**③文件描述赋表。**也就是分配给这个资源使用的其他资源的信息。
④进程调度信息。主要解决的就是cpu资源的分配。非常重要!!因此,我们在下边专门开了一个小节讨论这部分内容。
PCB的这四个特性解决了OS操作中/资源分配中的进程标识、内存分配、CPU分配这三个主要问题。
我们在idea或者vs上边打印地址其实并不是真正的地址,有人说哈希出来的虚拟地址,这种说法对吗?我们在后边专门开了一个小节讨论这个问题。
组织
通过一定的数据结构来组织。这里采用的就是一个双向链表来把多个PCB给串到了一起。
大体认知
在基本了解了进程描述和组织之后,我们不难有这样的结论:
-
创建一个进程,本质上就是创建一个PCB这样的(结构体)对象,把它给插入链表中。
-
销毁一个进程,本质上就是把链表中的一个PCB对象给删除
-
任务管理器查看到进程列表,本质上就是遍历这个PCB链表。
三、进程描述之进程调度/CPU分配详解!!!
首先说结论,OS对CPU资源的分配,采用的是时间模式,即不同进程在不同时间段去使用CPU资源。
既然要讨论CPU分配,我们首先需要对它有一个基本的了解吧。
1.什么是CPU?
CPU是一块超大规模热集成电路,是一台计算机的运算核心和控制中心。
2.CPU的分类
决定一棵CPU战斗力的要参数包括“三大两小”。三大:核心数/线程数、频率、架构;两小:缓存、工艺。
这里我们主要关注的是核心数/线程数。
我们经常看到类似于这样的术语“8核16线程”,它的含义就是一个CPU分成8个核心,每个核心又能一个顶俩(超线程技术)。我们可以把每个核心都视为一个独立的CPU。
这里我们注意要区分进程和线程的概念,由于篇幅原因,这里我将会在第6个小节中对它进行说明。这里我们只需要简单知道进程和线程是一对多的关系即可。
了解完cpu,我们现在再来思考一个问题,cpu的核心/线程数是有限的,而我们需要处理的数据是海量的,这样就无可避免的会造成一个问题,那就是进程/线程并发。而谈到并发我们又往往会联想到并行,所以,我们再来讨论一下cpu资源分配过程中的并发和并行问题。
先来说结论,我们是希望同时进行的,为的是效率更高一些,为此,前辈们提出了一个概念——分时并发,同时涉及到并行和并发。
并行,微观上来讲,就是同一时刻,两个核心上的进程时可以同时执行的,宏观上也是同时执行的。【可以理解为平行关系,互不干扰完全没问题】
并发,微观上来讲,就是同一时刻,一个核心的多个线程是不可以同时执行的。一个核心一次只能执行一个线程,但是他能对进程进行快速的切换。宏观上,好像是同时执行的。
可以暂时这样理解:并行的讨论的基本单位是cpu的核心,并发讨论的基本单位是进程。
因此,分时并发就可以解决数据量比较大的时候程序的运行问题,服务于很多的进程。另外,宏观而言,并行和并发我们并不能区分,因此很多时候我们把并行和并发统称为并发,如果不显式声明的话。
讨论完cpu和并行并发这些背景知识,我们来看进程到底是怎么调度的?
进程的调度通常是通过调度器完成的。调度器有以下几种核心属性:
-
进程的状态
- 就绪状态:随叫随到,就成随时准备好了去cpu上执行
- 运行状态:正在执行
- 阻塞状态:短时间内无法响应……
- ……(其他的了解/用到再查也可以,先掌握这些重要的)
-
优先级
进程之间也是有优先级的,联想优先级队列
-
上下文
情景:加到一半断电了。此时就需要有人/部件记录这个状态,在cpu中当一下子加载不完也是需要上下文这个功能。
上下文本质上就是我们存档的内容。
进程的上下文就是cpu中各个寄存器的值。(联想cpu的功能)
保存这些上下文,就是把这些cpu寄存器的值,保存到内存中去。恢复上下文就是把这些cpu的值加载回去。
-
记账信息
操作系统中,统计每个进程再cpu上占用的时间和指令的舒木木,根据这个决定来决定下一阶段如何调度。
相当于一个会议记录,方便复盘。
四、进程描述之内存管理/内存分配!
首先说结论,OS对内存资源的分配,采用的是空间模式,即不同进程使用内存中的不同区域,互相不会干扰。
既然要讨论内存,我们首先需要对它有一个基本的了解吧。
1.什么是内存?
内存是内存器,一般表现形式有内存条等等。
2.内存功能
暂时存放 CPU 中的运算数据, 以及与硬盘等外部存储器 交换数据。
3.内存条简单介绍
虚拟地址与物理地址:
物理地址:真实的内存地址
虚拟地址:物理地址被操作系统转换后的地址
这么做的原因是:同一个进程不一定会被放在内存的同一个位置,而且不同的进程因为地址的不同,而且可能不连续,编写程序会变得很复杂。
虚拟地址是暂时承诺给你,等你需要(访问这段内存)的时候才会给你分配内存
五、进程之间通信
进程一多,无可避免的会带来一些问题,比如进程相互影响的问题。我们可以把它们全部隔离吗?不可靠,如果这些进程之间有相互依赖/配合的关系呢?需要他们进行相互配合。
这个时候我们就需要在隔离性的基础上“开个口子”,搞一个多个进程都能访问到的“公共空间”,基于这个公共空间来交互数据。
通信方式/公共空间有很多具体的体现形式,我们重点掌握两种**,基于文件和基于网络**即可。
六、相关拓展知识(了解即可)
进程和线程的区别
- 线程是依赖于进程存在的
- 进程和线程是一对多的关系
- 进程是os资源分配的基本单位,线程是cpu调度的基本单位
内存管理主要研究的问题
- 那些内存已经被分出去,那些还没有
- 已经分配出去的内存什么时候回收,怎么进行回收
- 物理地址到线性地址的转换。。。
- 内存碎片问题。。。
参考
CPU
OS