【从浅学到熟知Linux】冯诺依曼体系结构及进程概念详谈!

在这里插入图片描述

🏠关于专栏:Linux的浅学到熟知专栏用于记录Linux系统编程、网络编程等内容。
🎯每天努力一点点,技术变化看得见

文章目录

  • 冯诺依曼体系结构
  • 操作系统
    • 如何理解管理
    • 操作系统概念
    • 设计操作系统目的
    • 系统调用和库函数概念
  • 进程
    • 基本概念
    • 描述进程-PCB
    • 组织进程
    • 查看进程
    • 通过系统调用获取进程标识符
    • 通过系统调用创建进程


冯诺依曼体系结构

我们常见的计算机,像我们日常使用的笔记本、台式机;我们不常见的计算机,如服务器,大部分都遵循冯诺依曼体系结构。

在讨论冯诺依曼体系结构前,我们先来了解一下该结构涉及的5个部分:输入设备、输出设备、存储器、运算器、控制器。(下面给出了这5个组件的举例)

组件名称举例
输入设备键盘、摄像头、话筒、磁盘、网卡…
输出设备显示器、音响、磁盘、网卡…
存储器内存…
运算器算术运算单元、逻辑运算单元…
控制器无举例(负责协调外部就绪事件,如将数据拷贝到内存等)

下图描述的就是冯诺依曼体系结构,其中外部设备(输入、输出设备)在进行数据交互时,都是直接与存储器直接交互。而CPU从存储器直接获取数据或存储数据。在程序需要访问外部设备时,CPU才会与外部设备有间接交互。
在这里插入图片描述
为什么CPU不直接与外部设备直接交互呢?大家可能知道木桶效应,整个木桶的盛水量取决于最低的那块木板。在计算机体系结构中也是这样的。

CPU具有非常快的计算速度,而外部设备的速度太慢了。如果CPU直接与外部设备交互,则CPU在需要获取或输出设备时均要等待外部设备,整机效率取决于外部设备的处理速度

在这里插入图片描述
如果我们让外部设备与存储器直接交互,让CPU与存储器直接交互。在CPU进行计算时,存储器可以与多个输入设备交互,当CPU需要数据时,直接从内存中获取即可;如果CPU需要写入数据,则将数据给存储器,再由存储器与输出设备交互即可。这样一来,整机的效率就取决于存储器的处理速度。大大提高了计算机的处理效率。

因此,我们可以得出如下结论:↓↓↓

  1. CPU读取数据(数据+代码),都是从内存中读取。站在数据的角度,CPU不和外设直接交互
  2. CPU要处理数据,需要将外设中的数据加载到内存。站在数据的角度,外设直接只和内存打交道

★ps:在冯诺依曼体系结构中,当某个进程需要访问外设时,CPU并不会一直等待外设,而是使用中断的方式将其从CPU上换下来,由其他进程执行。该程序到对应外设上等待外设处理完成后,再向CPU的控制器发送中断信号,表明自己已经处理完成,可以回到CPU上运行。再由控制器来相应的信号、外部事件等。

★ps:计算机中的寄存器的存取效率比磁盘等存储设备速度快,为什么不将整机的存储设备均换成寄存器材质呢?
一方面,寄存器、内存设备掉电易失(没电就没办法存储数据),而磁盘、磁带等设备为磁性存储介质,可以在没电的情况下继续保存出局;另一方面,寄存器、内存价格昂贵,我们当前的计算机普遍是8G左右内存,计算机的价格就已经较为昂贵了,如果计算机将几百G的磁盘换成内存,则一台计算机的价格将比现在的计算机贵上百倍。

★ps:什么叫做IO?从外部设备将数据拷贝到内存就是Input,从内存将数据拷贝到外部设备就是Output,这就是IO。

★ps:为什么程序要运行,必须先将程序加载到内存?这其实就是冯诺依曼体系结构决定的。硬件设备为了提高整机效率,规定了CPU只能从内存读取数据及指令。因此,软件执行必须遵守硬件规定,必须将待执行程序加载到内存。

