1. 先谈硬件
1、初步理解冯诺依曼体系结构
我现在认识的计算机,都是由一个个硬件组成的,他们都遵循这这样一个体系:
我们先来慢慢理解一下冯诺依曼体系结构:
1)存储器指的是什么?
存储器指的就是内存,而我们的磁盘之类的硬件是输入输出设备。
2)输入设备:键盘,摄像头,话筒,磁盘,网卡...
3)输出设备:显示器,播放器硬件,磁盘,网卡...
输入输出设备也称之为外部设备,也就是所谓的外设。
4)运算器:对我们输入的数据进行计算任务(算术运算,逻辑运算)
5)控制器:对我们的计算硬件流程进行一定的控制
我们把这两个统称为中央处理器,也就是 CPU 。
而这五大部件都是独立的个体。想要他们系统的工作,
各个硬件单元就必须用 “线” 连接起来,我们称这些线为总线:1. 系统总线,2. IO 总线 。
2、理解各个模块之间的协作
还是这张图:
先说结论:
先从输入设备交到存储器,中央处理器从存储器中拿数据,然后在内部做计算,然后把计算的结果再写回存储器,再将数据刷新到输入设备中。这个是冯诺依曼体系中,数据的流向。
我们来聊一聊存储:
一般来说,存储容量越大,速度就会越慢。正是因为这样,我们这个体系中才需要内存作为缓冲,让速度很慢的外设和速度很快的中央处理器能够通过内存更好的交互数据。
说了这么多模块之间的协作,谁来实现他们的协作呢?操作系统。
2. 再谈软件
我们的电脑里面有着 qq,微信,浏览器等等,计算机怎么知道什么时候使用他们?所以我们就需要一个东西总体上将他们统筹起来。也就是操作系统,
操作系统是一款进行管理的软件,他能对硬件和软件进行管理。
1、为什么要有操作系统
整个计算机是一个层状的结构,来看这样一个图:
从下往上,先是硬件和驱动程序,所有的硬件如果需要被软件使用,都需要配上相应的驱动程序,我们可以把他们理解成直接跟硬件打交道的软件,再往上就是操作系统,而我们之后需要重点学习的就是进程管理和文件管理相关的内容。
回到原来的话题,我们为什么需要有操作系统呢?
1)操作系统帮助用户,管理好这些软硬件资源。(手段)
2)为了给用户提供一个良好(稳定,高效,安全)的运行环境。(目的)
操作系统里面有着各种各样的数据,但是,操作系统不信任所有用户!所以操作系统为了保证自己数据安全,也为了保证给用户提供服务,操作系统就以接口的方式给用户提供了调用的入口,来获取操作系统内部的资源。
那什么是接口呢?Linux 操作系统本质上就是用 C语言 写的,所以所谓的接口其实就是 C语言 实现的自己内部的函数调用,我们称之为系统调用。而,所有访问操作系统的行为,都只能通过系统调用来完成。
所以看回那个图,再往上就是 system call 系统调用接口。
接着就是用户操作接口,有我们熟悉的 shell 外壳,然后是 lib,也就是库,因为系统调用还是比较的复杂,有些语言之类的就会将其封装成库供我们使用。
任何一门语言,如果他们想要直接或间接的使用到硬件,就必须经过操作系统,而经过操作系统就必须要使用系统调用接口。
那么如上就是计算机的整体层状结构了。
2、操作系统如何管理软硬件资源
我们先来理解一下什么是管理:
1)管理者和被管理者是不需要见面的(就像在学校,我们作为学生一般也不会和校长见面,在公司,我们一般也不会和老板一直见面(小公司当我没说))
2)管理者在见不到被管理者的情况下如何做好管理呢?核心在于管理信息,只要管理者得到管理信息,就能在未来进行管理决策 —— 管理的本质是通过对 ‘数据’ 的管理,达到对人的管理。
3)管理者和被管理者面都不见,该怎么拿到对应的数据呢?(先补充一个概念:什么是管理者?我们一般将世界上所有的事情分成两种,一种是决策,一种是执行,举个例子:今晚吃什么?吃面吧。这是决策;我现在去煮面。这是执行。做决策其实就是管理者,做执行的就是被管理者。不过在我们日常生活里,决策和执行基本都是一体的。)管理者需要通过执行者拿到对应的数据。
所以!
操作系统在进行管理的时候,需要见到软硬件吗?不需要,那操作系统该怎么拿到他们的状态数据呢?以硬件为例,操作系统就是通过驱动程序获取数据。
操作系统管理任何东西,都一定是遵循着 “先描述,再组织” 的策略,使用结构体对一个对象进行描述,然后将它用一个数据结构组织起来,这样就能达到一种状态:在操作系统中,管理任何对象,最终都可以转化成为对某种数据结构的增删查改。
结论:操作系统如何管理?
先描述,再组织。
3. 再谈进程
1、什么是进程
一个已经加载到内存中的程序,叫做进程。
我们到 Linux 下写一个进程瞧一瞧:
我们简单写一个程序,然后跑起来:
然后我们复制一个 SSH 渠道,然后查看一下进程:
ps axj | head -1 && ps axj | grep process
所以其实,正在运行的程序,就叫做进程。
2、如何理解进程
一个操作系统,不仅仅只能运行一个进程,可以同时运行多个进程。
操作系统必须把进程管理起来,那该如何管理进程呢?先描述,再组织。
任何一个进程,在加载到内存的时候,在形成真正的进程时,操作系统需要先创建用于描述进程的结构体对象 —— PCB,process ctrl block —— 进程控制块。
问题来了,该这么描述进程呢?用各种属性的集合来描述一个东西。所以所谓的 PCB 其实就是进程属性的集合。所以 PCB 就是一个结构体:
struct PCB {
进程的编号,
进程的状态,
进程的优先级,
... ...
}
系统会根据进程的 PCB 类型,为该进程创建对应的 PCB 对象。
那么什么是进程,进程就是 PCB 吗?并不是,进程其实是:
进程 = 内核 PCB 数据结构对象 + 对应程序的代码和数据
而进程的 PCB ,当然就包含描述进程的所有属性。那这样子,操作系统进行管理的就不是你的代码和数据,他只需要管理这个进程 PCB 即可。这样子,操作系统对进程的所有管理操作就都变成了对 PCB 这样一个数据结构的增删查改。
3、Linux 是如何管理进程的
前面我们理解了进程是什么样的,那 Linux 操作系统具体又是如何组织管理进程的呢?
Linux 操作系统下的 PCB 是:task_struct(进程其实也有人称其为任务),在 Linux 内核中采取的是基本的双链表的形式来组织进程 task_struct 。
至于 task_struct 究竟是什么样的,那就,欲知后事如何,且听下回分解~
写在最后:
以上就是本篇文章的内容了,感谢你的阅读。
如果感到有所收获的话可以给博主点一个赞哦。
如果文章内容有遗漏或者错误的地方欢迎私信博主或者在评论区指出~