浅谈冯诺依曼体系与Linux操作系统

2024-05-09 12:12

本文主要是介绍浅谈冯诺依曼体系与Linux操作系统,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

前言

1.1冯诺依曼体系下的存储器

二、操作系统

1.关于操作系统

2.关于管理方式

总结


前言

不知道你是否有着这样的疑问:

什么是内存?什么是磁盘?他们有什么区别?可不可以相互替代?

操作系统是如何对数据进行管理的?我们平日写的C代码是如何既能在windows机器上执行又能在Linux机器上执行的呢?

如果你对这些问题感到混乱不妨先来看看这篇文章!

博主码云:带着可莉去炸鱼 (shenyang-aerospace-university-g_0) - Gitee.com


一、冯诺依曼体系结构

        想象以下现在你正在看着博主的文章美滋滋的学习着:那么博主的这篇文章是如何通过网络发送,通过你的网卡进行接受,而后显示在屏幕上的呢?

图1.0.1        冯诺依曼体系架构

在解释这个问题之前还需要我们了解一下冯诺依曼体系下的几个模块:
1.输入设备:键盘、网卡、磁盘、话筒、鼠标等等设备

2.输出设备:磁盘、显示器、声卡、网卡等等设备

3.存储器:磁盘、内存、多级缓存、云盘、光盘等

4.运算器和控制器:这两个模块都集成在现代的CPU中,控制器来输出控制信号、运算器来处理和发送数字信号。

举个例子解释控制信号和数字信号:

在一个有一定吞吐规模的港口上,你会发现有集装箱的辗转腾挪与运输船的停靠、卸载、装载。控制器起到的作用可以看作是对货船发出可以停靠、卸载、装载的信号,而运算器就是来实现这些动作的具体执行者。   

        但是存储器到底是什么,在冯诺依曼体系下是如何分布的?这是我们要要解释清楚的事情

1.1冯诺依曼体系下的存储器

        

图1.1.1        存储器的层次结构

        在具体解释存储器之前,要先解释以下为何储存器会出现在冯诺依曼体系结构下:

毫无疑问现代CPU的速度是远快于输入、输出设备的,这就造成了这样一个问题:CPU的处理速度过快以至于它会时常处于等待输入、输出设备响应,这显然是一种对CPU资源的浪费,网上有一个十分形象的表述——木桶原理

图1.1.2        木桶原理

        在计算机的世界中更是如此,计算机的速度往往受到它某些慢速硬件的影响,所以人们就想如何来减少对CPU资源的浪费,试想一下假如CPU具有同时处理十个输入和十个输出设备的能力,假设我们此时只有五个输入和五个输出设备,假设CPU只处理这几个设备,那么显然会浪费CPU处理五个输入和五个输出设备的能力。那么试想一下,如果我们能将更快的将更多的信息给CPU、将信CPU处理后的数据储存起来等输出设备就绪时在给输出设备而不是由CPU等待输出设备、将CPU资源释放出来给其他程序,是否就能增加CPU的效率呢?答案显而易见。当然可以!

        所以内存就应运而生,内存的速度比一般的输入、输出设备更快,它可以将输入设备输入的数据预加载到内存中,等待CPU“空闲时”向高一级的存储器释放,同时在向输出设备输出时会对内容进行缓存等待输出设备就绪的时候输出,而不是由CPU“拿着”数据等着输出设备就绪。

        至于磁盘的速度比较慢,但是其容量较内存和多级缓存更大,价格也越低廉,内存较磁盘更快,但是容量更小、价格更贵。同时需要注意的是内存具有掉电丢失的特性,因而内存只能用来临时保存数据,磁盘更适合长期保存数据。由于要满足CPU的高速数据供给,显然用磁盘来替代内存是不合适的。

图1.1.3        现代CPU参数
图1.1.4        现代内存参数
图1.1.5        现代磁盘参数

二、操作系统

1.关于操作系统

        操作系统是一款管理软硬件资源的软件,其通过合理管理软硬件资源给上层的用户带来安全、快速、高效的体验。

图2.1.1        操作系统定位图

        从图2.1.1中我们不难发现每一层之间有着严格的上下顺序,事实也是如此:

        当我们身为用户使用某一款操作系统的时候基本上都是不会去关心底层的硬件逻辑的,但是我们的PC机往往又是由复杂的硬件构成的,此时就需要硬件的厂商来自行提出一种运行该硬件的软件,这就是驱动程序,但是仅仅有驱动程序是远远不够的,比如我们敲击键盘,此时我们希望进行打字,而现实却是机器直接死机了,那将是一件多么扫兴的事情,所以此时操作系统出现来管理和调度这些驱动程序,那么此时一台基本功能的PC机就出现了,但是有这样一个问题:硬件与硬件之间有着很大的差异,面向机器编程将是一件十分痛苦的事情,因为这意味着一份能在不同机器上运行得到正确结果变得几率渺茫,所以此时的人们想是否能消弭不同机器带来的编码壁垒,而后人们发明了诸如C语言这样的编程语言,而后广泛传播,人们便开始默契的制定语言标准,这使得人们不必关心硬件差异,厂商们会进一步向上迎合已经指定的语言标准,程序员只需要使用人们早已标定的由操作系统修正差异的接口就可以实现相应的效果——这一举动无疑大大解放了生产力、降低了程序员的门槛。