【举例说明】如果在厦门,要给远在哈尔滨的朋友发送一条消息。

此时我需要使用使用键盘(外部设备)打字,键盘数据被写入存储器中;CPU从存储器中获取键盘数据,确定要怎么传输之后,将CPU处理后的数据放到存储器中;再由存储器将该数据传给网卡;我的网卡与对方的网卡交互之后,对方网卡将获取的数据写入存储器;对方存储器再将数据传给CPU,CPU对传来的数据进行解码等操作,再将解码后的数据存入存储器;由存储器负责将数据传给显示器进行显示。
在这里插入图片描述

★关于冯诺依曼体系结构需要强调以下几点:

  1. 这里的存储器指的就是内存,不考虑缓存的情况
  2. 这里的CPU能且只能对内存进行读写,不能访问外设(输入、输出设备)
  3. 外设(输入、输出设备)要输入或输出数据,只能写入内存或从内存中读取
  4. 在冯诺依曼体系中,所有设备只能和内存打交道(以存储器为中心)

操作系统

如何理解管理

例子1:学校管理
大学里校长是怎么管理成千上午的学生的呢?我们知道,大学里面有辅导员、班长。他们协助校长管理学生,校长不直接与学生打交道,而是通过辅导员和班长来管理学生。

管理学生的本质是对学生数据做管理,也就是对学生的学号、姓名、成绩等等信息做管理。因而,我们可以使用一个结构体来定义一个学生类型,再使用顺序表或者链表来组织学生信息。这种思想叫做“先描述,再组织”。当校长发现某个数据有问题时,他并不是直接找到这个学生,而是让辅导员处理这个数据问题。

从这可知,管理者和被管理者可以不执行交互(沟通),拿到被管理者的核心数据(用于进行管理决策)才是最重要的。

在这里插入图片描述
知识点:操作系统如何管理外设
在计算机有个大boss——操作系统,它不直接与外部设备打交道,而是通过驱动程序管理外部设备。操作系统实际管理的就是一组外设的结构体数据的管理(即对数据进行增删查改)。
在这里插入图片描述
例子2:银行提供服务
生活中,我们需要到银行存取钱的时候,都需要到柜台窗口办理业务;再由业务人员与内部金库做交互。为什么不能让用户直接进入金库呢?因为,银行无法甄别哪些人是坏人。为了管理方便,直接拒绝用户进入金库,而提供了柜台这种形式的服务。这种方式不仅能给用户提供服务,还保证了银行的安全。
在这里插入图片描述

知识点:操作系统提供接口式服务
操作系统与银行类似,它既要给用户提供服务,但又担心用户的非法操作。因此,操作系统提供了一个又一个的接口(函数),这样既能给用户提供服务,又能保证操作系统的安全。

★ps:Linux是使用C语言实现的,因此Linux的系统调用本质就是使用C语言实现的函数。

银行的组织结构与操作系统相似。行长借助安保、保洁、技术员等管理了银行里的各项资源;而操作系统借助驱动程序管理计算机上的各项资源(软硬件资源)。为了给用户提供服务,他们都使用了接口式服务,但这种接口式服务对于某些用户来说,仍然使用不便。因而,银行就有了协助老年用户的引导员;而操作系统就有了图形化界面、shell外壳、第三方库来为用户提供便捷的服务。此外,操作系统上,还有各种使用第三方库、系统调用等实现的应用程序(如抖音、淘宝等),为用户提供更加便捷的服务。

在这里插入图片描述

操作系统概念

任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。它给用户提供了一个稳定、安全、简单的执行环境。

笼统的理解,操作系统包括:①内核(进程管理、内存管理、文件管理、驱动管理)②其他程序(例如:库函数、shell程序等)

在整个计算机软硬件架构中,操作系统的定位是:一款纯正的“搞管理”的软件

设计操作系统目的

  1. 与硬件交互,管理所有的软硬件资源
  2. 为用户程序(应用程序)提供一个良好的执行环境

