【Linux】冯诺依曼体系结构与操作系统及其进程

> 作者简介:დ旧言~,目前大二,现在学习Java,c,c++,Python等
> 座右铭:松树千年终是朽,槿花一日自为荣。

> 目标:了解冯诺依曼体系结构与操作系统,掌握Linux的进程

> 毒鸡汤:一花凋零荒芜不了整个春天,一次挫折也荒废不了整个人生。

> 望小伙伴们点赞👍收藏✨加关注哟💕💕 

🌟前言

        我们最初学习Linux指令已经可以用户与操作系统交互了,往后面我们用Xshell可以编写一些简单的代码,这些只能算是入门,咱们学习Linux可不是这些,如果只学习这些的话,那在C语言中这些我们已经掌握的比较熟练了😏😏。学习Linux掌握的是各种代码底层是如何运行和使用的。

⭐主体

我们从以下学习冯诺依曼体系结构与操作系统及其进程🤗🤗。

🌙冯诺依曼体系结构

        冯·诺依曼结构也称普林斯顿结构,是一种将程序指令存储器和数据存储器合并在一起的存储器结构。程序指令存储地址和数据存储地址指向同一个存储器的不同物理位置,因此程序指令和数据的宽度相同,如英特尔公司的8086中央处理器的程序指令和数据都是16位宽。

        数学家冯·诺依曼提出了计算机制造的三个基本原则,即采用二进制逻辑、程序存储执行以及计算机由五个部分组成(运算器、控制器、存储器、输入设备、输出设备),这套理论被称为冯·诺依曼体系结构。

截至目前,我们所认识的计算机,都是有一个个的硬件组件组成:

  • 输入单元:包括键盘, 鼠标,扫描仪, 写板等
  • 中央处理器(CPU):含有运算器和控制器等
  • 输出单元:显示器,打印机等

关于冯诺依曼,必须强调几点:

  • 这里的存储器指的是内存
  • 不考虑缓存情况,这里的CPU能且只能对内存进行读写,不能访问外设(输入或输出设备)
  • 外设(输入或输出设备)要输入或者输出数据,也只能写入内存或者从内存中读取。
  • 一句话,所有设备都只能直接和内存打交道。

这里说的光用文字是很难理解冯诺依曼体系结构的,大家可搜说相关图片用图来了解冯诺依曼体系结构。

🌙操作系统原理

什么是操作系统:

  • 操作系统(英语:Operating System,缩写:OS)是一组主管并控制计算机操作、运用和运行硬件、软件资源和提供公共服务来组织用户交互的相互关联的系统软件程序。 根据运行的环境,操作系统可以分为桌面操作系统,手机操作系统,服务器操作系统,嵌入式操作系统等。

为什么要有操作系统:

  • 手段:对下管理好软硬件资源。
  • 目的:对上提供一个良好的运行环境-->(为用户提供稳定的、高效的、安全的、的执行环境)

用图解释操作系统:

操作系统本质对数据做管理,而管理的模用一句话来概括:先描述,在组织。

总结:
计算机管理硬件

  1. 描述起来,用struct结构体
  2. 组织起来,用链表或其他高效的数据结构

🌙系统调用和库函数

系统调用和库函数概念描述:

  • 在开发角度,操作系统对外会表现为一个整体,但是会暴露自己的部分接口,供上层开发使用,这部分由操作系统提供的接口,叫做系统调用。
  • 系统调用在使用上,功能比较基础,对用户的要求相对也比较高,所以,有心的开发者可以对部分系统调用进行适度封装,从而形成库,有了库,就很有利于更上层用户或者开发者进行二次开发。

那在还没有学习进程之前,就问大家,操作系统是怎么管理进行进程管理的呢?很简单,先把进程描述起来,再把进程组织起来!

🌙进程

💫概念描述

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

💫描述进程-PCB

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

task_struct-PCB的一种,在Linux中描述进程的结构体叫做task_struct。task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息 。

  • task_ struct内容分类
  1. 标示符: 描述本进程的唯一标示符,用来区别其他进程。
  2. 状态: 任务状态,退出代码,退出信号等。
  3. 优先级: 相对于其他进程的优先级。
  4. 程序计数器: 程序中即将被执行的下一条指令的地址。
  5. 内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
  6. 上下文数据: 进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]。
  7. I/O状态信息: 包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
  8. 记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
  9. 其他信息

💫查看进程

说实话,文字干巴巴,想必大家看困了,这里我们简单模拟一下进程,看看进程到底是个啥吧🥱
首先先创建文件:
  • Makefile:

  • myproc.c:

运行结果:
查看进程:

使用 ps ajx (a:所有,j:任务,x:把所有的信息全部输出)

一般搭配管道进行使用,如:ps ajx | head -1 && ps ajx | grep test,其中 ps ajx | head -1 是把 ps ajx 输出的信息中的第一行信息(属性列)输出。

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

我们可以用以下查看当前目录下的进程:ls /proc/

那我们如何查看我们的进程???

  • 进程idPID)--->getpid()
  • 父进程idPPID)--->getppid()

运行结果:

ps ajx | head -1 && ps ajx | grep "mypro" //查看自己的进程

💫通过系统调用创建进程-fork初识

