计算机是怎么做到一心多用的?

一. 冯诺依曼体系结构

1.1 冯诺依曼结构图

 现在的计算机,大多遵循 冯诺依曼体系结构

  • CPU 中央处理器: 集成了运算器和控制器,用于进行逻辑和算术运算
  • 存储器: 分为外存和内存, 用于存储数据(使用二进制方式存储)
  • 输入设备: 用户给计算机发号施令的设备.
  • 输出设备: 计算机个用户汇报结果的设备.

1.2 关于CPU

其中,CPU是一台计算机最重要的部件,它相当于人类的大脑,如何衡量一个CPU的性能呢?

其中一个非常重要的指标就是主频,通常一条指令的执行过程需要多个时钟周期,即主频的倒数.简单来讲,主频越高,CPU执行指令的速度就越快

我们可以通过任务管理器观察电脑上的主频

 上图中的基准速度是指主频的最低标准,速度是指实时主频.CPU的主频是动态变化的

1.3 关于存储器

存储器分为内存和外存

内存,也就是我们平时常说的主存,用来存放当前正在运行的程序所需要的数据

外存,例如磁盘,U盘,光盘等,用于永久保存计算机产生的数据和和程序

虽然五大部件中的存储器和CPU是分离的,但我们使用的电脑中,CPU里也集成了多种寄存器,用来存储程序执行过程中产生的临时数据.

 如上图,虽然CPU内部寄存器的容量最小(通常只有2kb),但是价格是最贵的,因为它的存取速度最快.

那么出现了一个问题,当CPU从内存中读取/存储数据时,内存往往跟不上CPU的速度,这就大大降低了CPU的效率,该怎么解决这个问题呢?

为了解决CPU和内存之间的速度差异,导致了Cache(高速缓存)的出现,它们的速度对比如下图

当内存向CPU内输送数据时,并不会只输送当前要执行的程序,而是将和该程序相连的一部分数据都输入到Cache中,Cache再将CPU需要的数据送给CPU.因为Cache的存取速度比内存快,因此它成为了CPU和内存之间交换数据的缓冲区.

随着对速度的需求,现在也出现了三级缓存结构

 同样遵循"鱼和熊掌不可兼得"的规律,L1的速度最快,其次是L2,L3

1.4 冯诺依曼简介

 

简单认识下我们的祖师爷--冯·诺依曼
冯·诺依曼(John von Neumann,1903年12月28日-1957年2月8日), 美籍匈牙利数学家、计算 机科学家、物理学家,是20世纪最重要的数学家之一。冯·诺依曼是布达佩斯大学数学博士,在现 代计算机、博弈论、核武器和生化武器等领域内的科学全才之一,被后人称为“现代计算机之父”、 “博弈论之父”.

 

二. 操作系统

2.1 操作系统的定位

操作系统是一组做计算机资源管理的软件的统称。目前常见的操作系统有: Windows 系列、 Unix 系列、 Linux系列、 OSX 系列、 Android 系列、 iOS系列等.        
操作系统有两大功能---对下管理各种硬件设备;对上给各种软件提供稳定的运行环境

 2.2 程序和进程

此处就不搬运它们的官方解释了(有兴趣的读者可以自己去找度娘)

2.2.1 程序

 简单来讲,程序=指令+数据,通常表现为文件的形式,是静态存储的

上图为QQ程序的部分保存文件 

2.2.2 进程

 双击QQ.exe,即QQ的可执行文件,操作系统就会把这个程序加载到内存中并执行内部指令,这些

运行起来的文件就是进程,是动态运行的

 2.2.3 程序和进程的区别和联系

进程是操作系统对一个正在运行的程序的一种抽象,换言之,可以把进程看做程序的一次运行过程.

一个程序可以产生多个进程(通过任务管理器可以看到)

 进程也是操作系统分配资源的基本单位.

程序所占用的资源就是硬盘上的存储空间;一旦程序运行产生进程,消耗的系统资源有内存,CPU,硬盘等.

三. 操作系统是如何管理进程的

我们使用的计算机往往会同时进行多个进程

 然而CPU只有一个,它是怎么做到"同时"运行的呢?这就归功于操作系统的调度了

3.1 管理进程的步骤

就像"如何把大象放进冰箱里",管理进程需要两大步骤

1.描述一个进程(明确进程的相关属性)

一般是用c/c++结构体描述一个进程,这种结构体称为PCB(process control block)

2.组织若干个进程(使用某些数据结构把描述进程的信息放在一起,方便增删改查)

Linux下,使用双向链表把每个进程的PCB串联起来.这样,每创建一个进程,先创建该进程的PCB,然后把PCB加入双向链表;销毁一个进程,就是找到该链表上的PCB并删除;查看任务管理器,就是遍历整个链表

3.2 PCB的属性

下面描述一些PCB的主要属性

3.2.1 关于资源分配的属性

1. pid--进程的身份标识,可唯一标识一个进程