下图是操作系统在整个计算机体系中起着承上启下的作用。操作系统对下通过驱动程序管理各种硬件;对上为用户提供各种系统接口,对各个软件进行管理。
在这里插入图片描述
★ps:计算机管理硬件:①描述起来,用struct结构体 ②组织起来,用链表或其他高效的数据结构

系统调用和库函数概念

在开发角度,操作系统对外会表现为一个整体,但是会暴露自己的部分接口,供上层开发使用,这部分由操作系统提供的接口,叫做系统调用

系统调用在使用上,功能比较基础,对用户的要求相对也比较高,所以,有心的开发者可以对部分系统调用进行适度封装,从而形成库,有了库,就很有利于更上层用户或者开发者进行二次开发

进程

其实,我们启动一个软件本质就是启动一个进程。在Linux系统上,运行一条命令,如"ls -al",其实就是在系统层面创建了一个进程。因而我们可以得到如下概念↓↓↓

基本概念

●课本概念:程序的一个执行实例,正在执行的程序等。
●内核观点:担当分配系统资源(CPU时间、内存)的实体。

Linux是可以同时加载多个程序的,也就是说,Linux是可以在系统中同时存在大量的进程的。那么,Linux系统就必须对这些进程进行管理。Linux系统是如何管理大量的进程的呢?答案是:先描述,再组织

对于进程来说,它包含各种属性数据,因此需要一个结构来存储它,即PCB(进程控制块)

计算机中存在大量的可执行文件,我们双击可执行文件后,本质是将可执行文件从磁盘加载到内存中,该可执行文件中包含了程序的代码和数据。但操作系统中有大量运行的程序,为了管理好这些程序,需要使用PCB结构体将各个运行的程序(进程)的属性数据进行保存。这样操作系统才知道该进程已经运行到哪一行,是否已经执行结束等。

★ps:在操作系统中,会维护一个运行队列run_queue,该队列上链接着等待CPU资源的进程的PCB。当CPU空闲时,则会从run_queue中选择一个进程到CPU中执行,这就是进程调度。
在这里插入图片描述
由此,我们可以知道:进程=对应的代码和数据+进程对应的PCB结构体

描述进程-PCB

●进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。
●课本上将其称之为PCB,Linux操作系统下的PCB就是task_struct。

在Linux中描述进程的结构体叫做task_struct。task_struct是Linux内核的一种数据结构,它会被装载到内存里并且包含着进程的信息。下表是对task_struct中存储内容的分类↓↓↓

存储项概述具体描述
标识符描述进程的唯一标识符,用来区别其他进程
状态任务状态、退出代码、退出信号等
优先级相对于其他进程的优先级
程序计数器程序中即将被执行的下一条指令的地址
内存指针包括程序代码和进程相关数据的指针,还有和其他程序共享的内存块的指针
上下文数据进程执行时处理器的寄存器中的数据
I/O状态信息包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表
记账信息可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等
其他信息——

针对于上表中的上下文数据,这里给出一个生活示例进行说明:

大学生参军复学例子
大学里有不少同学会选择参军,如果小明他大二上学期打算参军。此时他可以直接去参军,不和学校内的学生信息管理机构上报吗?如果小明他直接参军,而没有在校报备,等他1年后回来,由于他全科挂科、旷课,被开除了,他就需要从大一重新开始读。

显然,小明去参军是需要和学校报备的,此时学生信息管理机构会将小明的信息存储起来。小明参完军是不是应该跟学校再报备一次,并将学生信息恢复为正常在读状态呢?那是当然。

这里的上下文就等同于小明的在校的信息(上到大二年级,等同于程序执行到第2行代码),像这种离开时将自己的信息保存封存下来,回来后再将信息恢复,这样的操作称为上下文切换(上下文保存及上下文恢复)。当小明回到学校,继续读大二年纪,而不是从大一重新开始读;就等同于程序回到CPU不是从头运行,而是从上次运行停止处继续向下运行。

组织进程

