文章目录
- 从冯诺依曼体系入手来了解计算机硬件部分
- 操作系统
- 操作系统的概念
- 设计操作系统(OS)的目的
- 对下(硬件)OS的管理
- 对上如何理解系统调用
- 进程
在计算机系统中,硬件、操作系统和进程是三个至关重要的概念。它们相互协作,共同确保计算机系统的高效、稳定运行。这篇文章将从硬件开始,逐步深入到操作系统和进程
从冯诺依曼体系入手来了解计算机硬件部分
我们常见的计算机,如笔记本和服务器,大部分都遵守冯诺依曼体系。
在冯诺依曼体系中计算机被分为这几个部分
- 1.输入设备,如:键盘,鼠标,网卡,磁盘(读取)等…
- 2.输出设备,如:显示器,音响,磁盘(写入)等…
- 3.存储器,在这里存储器指的是内存,并不是磁盘。
- 4.中央处理器(CPU),进行控制输入输出设备和进行运算。
在图片中我们可以看到两条路径分别是数据信号和控制信号
- 控制信号就是CPU对各个硬件进行控制所发出的信号分别直接与输入输出设备进行信号交流
- 数据信号不同我们可以看到CPU并不是直接与输入输出设备进行信号交流,而是将数据传到内存中CPU与内存进行数据的交流在传给内存内存再传到输出设备中
所以我们可以得到一个结论:
CPU 能且只能对内存进行读写,不能访问外设(输入或输出设备),外设要输入或者输出数据,也只能写入内存或者从内存中读取。
那么这个体系结构这样设计的原因是?
解决这个问题前我们先来进行个思想实验来体会下数据流角度在体系中的过程:
以登录 QQ 聊天为例,从打开窗口、发送消息到对方收到消息的过程中,数据的流动如下:用户通过输入设备(如键盘)输入消息,我们身为数据就诞生了,我们数据就被写入内存之中;CPU 从内存中读取我们对我们进行加密处理,然后将处理后的我们再次写入内存中;我们再被内存传输给网卡,再被网卡丢进网络,去找目标计算机;到了目标计算机之后我们又被目标计算机的输入设备(网卡)接收到,我们就被写入内存之中;CPU 从内存中读取到被加密的我们,然后将处理解码后的我们再次写入内存中;我们再通过输出设备(显示器)显示在目标屏幕上面;整体就是这个过程。
那么上面的问题再次精炼一点(从输入设备到内存,内存再到CPU,CPU又传输回内存,内存再到输出设备,这样会不会太麻烦?),为什么要设计内存的?
首先我们要知道就是外设(输入,输出设备)运行很慢,而CPU运行的速度很快 ,假设CPU是纳秒级别的那么外设就是毫秒级别的相比较之下差距还是很的大,那么因为木桶效应就会拉低整体的计算机速度。
如图:在存储金字塔中——CPU普遍是容量下,速度快,价格高;硬盘是容量大,速度慢,价格低。所以回到冯诺依曼系统中引入了内存,内存在二者中间,我们为了方便理解粗浅的将冯诺依曼系统看成两个部分(绿色部分和蓝色部分)
蓝色部分:这样CPU的速度就会由内存决定。
绿色部分:因为内存中有一定的储存空间,我们可以提前用算法将外部数据进行写入来提高速度
这样整体上提高了计算机的运行速度,我们就可以理解内存是CPU和硬盘之间的一个巨大的缓存
上面的只是其中一部分,而之所以说冯诺依曼体系是一个伟大的发明是因为大大的降低了电脑的成本,让我们可以买到性价比高的电脑,这样也推进了电脑的普及
操作系统
操作系统的概念
操作系统是计算机系统中不可或缺的一部分,它包括内核(进程管理、内存管理、文件管理、驱动管理)和其他程序(如函数库、shell 程序等)。操作系统的设计目的是与硬件交互,管理所有的软硬件资源,为用户程序(应用程序)提供一个良好的执行环境。而我们谈论的操作系统指的是内核部分
设计操作系统(OS)的目的
最本质的目的就是降低电脑的使用成本,就比方你买了一栋别墅自己一个人入住无论是从管理别墅工人还是其他都比较困难,而你找一个管家帮助你,你把事情交给管家你只负责对管家发出命令即可,那么在电脑中操作系统就是扮演管家的角色。
在这张图中,我们第一个标题介绍的就是底层硬件部分,而硬件到系统软件的部分每种硬件都会有自己的驱动程序(在电脑刚接电时候CPU因为有主板才可以直接访问你的磁盘的,这个是存硬件到硬件的),而操作系统并不是直接访问硬件而是通过驱动来控制硬件。
那么OS的目的就可以总结为:通过操作系统对下对硬件的管理,之其稳定高效安全的工作的这种手段来对上为用户提供一个稳定高效的运行环境
对下(硬件)OS的管理
我们下只看下面的三层,来进行说明操作系统是怎样管理的?
因为操作系统涉及的方面比较多,所以这里我们只是对操作系统进行顶层(浅层)理解
就以学校举例子,学校简单来说有学生,导员,校长。在学校校长是管理者(虽然学生才是(bushi[皮一下]嘿嘿),学生是被管理者,在一些大学中校长可能和学生基本上没见过几次面甚至不见面,那么校长是怎样管理我们学生的呢?带入电脑中,操作系统是校长,我们学生是硬件,那么操作系统管理硬件不一定要和硬件直接打交道,那么操作系统是如何管理硬件的呢?还有一个角色是导员,导员可以收集信息来给校长,这样校长就能有对应学生的信息了。
虽然校长拿到信息了那么是怎么管理的信息呢?校长之前是个程序员嘿嘿还是个只会C语言的程序员,所以校长就想到了设计一个对象,放学生的属性,那么就是用结构体管理学生的属性,并且用next指针连接起来
struct students* allstruct:
struct student{
char name[64];
int sex;
......
struct student *next;
......
那么校长就有了一个单链表,那么未来校长对学生管理,就变成了链表层面的增删查改的操作
回到电脑上那么操作系统是如何管理硬件的呢,硬件和学生一样也是具有属性的,那么在操作系统内部封装一个结构体,有新的硬件的时候就将属性放进去,那么就转化成了链表层面的增删查改。那么这种管理思路就是先描述,再组织任何计算机对象都遵循这种准则。**所以这也是所有主流的语言都要提供面向对象,就是提供先描述的能力,标准库就是给我们再组织的能力。**所以操作系统里面有大量数据结构。
那么先有操作系统,再有的计算机语言。
对上如何理解系统调用
我们以银行为例来进行理解,一个银行要有存钱,贷款,取钱的功能,在银行内部会有存取设备,座椅,服务人员,金库等。那么假设某天我要去存钱我直接把钱揣在我的兜里面,大摇大摆的走进银行直接去到了银行的金库把钱啪一放转身就走,下个人来也是这样,那如果是行长你会同意吗?所以行长就将银行对外设计成端口(窗口)的模式让你和服务人员进行沟通业务。银行也是个系统,这样即保证了银行内部的安全,对外也更加易于操作。
所以以银行为例做迁移,操作系统并不信任用户所以操作系统会将自己封闭起来,但是操作系统还要让用户使用所以开放了端口(system call这个接口只能是C语言的接口),即防止用户将底层程序改动破坏,又让用户方便的使用。所有软件的底层,都必须和C语言直接或者间接的相关。
那么某天一个老大爷来到银行老大爷老了有点懵,这时候银行会有银行经理来协助老大爷进行业务,老大爷说存钱经理就帮老大爷办好等等。
虽说有系统接口之后便于使用,但需要对系统有所了解才行,对一般的程序员使用还是会比较麻烦,所以开发系统的人就将系统端口封装成库(glibc,libc++库)来供我们使用(用户操作接口),所以说我们对于操作系统来说依然是老大爷级别的(/(ㄒoㄒ)/~~),所以现在我们使用的操作系统对应图片中用户操作接口,图形化界面(图片中没写)
进程
先声明图画的不是很严谨,只是易于理解
首先假设我们写了一个叫做code.c的程序里面就是一个简单的main()函数,在经过编译的时候会形成一个myexe的可执行文件,我们将电脑重启之后发现这个文件还在电脑中,那么这个可执行程序就在磁盘中。操作系统也是文件所以开机的时候先加载的是操作系统(kernel),那么当我们要执行这个文件的时候文件便会从磁盘中拷贝到内存中,在内存中形成一个myexe(外设➡内存,由操作系统+加载器完成),操作系统要对进程管理(调度到CPU…运行…关闭)那么myexe只有代码和数据,那是在内存中操作系统要找到这个代码和数据,并且再操作系统中一定不只一个进程被管理,所以操作系统通过进程的属性数据进行管理(校长拿着自己的链表进行管理进程 PCB 进程控制块),操作系统内会创建task_struck,让操作系统能找到和控制进程(校长的链表)这个过程就是操作系统的进程的模型
所以进程=内核数据结构+程序的代码和数据