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

news2024/11/19 18:46:20

在这里插入图片描述

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

文章目录

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


冯诺依曼体系结构

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

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

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

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

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

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

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

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

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

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

操作系统

如何理解管理

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

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

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

操作系统概念

任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。

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

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

设计操作系统目的

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

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

系统调用和库函数概念

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

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

进程

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

基本概念

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

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

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

描述进程-PCB

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

在Linux中描述进程的结构体叫做task_struct。stask_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是当前进程对应的可执行文件的存储位置。
在这里插入图片描述
还可以使用top命令查看进程的相关信息,其中PID就是进程号(进程id)。
在这里插入图片描述
除了上述两种方法,我们还可以使用ps命令配合选项查看进程的相关信息。
在这里插入图片描述
示例演示
下面我们编写如下代码,并将它编译运行(可执行文件名为test)。

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

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

我们执行ps axj | head - 1 && ps axj | grep test,可以查看到执行该程序的进程信息↓↓↓
在这里插入图片描述

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

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

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

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

在这里插入图片描述

通过系统调用创建进程

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

#include <stdio.h>
#include <stdlib.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;
}

在这里插入图片描述

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DashOJ-8.奇偶统计

题目链接&#xff1a; 题目详情 - 奇偶统计 - DashOJ 思路&#xff1a; &#xff08;while循环加if分支语句&#xff09; 巧用死循环 while(1) 然后在里面第一句就判断输入的数字是否等于0 if(x0) &#xff0c;如果 等于0就直接break跳出循环 或者用 while(cin>>x) 代…

红黑树内部结点数量分析

红黑树内部结点数量分析 一、红黑树的性质二、黑高与内部结点数量2.1最大内部结点数量2.2最小内部结点数量 三、伪代码实现四、C语言代码实现五、结论 红黑树是一种自平衡的二叉搜索树&#xff0c;它通过一系列复杂的性质和操作来维持平衡&#xff0c;从而确保各种动态集合操作…

Docker 容器编排技术解析与实践

探索了容器编排技术的核心概念、工具和高级应用&#xff0c;包括 Docker Compose、Kubernetes 等主要平台及其高级功能如网络和存储管理、监控、安全等。此外&#xff0c;文章还探讨了这些技术在实际应用中的案例&#xff0c;提供了对未来趋势的洞见。 一、容器编排介绍 容器编…

用 Wireshark 解码 H.264

H264&#xff0c;你不知道的小技巧-腾讯云开发者社区-腾讯云 这篇文章写的非常好 这里仅做几点补充 init.lua内容&#xff1a; -- Set enable_lua to false to disable Lua support. enable_lua trueif not enable_lua thenreturn end-- If false and Wireshark was start…

日期专题:做题笔记 (时间显示/星期计算/星系炸弹/第几天/纪念日)

目录 时间显示 代码 星期计算 代码 星系炸弹 代码 第几天 纪念日 代码 时间显示 时间显示 这道题主要是单位换算。 ①单位换算 ②输出格式&#xff1a; a. 不足两位补前导零。利用printf输出 b. 注意 long long 输出格式应该是 %lld 长整型 代码 #include <…

解码零跑汽车2023年报:营收增速大幅滑坡,净亏42亿,如何讲故事

在2023年的新势力车企中&#xff0c;有这么一家低调崛起的品牌&#xff0c;并没有像蔚小理那样高调&#xff0c;但去年全年销量却反超小鹏汽车&#xff0c;晋升成为新势力车企中的销量第三名&#xff0c;它就是第四家登陆港交所上市的新势力品牌—零跑汽车。 不过&#xff0c;…

阿里云短信服务业务

一、了解阿里云用户权限操作 1.注册账号、实名认证&#xff1b; 2.使用AccessKey 步骤一 点击头像&#xff0c;权限安全的AccessKey 步骤二 设置子用户AccessKey 步骤三 添加用户组和用户 步骤四 添加用户组记得绑定短信服务权限 步骤五 添加用户记得勾选openApi访问 添加…

Coursera自然语言处理专项课程04:Natural Language Processing with Attention Models笔记 Week01

Natural Language Processing with Attention Models Course Certificate 本文是学习这门课 Natural Language Processing with Attention Models的学习笔记&#xff0c;如有侵权&#xff0c;请联系删除。 文章目录 Natural Language Processing with Attention ModelsWeek 01…

LeetCode每日一题之专题一:双指针 ——快乐数

快乐数OJ链接&#xff1a;202. 快乐数 - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 题目分析: 为了房便叙述&#xff0c;将「对于⼀个正整数&#xff0c;每⼀次将该数替换为它每个位置上的数字的平方和」这⼀个 操作记为 x 操作&#xff1b; 题目告诉我们&#…