进程结构可以在内核代码中找到它,所有运行在Linux操作系统里的进程都以task_struct链表的形式存储在内核内。

查看进程

进程的信息可以通过/proc系统文件夹查看。我们通过"ls"命令,可以看到/proc目录下有许多带数字的文件夹,这些数字就是进程id,用于唯一标识一个进程。
在这里插入图片描述
如要获取id为26126的进程信息,我们只需要进入名为26126的目录中查看即可。使用"ls -al"查看目录内的详细内容(这些都是该进程的相关信息),其中,cwd是当前进程的工作目录,exe是当前进程对应的可执行文件的存储位置。如果创建了一个新的进程,则会在/etc目录下创建一个名称与该进程pid相同的目录,目录中保存该进程的相关属性、数据及代码;若终止该进程,则对应的目录会被操作系统自动删除。
在这里插入图片描述
还可以使用top命令查看进程的相关信息,其中PID就是进程号(进程id)。
在这里插入图片描述
除了上述两种方法,我们还可以使用ps命令配合选项查看进程的相关信息。↓↓↓
在这里插入图片描述
示例演示
下面我们编写如下代码,并将它编译运行(可执行文件名为test)。

#include <stdio.h>
#include <unistd.h>

int main()
{
	while(1)
	{
		sleep(1);
	}
	return 0;
}

执行./test程序后,我们再执行ps axj | head - 1 && ps axj | grep test,可以查看到执行该程序的进程信息↓↓↓
在这里插入图片描述
★ps:如果想终止当前在执行的程序,可以使用ctrl+C,或使用kill -9 [进程id]来结束对应程序。

通过系统调用获取进程标识符

我们可以调用getpid获取当前进程的标识符(进程id),调用getppid获取当前进程的父进程的标识符(父进程id)。在使用该接口时,需要包含sys/types和unistd两个头文件。
在这里插入图片描述
下面代码为getpid及getppid的使用示例,运行结果在代码下方↓↓↓

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

int main()
{
	while(1)
	{
		printf("my pid is %d\n", getpid());
		printf("my parent's id is %d\n", getppid());
		sleep(1);
	}
	return 0;
}

在这里插入图片描述
我们可以使用ps命令来验证一下上面的pid和ppid是否是当前进程和它的父进程的id↓↓↓
在这里插入图片描述
getpid可以获得当前进程的pid,getppid确实可以获得当前进程的父进程。但当前的父进程是哪个程序呢??我们使用ps -p [进程pid]获取来获取对应pid的进程信息,我们可以发现,该进程的父进程是bash。
在这里插入图片描述
为什么父进程是bash呢?bash就是当前与我们进行交互的命令行,为了防止bash执行时该程序崩溃退出,导致整个命令行无法使用。bash会创建子进程,让该子进程执行该程序,即使子进程崩溃退出,也不会影响bash。

通过系统调用创建进程

可以使用fork创建进程。如果创建进程成功,则会给父进程返回子进程id,给子进程返回0;如果创建失败,则会给父进程返回-1。
在这里插入图片描述
下面代码演示了如何创建子进程(程序执行结果如代码下方图片所示)↓↓↓

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

int main()
{
	pid_t id = fork();
	if(id < 0)//创建子进程失败
	{
		perror("fork");
		exit(1);
	}
	else if(id == 0)//子进程执行
	{
		printf("I am child process, my pid is %d, my ppid is %d\n", getpid(), getppid());
		exit(0);
	}
	else//父进程执行
	{
		printf("I am parent process, my pid is %d\n", getpid());
	}
	return 0;
}

在这里插入图片描述
父、子进程是代码共享的,但由于fork之后,父子进程获得id值不同,因此子进程执行id == 0的分支,而父进程执行的是else分支。

创建子进程本质上,操作系统上就多了一个新的进程,因此操作系统需要给子进程分配一个PCB结构体,并给它一个唯一的p进程id。

★ps:为什么给子进程返回0,给父进程返回子进程的pid?父进程:子进程=1:n,父进程有多个子进程,为了方便子进程管理、标识指定的子进程,需要让fork给父进程返回子进程的pid,当父进程能区分不同的子进程。