在不同的厂商向上迎合标准的时候,定然是不希望一个用户去私自胡乱的去访问其他用户的数据的,因而操作系统只接受通过其自己设计的系统调用接口来访问其内核数据(让我们不要把视线只停留在我们使用的PC机上,比如某些证券公司等非常要求安全性的地方,这样的设计就显得尤为重要)。

图2.1.2        关于抽象接口的理解

2.关于管理方式

        想象一下我们在学习数据结构的时候,是如何管理数据的?对于一个链表我们会先定义一个节点,而后将多个节点相连接然后形成链表并为其构建相应的功能。对于一个树结构,我们会先用定义每个节点而后根据合适的规则链接成树,然后在为其构建相应的函数。对于堆栈结构来说更是如此。只不过有的数据较为简单可能使用单个内置类型变量就足以表示,但是在实际生产中,数据往往很难由单一的数据类型来表示,比如说我们操作系统在表示一个任务的时候,往往会有诸多的数据需要管理。

        在Windows的操作系统中有着明确的线程和进程该概念,但是在Linux系统中,操作系统则没有界限分明的定义,Linux操作系统统一将其称为任务,对于一项任务往往是要由多种数据构成的

1.唯一标识符

2.进程状态

3.优先级信息

4.程序计数器:用来指认代码下一句执行内容

5.内存指针:用来指向进程需要的数据和代码

6.上下文数据:用来记录某一时刻进程执行的各项参数

7.记账信息:用来记录单个进程的执行时间,用来计算程序运行是否超出时间片

8.其他信息

        显然,要正确的描述一项任务很难由单个内置类型实现,所以我们往往使用自定义类型来描述操作系统管理的软硬件。就我们学习管理数据结构的那样我们操作系统会先抽象出一个结构体,而后在结构体中进行详细的定义,而后只需要面向结构编写相应的功能函数即可。在操作系统中不仅是对软件内容是如此管理,对于硬件更是如此。

所以我们不难概括以下操作系统的管理方式——先对目标做描述,而后制定相应函数。

在之后的文章中博主会介绍有关于进程更多详细的信息

                                                                                                        ——本文【完】


总结

本文十分粗浅的谈了谈现代计算机体系架构和操作系统的管理方式,一方面是为了后面的文章打下一些基础,另一方面是为了扫除一些常识性的问题。

这篇关于浅谈冯诺依曼体系与Linux操作系统的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/973377

相关文章

Linux命令学习之二

每日一结 ​               命令置换:是将一个命令的输出作为另一个命令的参数,命令格式如下: commond1 `command2` 其中,命令command2的输出将作为命令command1的参数,需要注意的是, 命令置换的单引号为ESC键下方的 ` 其意思就是说,先运行单引号内的命令,再将其命令作为

Linux命令学习之一

每日一结                                                                                        注:当用户不确定一个软件包的类型时, 可使用file命令查看文件类型

Linux文件I/O之一

每日一结(标准I/O)   一  库    本质 :一组实现函数接口 [printf,scanf,strcpy,strlen]   使用标准库好处:屏蔽底层细节,向上层提供统一的接口,提高程序的可移植性   windows 库 : *.dll  linux   库 : *.so    二 系统调用接口    本

Linux网络编程之五

每日一结 组播: ​ 网络地址: 一些特殊的组播地址:   一 组播包收和发 1.发送方 (1)创建用户数据报套接字 (2)填充组播地址和端口  (3)发送数据到组播地址 2.接收方  (1)创建用户数据报套接字 (2)加入组播组  struct ip_mreq mreq; mreq.imr_m

Linux网络编程之四

每日一结 一 UDP并发  核心思想:父进程接收到客户端的数据,就创建子进程,在子进程中创建一个新的套接字  和客户端交互  int do_client(接受客户端地址,数据,数据长度) { 1.创建用户数据报套接字  2.自动分配地址  3.处理数据[例如:输出数据内容] 4.通过新创建的套接字将数据回发给客户端  w

Linux网络编程之三

每日一结 Tftp服务器的实现: server.c ​       client.c     代码分析如下:     一 Linux IO模型  (1)阻塞IO  (2)非阻塞IO  非阻塞IO

Linux网络编程之二

每日一结   一 TCP 函数接口  int listen(int sockfd, int backlog); 功能:设置流式套接字为监听模式  参数: @sockfd    流式套接字的fd  @backlog   请求队列的长度,最大128  返回值: 成功返回0,失败返回-1    int accept(i

Linux网络编程之一

每日一结 一 网络基础知识 (一)IP地址 1.IP   :网络中一台主机唯一标识  2.组成 :网络号 + 主机号  3.IP 分类 最高位    第一个字节 A  1 + 3     0        [0-127]     B  2 + 2    10        [128-191]

Linux进程与线程之五

每日一结 一 共享内存 :内核空间预留出来的一块内存,用于进程间通信  (1)int shmget(key_t key, size_t size, int shmflg); 功能:获取共享内存段的ID  参数: @key    IPC_PRIVATE  或 ftok()  @size   申请的共享内存段大小 [4k的倍

Linux进程与线程之四

每日一结 一 传统的进程间通信  1.信号 : 异步进程间通信方式    信号是对中断机制的一种模拟  进程对信号处理方式: (1)忽略信号  SIGKILL ,SIGSTOP 不能忽略  (2)捕捉 : 信号到达的时候,执行信号处理函数  (3)缺省操作 : 系统默认的操作  大部分信号默认的操作都是杀死进程,SIGCHLD 进