再次修改我们的myproc.c文件

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{int ret = fork();if(ret < 0){perror("fork");return 1;}else if(ret == 0){ //childprintf("I am child : %d!, ret: %d\n", getpid(), ret);}else{ //fatherprintf("I am father : %d!, ret: %d\n", getpid(), ret);}sleep(1);return 0;
}

运行结果:

用下面指令搜索自己的进程:ps axj | grep 1889

那我们如何查看子进程和父进程交替呢???
  • 我们再次修改myproc.c
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>int main()
{printf("before fork: I am a prcess, pid: %d, ppid: %d\n", getpid(), getppid());sleep(5);printf("开始创建进程啦!\n");sleep(1);pid_t id = fork();if(id < 0) return 1;else if(id == 0){// 子进程while(1){printf("after fork, 我是子进程: I am a prcess, pid: %d, ppid: %d, return id: %d\n", getpid(), getppid(), id);sleep(1);}}else{// 父进程while(1){printf("after fork, 我是父进程: I am a prcess, pid: %d, ppid: %d, return id: %d\n", getpid(), getppid(), id);sleep(1);}}sleep(2);return 0;
}
  • 运行结果:

        fork()之后,会有父进程+子进程两个进程在执行后续代码,fork()后续的代码,被父子进程共享,通过返回值不同,让父子进程执行共享代码的一部分,这就是并发式编程。

 🌟结束语

       今天内容就到这里啦,时间过得很快,大家沉下心来好好学习,会有一定的收获的,大家多多坚持,嘻嘻,成功路上注定孤独,因为坚持的人不多。那请大家举起自己的小手给博主一键三连,有你们的支持是我最大的动力💞💞💞,回见。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis基础数据结构详解

大家好&#xff0c;我是伯约&#xff0c;希望这篇对大家有帮助&#xff0c;文章末尾放了我从小白到架构师多年的学习资料 1.String字符串 String是redis中最基本的数据类型&#xff0c;一个key对应一个value。 String类型是二进制安全的&#xff0c;意思是 redis 的 string 可以…

P40 Transformer

概述 语法剖析 一个样本有多个类别归属 机器自己决定输出几个东西&#xff0c;输出的长度为多少 seq2seq实现过程 addnorm 代表 residual noorm resudial: inputoutput &#xff1f;&#xff1f;&#xff1f; Decoder AT 语音或者语句起始的地方&#xff0c;会有一个 sp…

龙迅LT6211B,HDMI1.4转LVDS,应用于AR/VR市场

产品描述 LT6211B 是一款用于 VR/ 显示应用的高性能 HDMI1.4 至 LVDS 芯片。 对于 LVDS 输出&#xff0c;LT6211B 可配置为单端口、双端口或四端口。对于2D视频流&#xff0c;同一视频流可以映射到两个单独的面板&#xff0c;对于3D视频格式&#xff0c;左侧数据可以发送到一个…

nethuner无法ping无法apt

ping无法使用&#xff0c;会提示Socket: Permission denied&#xff0c;在解析的过程中会提示Temporary failure in name resolution. usermod -G 3003 root usermod -G 3003 kali接着 vim /etc/passwd下滑 找到 _apt 然后将_apt 的3004修改为3003 点击esc 输入 :wq 退出编辑模…

定制 Electron 窗口标题栏

Electron 是一款流行的桌面应用开发框架&#xff0c;基于 Web 技术构建&#xff0c;提供了强大的跨平台能力。在开发过程中&#xff0c;经常需要定制窗口标题栏以创造独特的用户体验。 1. 完全隐藏默认标题栏 有时候&#xff0c;我们希望创建一个自定义的标题栏&#xff0c;完…

系统详细设计说明书案例(直接套用)

系统详细设计说明书案例&#xff08;直接套用&#xff09; 1.系统总体设计 2.性能设计 3.系统功能模块详细设计 4.数据库设计 5.接口设计 6.系统出错处理设计 7.系统处理规定 软件开发全文档下载&#xff1a;软件开发全套资料-CSDN博客

变量覆盖-doumi靶场搭建

变量覆盖-doumi 一、靶场搭建 1.下载doumi压缩包 2.解压后放入小皮面板 3.将版本改为5.3.29 4.登录网站 返现数据库连接失败 5.输入/install 发现没有权限访问 6.打开根目录 去掉后为 7.再次访问 已经进去了 8.勾选已经阅读&#xff0c;然后点击下一步 9.下一步 10.输入数…

Docker单点部署[8.11.3] Elasticsearch + Kibana + ik分词器

文章目录 一、Elasticsearch二、Kibana三、访问四、其他五、ik分词器第一种&#xff1a;在线安装第二种&#xff1a;离线安装 Elasticsearch 和 Kibana 版本一般需要保持一致才能一起使用&#xff0c;但是从 8.x.x开始&#xff0c;安全验证不断加强&#xff0c;甚至8.x.x之间…

智能优化算法应用:基于世界杯算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于世界杯算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于世界杯算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.世界杯算法4.实验参数设定5.算法结果6.参考文…

element组件库的日期选择器如何限制?

本次项目中涉及到根据日期查找出来的数据进行调整,所以修改的数据必须是查找范围内的数据.需要对调整数据的日期进行限制,效果如下: 首先我们使用了element 组件库的日期选择器,其中灌完介绍, picker-options中函数disabledDate可以设置禁用状态,代码如下: <el-date-pickerv…

SD-WAN网络的可扩展性解析

SD-WAN组网以其卓越的可扩展性而脱颖而出&#xff0c;为企业提供了一个灵活适应不断扩张和增长需求的网络解决方案。SD-WAN组网通过轻松实现规模调整、拓扑变更以及多种接入方式的切换&#xff0c;确保网络的高效性和可管理性。对于正处于快速发展时期的企业而言&#xff0c;SD…

【二分查找】【z型搜索】LeetCode240:搜索二维矩阵

LeetCoe240搜索矩阵 作者推荐 【贪心算法】【中位贪心】.执行操作使频率分数最大 本文涉及的基础知识点 二分查找算法合集 题目 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。 每列的…