🎈欢迎进入从浅学到熟知Linux专栏,查看更多文章。
如果上述内容有任何问题,欢迎在下方留言区指正b( ̄▽ ̄)d

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/535057.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

探索设计模式的魅力:MVVM模式在AI大模型领域的创新应用-打破传统,迎接智能未来

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 MVVM模式在AI大模型领域的创新应用-打破传统迎接智能未来 &#x1f680; “在人工智能的领域里&a…

炒股自动化:交易接口API才是重点,券商官方散户可用的接口

上一篇我们用get_full_tick取到了数据&#xff0c;也讲了变量和字典的基本概念&#xff0c;这次我们向交易所发送订单试试。前面文章的链接放在文末了&#xff0c;需要的可以看一下 这些内容是给新手看的&#xff0c;找接口的大佬们直接拉到文末即可 取市场数据的方法很多&am…

Python中Python-docx 包的run介绍

先对run做一个简单地介绍。每个paragraph对象都包含一个run对象的列表。举例&#xff1a; 这是一个简短的段落。 from docx import Document doc Document("1.docx") #上面这段话保存在1.docx中 print("这一段的run个数是&#xff1a;",len(doc.paragr…

国家统计局行政区划获取及入库ES实践

我们先看下最终效果&#xff1a; 1. ES索引新建 PUT administrative_division {"mappings": {"properties": {"province": {"type": "keyword"},"province_code": {"type": "keyword"},&q…

HarmonyOS 开发-阻塞事件冒泡

介绍 本示例主要介绍在点击事件中&#xff0c;子组件enabled属性设置为false的时候&#xff0c;如何解决点击子组件模块区域会触发父组件的点击事件问题&#xff1b;以及触摸事件中当子组件触发触摸事件的时候&#xff0c;父组件如果设置触摸事件的话&#xff0c;如何解决父组…

最近一些前端面试问题整理

最近一些前端面试问题整理 4月8号1. TS 中的 类型别名 和接口的区别是什么&#xff1f;2. 什么是深拷贝和浅拷贝&#xff1f;深浅拷贝的方法有哪些&#xff1f;浅拷贝&#xff08;Shallow Copy&#xff09;深拷贝&#xff08;Deep Copy&#xff09;区别总结 3. 使用 JSON.strin…

wsl 2在windows11上的设置

详细参考&#xff1a;Manual installation steps for older versions of WSL | Microsoft Learn 1.系统组件要打开 分别是&#xff1a;Hyper-V、虚拟机平台、适用于Windows的Linux子系统 2.以管理员方式运行命令行&#xff0c;逐步执行下面的命令 update to WSL 2, you must…

【MATLAB源码-第185期】基于matlab的16QAM系统相位偏移估计EOS算法仿真,对比补偿前后的星座图误码率。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 1. 引言 M-QAM调制技术的重要性 现代通信系统追求的是更高的数据传输速率和更有效的频谱利用率。M-QAM调制技术&#xff0c;作为一种高效的调制方案&#xff0c;能够通过在相同的带宽条件下传输更多的数据位来满足这一需求…

数组去重的方法

1.方法一&#xff1a;利用对象属性名的唯一性 去重 数字或者数组去重&#xff0c;效率高 function unique(arr){var result {}; //利用对象属性名的唯一性来保证不重复for(var i0;i<arr.length;i){console.log("result[arr[i]]",result[arr[i]]);if(!result[arr…

4月9号总结

java学习 一.steam流 1.介绍 Stream 是 Java 8 中引入的一种处理集合数据的新抽象。它提供了一种高效且便利的方式来处理集合中的元素&#xff0c;支持函数式编程的特性&#xff0c;使得集合操作变得更加简洁和灵活。 2.创建 List和Set可以直接调用接口的steam方法转换为流 …

FreeRTOS学习 -- 移植