没用的cpp知识又增加了之--cpp11利用宏、模板以及lambda表达式实现python like的装饰器语义

等有时间了我再bb吧&#xff0c;先直接上码 msvc 2015 编译执行效果 用法 style1 int CCar::oilfeed(int degress) DECORATED(logging<int>, ARGS(__FUNCTION__), DECORATED(checkRotateSpeed<int>, ARGS(this, __FUNCTION__), {m_n_rotat_speed degress;retur…

华为云1核2G免费使用一年

个人用户专享云服务器、云数据库产品每天上午9:30开抢&#xff0c;其他产品每天0点开放领取&#xff0c;企业用户所有产品每天0点开放领取&#xff1b; 云产品体验名额有限&#xff0c;领完即止。详情&#xff1a;https://www.vpspick.com/vps/591.html 通用入门型 T6 云服务…

数码管与译码器

目录 数码管 显示的基本原理 LED数码管的显示方式 静态显示方式 动态显示方式 具体案例 数码管静态显示 电路图 keil文件 数码管动态显示 电路图 keil文件 74LS138译码器 简介 译码表 译码器案例 电路图 keil文件 74HC595译码器 前言 举例解释 简单案例 …

手写防抖节流、手写深拷贝、事件总线

一、防抖 手写防抖--基本实现&#xff08;面试&#xff09; 手写防抖并且绑定this和event 添加取消功能 添加立即执行状态&#xff0c;默认不立即执行 underscore库介绍&#xff0c;lodash更轻量级 二、节流 用underscore库&#xff0c;调用throttle函数 手写基础版节流-&#…

《价值》-张磊-高瓴资本-4(上)-价值投资需要研究驱动,而非拍脑袋

第四章 价值投资方法与哲学&#xff08;上&#xff09; 在我的书架上&#xff0c;有一套书最为醒目&#xff0c;我总会在不经意间打开翻看&#xff0c;那就是由本杰明 格雷厄姆&#xff08;Benjamin Graham &#xff09;与戴维 多德&#xff08;David Dodd &#xff09;在 19…

【HTML】制作一个简单的三角形动态图形

目录 前言 开始 HTML部分 CSS部分 效果图 总结 前言 无需多言&#xff0c;本文将详细介绍一段HTML和CSS代码&#xff0c;具体内容如下&#xff1a; 开始 首先新建文件夹&#xff0c;创建两个文本文档&#xff0c;其中HTML的文件名改为[index.html]&#xff0c;CSS的文件名…

实用技巧:如何取消app的截屏禁用

因为我想要在小鹅通App做笔记,但是被小鹅通App禁用截屏了,这真是一个很糟糕的使用体验,虽然可能是为了保护商家权益…… 方法1 可以让商家设置课程可以截屏 方法2 手机root,安装Xposed框架,利用Xposed框架上面的插件我们可以对手机进行高度定制化,而安装Xposed框架的…

微信小程序 电影院售票选座票务系统5w7l6

uni-app框架&#xff1a;使用Vue.js开发跨平台应用的前端框架&#xff0c;编写一套代码&#xff0c;可编译到Android、小程序等平台。 框架支持:springboot/Ssm/thinkphp/django/flask/express均支持 前端开发:vue.js 可选语言&#xff1a;pythonjavanode.jsphp均支持 运行软件…

4.5 day4 FreeRTOS

1.总结二进制信号量和计数型信号量的区别&#xff0c;以及他们的使用场景。 二进制信号量的数值只有0和1&#xff0c;用于共享资源的访问 计数型信号量的值一般是大于或者等于2&#xff0c;用于生产者和消费者模型 2.使用技术型信号量完成生产者和消费者模型实验。 3.总结Free…

基于单片机的炉温自动控制系统设计

**单片机设计介绍&#xff0c;基于单片机的炉温自动控制系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的炉温自动控制系统设计是一个综合性的项目&#xff0c;它结合了单片机技术、温度传感技术、控制算法以…

Redis从入门到精通(五)Redis实战(二)商户查询缓存

↑↑↑请在文章头部下载测试项目原代码↑↑↑ 文章目录 前言4.2 商户查询缓存4.2.1 缓存介绍4.2.2 查询商户信息的传统做法4.2.2.1 接口文档4.2.2.2 代码实现4.2.2.3 功能测试 4.2.3 查询商户信息添加Redis缓存4.2.3.1 逻辑分析4.2.3.2 代码实现4.2.3.3 功能测试 4.2.3 数据一致…