2. 内存指针--指明这个进程要执行的代码/指令在内存中的位置,以及这个进程要操作的数据的位置 

上文提到,进程的产生是因为把.exe文件加载到内存中.而加载的过程实际上是把进程要执行的二进制指令(编译器生成的)和一些使用数据加载了进去

3. 文件描述符表--记录当前进程在使用哪些文件

程序运行过程中,要打开多个文件,就会产生多个文件描述符,这些描述符的数组就是文件描述符表

举个栗子~ 

在C语言程序里,一个进程只要启动,会默认打开三个文件(标准输入、标准输出、标准出错输出),它们在文件描述符表下对应的下标为0,1,2,这个下标就称为文件描述符,这个数组就是文件描述符表

3.2.2 关于进程调度的属性

上述是单个进程自身的属性,但是我们已经知道,一个CPU要同时运行成百上千的进程,也需要一些属性协助操作系统进行调度.

 在讨论这些属性之前我们先谈谈操作系统是如何调度的?

虽然通过任务管理器可以知道,一台计算机上会同时运行多个进程,但从这些进程的角度来看,它们都认为这台计算机只为自己服务.

举个通俗点的栗子来说,就好像一个海王,同时拥有多个女朋友,站在这些女朋友的角度来看,都认为这个海王爱的只有自己.

虽然这种富有爱心的做法在现实中并不值得提倡,但是运用在计算机上,可以极大地提高计算机的工作效率.

同时让多个进程在CPU上运行,靠"并行"和"并发"这两大绝招

并行--多个CPU核心同时执行多个进程.

并发--一个CPU轮流执行task1,task2...只要切换的足够快,从宏观来看就是多个任务在同时执行.

"并行"和"并发"是操作系统自行调度的结果,只有微观上的区分,宏观上区分不了,在计算机业内,将二者统称为"并发".

另外,大名鼎鼎的"摩尔定律"大家应该并不陌生,但是因为硬件小到了一定程度,进入到微观世界,就变得不稳定,所以摩尔定律已经失效了,在这种情况下如何继续压榨CPU呢?

采用的是"超线程CPU"技术,即一个CPU有两个核心,这样就可以起到"一个顶俩"的效果

下图为"八核十六线程"

 

 1. 状态

 进程的状态主要有就绪(随叫随到),阻塞/睡眠(暂时不能在CPU上执行),接下来的博文会详细描述

就拿海王来说~

他的某一女友小美会在九月份出差,这位海王就可以在九月不安排与小美的约会,就说小美处于"阻塞状态",而其他女友是"就绪状态".

2. 优先级

操作系统会给每个进程评判分配时间的多少,执行的先后顺序.

在海王的三个女友中,他最偏爱的是"白富美"小丽,与小丽的约会时间就会更长

3. 记账信息

统计每个进程的执行时间,排队等候了多久...给优先级提供参考信息

海王比较不喜欢的是"作精"小琴,于是一个月没有跟小琴见面了,但是他身为海王,不能失去每一个女朋友,在小琴等了一个月后,终于等到了海王前往海南的邀约

4. 上下文

某个进程执行到一半被调出CPU时,会保护现场,存储该进程执行的状态;再次执行该进程时,会进行现场恢复,从该进程上次的状态开始执行

小美在出差前嘱咐海王准备好参加自己母亲的生日宴,回来后问海王准备的怎么样了?海王当然不能说:"我已经准备好和你一起去旅游了",要不然自己和小琴的事情会暴露的

3.3 内存资源的分配

在C语言中,我们学过了指针,通过对指针的解引用,可以访问到它指向的内存空间.如果让程序猿直接使用指针来管理某个程序,不难想象会发生以下问题

 

 如果程序员通过p1修改task1时不小心修改了p2指向的内容,执行task2时可能会崩溃,进程之间没有隔离性;此外,如果将task3销毁后没有将p3置null,就会出现野指针的情况

因此人总归是不靠谱的,不如将内存分配交给操作系统

 操作系统使用了一套虚拟内存的方法,即给每个进程安排一块只属于自己的虚拟内存,该进程只能访问自己的这块内存.每块虚拟内存又对应了一块实际的物理内存,它们的对应关系由操作系统安排.

这种情况下,当task1想访问task2的内存时,操作系统会检测出来并拒绝,极大地提高了进程之间的隔离性

3.4 进程间通信

虽然进程之间已经隔离了,但在某种情况下某一进程需要另一个进程的数据

操作系统会提供一块"公共空间",各个进程可以在这块空间上交换数据

 举个栗子~疫情期间,401号家有鸡蛋但是没有西红柿,402号家里有西红柿但是没有鸡蛋,他们家的孩子都想吃西红柿鸡蛋面,于是父母就把各自的物资放在楼道里,等到对方走后再拿走自己需要的东西.这个楼道就是公共空间

以后的博文涉及到的进程通信主要是"文件操作"和"网络通信".

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不 会敲代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值