一、添加FreeRTOS源码 在基础工程中新建一个名为FreeRTOS的文件夹&#xff0c;创建FreeRTOS文件夹以后将FreeRTOS的源码添加到这个文件夹中。 portable 文件夹&#xff0c;只需要保留keil、MemMang 和 RVDS这三个文件夹&#xff0c;其他的都可以删除掉。 移植FreeRTOSConfig…

2024 年“认证杯”数学中国数学建模网络挑战赛

题目 A题 保暖纤维的保暖能力 冬装最重要的作用是保暖&#xff0c;也就是阻挡温暖的人体与寒冷环境之间的热 量传递。人们在不同款式的棉衣中会填充保暖材料&#xff0c;从古已有之的棉花、羽绒 到近年来各种各样的人造纤维。不同的保暖纤维具有不同的保暖性能&#xff0c;比如…

为什么要“挺”鸿蒙?

鸿蒙到底是什么&#xff1f; 随着5G、物联网等技术的快速发展&#xff0c;智能终端设备的应用场景也越来越广泛。为了满足不同设备间的互联互通需求&#xff0c;华为在2019年推出了自主研发的操作系统——鸿蒙OS。值得关注的是&#xff0c;这也是首款国产操作系统。 要了解鸿…

Java中实现监听UDP协议的指定端口并收到数据按照十六进制输出

场景 对接协议中需要监听UDP协议的指定端口并监听数据&#xff0c;且数据格式为十六进制。 如果是在linux服务上&#xff0c;可以快速通过C或者python脚本等方式实现。 这里使用Java代码实现&#xff0c;可便于后续做其他存储数据等的扩展&#xff0c;且只需要在服务器上安装…

Java - 算术运算符与算术表达式

今天我们要讲解的是算术运算符和算术表达式。在编程中&#xff0c;我们经常需要进行各种数学计算&#xff0c;而算术运算符和算术表达式则是我们实现这些计算的基础工具。 首先&#xff0c;我们先来了解一下什么是算术运算符。算术运算符是用来进行数学运算的符号&#xff0c;…

【信号与系统 - 6】周期信号的傅里叶变换

1 方法一&#xff1a;对傅里叶级数展开式 F T 变换 FT变换 FT变换 由于周期信号进行傅里叶变换不满足标准定义式 F ( j w ) ∫ − ∞ ∞ e − j w t f ( t ) d t F(jw)\int^{\infty}_{-\infty}e^{-jwt}f(t)dt F(jw)∫−∞∞​e−jwtf(t)dt 使用的条件&#xff1a;需要绝对…

【智能算法应用】灰狼算法求解TSP问题

目录 1.算法原理2.TSP数学模型3.结果展示4.参考文献 1.算法原理 【智能算法】灰狼算法&#xff08;GWO&#xff09;原理及实现 2.TSP数学模型 旅行商问题&#xff08;TSP&#xff09;是一种著名的组合优化问题&#xff0c;它涉及寻找给定一组城市及其之间的距离或成本&#…

独家原创 | Matlab实现INFO-BiTCN-BiGRU-Attention多输入单输出回归预测

独家原创 | Matlab实现INFO-BiTCN-BiGRU-Attention多输入单输出回归预测 目录 独家原创 | Matlab实现INFO-BiTCN-BiGRU-Attention多输入单输出回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现INFO-BiTCN-BiGRU-Attention向量加权算法优化双向时间卷积…

springboot在使用 Servlet API中提供的javax.servlet.Filter 过滤器 对请求参数 和 响应参数 进行获取并记录日志方案

不多说 直接上代码 第一步 package com.xxx.init.webFilter;import com.alibaba.fastjson.JSONObject; import com.xxx.api.constant.CommonConstant; import com.xxx.api.entities.log.OperationLog; import com.xxx.init.utils.JwtHelper; import com.xxx.init.utils.Reques…

9.vector的使用介绍和模拟实现

1.vector的介绍及使用 1.1 vector的介绍 vector的文档介绍 vector是表示可变大小数组的序列容器。 就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问&#xff0c;和数组一样高效。但是又不像数组&#xff0c…