Linux的学习之路:9、冯诺依曼与进程(1)

摘要

本章主要是说一下冯诺依曼体系结构和进程的一部分东西。

目录

摘要

一、冯诺依曼体系结构

二、操作系统的概念

三、设计OS的目的

四、管理

五、进程的基本概念

六、PCB

七、在Linux环境下查看进程

八、使用代码创建进程

 九、思维导图


一、冯诺依曼体系结构

如下方图片所示黑色箭头是控制信号,红色是数据信号,冯·诺依曼体系结构,也称为普林斯顿结构,是现代计算机发展的基本结构形式,由数学家冯·诺依曼提出。它奠定了现代电子计算机的基本结构,规定了五大组成部件:运算器、控制器、存储器、输入设备和输出设备,并规定了以二进制形式表示数据和指令。

冯·诺依曼体系结构的主要特点包括:

1、单处理机结构:计算机以运算器为中心,运算器、控制器等部件都通过运算器进行数据的加工处理。

2、存储程序思想:将程序指令和数据存储在同一存储器中,CPU从存储器中取出指令和数据进行相应的计算。程序指令存储地址和数据存储地址指向同一个存储器的不同物理位置,因此程序指令和数据的宽度相同。

3、指令和数据以二进制形式表示:这种表示方式使得计算机内部的处理更加统一和高效。

4、指令由操作码和操作数组成:操作码指示计算机执行何种操作,操作数则是操作的对象。

5、指令顺序执行:按照指令在存储器中的排列顺序,逐条取出指令来执行。

二、操作系统的概念

任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。笼统的理解,操作系统包括:内核(进程管理,内存管理,文件管理,驱动管理)和其他程序(例如函数库,shell程序等等)。

怎么举例呢,有点像是一个银行,我门是无法直接去银行的仓库里面自己拿钱,并且银行也只会流出几个窗口让我门进行取钱, 这一步就有点像怕我们去抢钱,这个就是为了保护银行的安全,也就是相当于内核,在冯诺依曼体系结构中,我知道了,我们是不能直接进行访问控制器的,是利用存储器读取我们所输入的数据,从而进行访问,这个在我们访问过程中,是不认识如何访问控制器的,就像有些老爷爷老奶奶去银行存钱的时候就不会。

所以需要一些东西把这个封装起来我们就可以进行访问,这个访问也会变得轻松,这个就是外壳程序,也就是相当于把操作的成本降低,安全性提高,这个就是操作系统,他的结构就像下方图片所示。

三、设计OS的目的

设计操作系统的目的主要是为了更有效地管理和使用计算机硬件和软件资源,提供友好的用户接口,并保护系统的安全和稳定。以下是设计操作系统的几个主要目的:

1、提高资源利用率:操作系统通过合理调度和管理计算机的各种资源(如CPU、内存、硬盘等),确保它们得到高效的利用。它可以根据任务的优先级和系统的负载情况,动态地分配资源,从而避免资源的浪费和冲突。

2、方便用户使用:操作系统提供了一个友好的用户接口,使得用户可以轻松地与计算机进行交互。无论是图形用户界面还是命令行界面,操作系统都致力于简化用户的操作过程,提高用户的工作效率。

3、提供强大的系统功能:操作系统内置了许多系统级的功能,如文件管理、设备驱动、网络通信等。这些功能使得用户可以方便地进行文件操作、设备控制和网络通信,而无需深入了解底层硬件和软件的细节。

4、保证系统安全稳定:操作系统负责保护系统的安全,防止未授权的访问和恶意软件的攻击。它采用了一系列的安全机制和技术手段,如访问控制、加密和防火墙等,确保系统的稳定运行和数据的安全。

5、支持多任务并发执行:操作系统允许多个任务(或进程)同时运行,通过合理的调度和管理,使得这些任务能够并发执行,从而提高系统的吞吐量和响应速度。

6、提供可扩展性和可维护性:操作系统设计时要考虑系统的可扩展性和可维护性,使得系统能够方便地添加新功能或修复漏洞,同时保持系统的稳定性和兼容性。

综上所述,设计操作系统的目的是为了更有效地管理和使用计算机资源,提供友好的用户接口,保证系统的安全稳定,并支持多任务并发执行。这些目的的实现,使得操作系统成为计算机系统中不可或缺的重要组成部分。

四、管理

管理怎么解释呢,就像我们在学校中是基本上见不到校长的,校长需要管理学生,那么每年那么多学生是怎么管理的过来,总不能每年来新生校长都要一个一个进行登记吧,所以只是就出现了院长辅导员等等,一个一个下方进行手机,级别一个比一个高就相当于管理,但是呢几千个学生也没法一个一个看信息,还需要排序啊,把某一部分人放在一起,统计出来,然后这时候我就想起来之前写过的通讯录,当时第一反应就是第一一个结构体,去统计信息,所以这个也是类似,要不信息也是很斑驳的,所以在操作系统这里,也是先描述,在组织。

描述起来,用struct结构体,组织起来,用链表或其他高效的数据结构这样就能进行描述这个管理的过程,总结来说就是六个字先描述在组织。

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

这个就是在描述过后就可以进行组织,怎么进行组织呢,就是封装起来,这个封装就是相当于库,在这个库我之前在学习c和c++就是经常使用。

五、进程的基本概念

进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配的基本单位,也是操作系统结构的基础。它实质上是程序在多道程序系统中的一次执行过程,具有动态性,即动态产生、动态消亡。同时,进程具有并发性,任何进程都可以同其他进程一起并发执行;独立性,作为能独立运行的基本单位,同时也是系统分配资源和调度的独立单位;以及异步性,由于进程间的相互制约,使进程具有执行的间断性。

从理论角度看,进程是对正在运行的程序过程的抽象;从实现角度看,进程是一种数据结构,目的在于清晰地刻画动态系统的内在规律,有效管理和调度进入计算机系统主存储器运行的程序。狭义上,进程可以视为一段程序的执行过程;广义上,进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。

在操作系统中,进程是动态执行的基本单元。它既是基本的分配单元,也是基本的执行单元。根据进程的特点,进程可以被分类为交互进程、批处理进程和守护进程等。交互进程通常是由shell启动的,并可以与用户进行交互操作;批处理进程则负责按照顺序启动其它进程;守护进程是执行特定功能或者执行系统相关任务的后台进程。

总的来说,进程是计算机系统中的核心概念之一,它负责程序的执行和资源的管理,对于计算机系统的稳定性和效率至关重要。

总结一下:进程就等于对应的代码和数据+进程对应的PCB结构体。

六、PCB

这个就是相当于上文中说管理的时候,统计学生信息时创建的结构体就是这个PCB,他的全称是process control block,Linux操作系统下的PCB是: task_struct。

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

task_ struct内容分类如下方代码框中。

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

七、在Linux环境下查看进程

组织进程:可以在内核源代码里找到它。所有运行在系统里的进程都以task_struct链表的形式存在内核里。

查看进程:进程的信息可以通过 /proc 系统文件夹查看,例:要获取PID为1的进程信息,你需要查看 /proc/1 这个文件夹,大多数进程信息同样可以使用top和ps这些用户级工具来获取,如下方截所示,因为代码看不见彩色不好看所以就给看截图了。

ps 用于显示当前系统的进程状态。通过 ps 命令,你可以查看系统中正在运行的进程,以及它们的状态、优先级、所使用的资源等信息,常用的 ps 命令选项有:

e: 显示所有进程。

f: 全格式显示。

l: 长格式显示。

u user: 显示指定用户的所有进程。

x: 显示没有控制终端的进程。

如下方代码就是查看了一下进程和父进程,test.c的代码在代码框里,结果在块里。

[ly@VM-24-9-centos Linux_1]$ vim text.c
[ly@VM-24-9-centos Linux_1]$ gcc -o text text.c
[ly@VM-24-9-centos Linux_1]$ ll
total 16
-rwxrwxr-x 1 ly ly 8464 Apr 13 20:07 text
-rw-rw-r-- 1 ly ly  152 Apr 13 20:07 text.c
[ly@VM-24-9-centos Linux_1]$ ./text
pid: 15074
ppid: 10266
[ly@VM-24-9-centos Linux_1]$  

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{printf("pid: %d\n", getpid());printf("ppid: %d\n", getppid());return 0;
}

八、使用代码创建进程

fork是创建进程的函数,fork有两个返回值,父子进程代码共享,数据各自开辟空间,私有一份(采用写时拷贝),如下方代码他的返回值有两个人,也就是会创建两个进程所以只是一个代码也会打印两次。

[ly@VM-24-9-centos Linux_1]$ ./text
hello proc : 17484!, ret: 17485
hello proc : 17485!, ret: 0
[ly@VM-24-9-centos Linux_1]$ 

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{int ret = fork();    printf("hello proc : %d!, ret: %d\n", getpid(), ret);sleep(1);return 0;
}

 九、思维导图

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

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

相关文章

Linux adduser命令教程:如何添加新用户(附实例详解和注意事项)

Linux adduser命令介绍 adduser是Linux系统中的一个命令行工具&#xff0c;用于创建新的用户。它是useradd这个底层工具的一个更友好的前端。当添加新用户时&#xff0c;它还会在/home目录下创建用户目录。 Linux adduser命令适用的Linux版本 adduser命令在大多数Linux发行版…

5G Frequency Bands 频率分布

连接&#xff1a;https://www.5g-networks.net/5g-technology/5g-frequency-bands/

每日一题:两数之和

给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返回…

uniapp:uview-plus的一些记录

customStyle 并不是所有的组件都有customStyle属性来设置自定义属性&#xff0c;有的还是需要通过::v-deep来修改内置样式 form表单 labelStyle 需要的是一个对象 :labelStyle"{color: #333333,fontSize: 32rpx,fontWeight: 500}"dateTimePicker选择器设置默认值…

最新视频理解大模型之MiniGPT4-video

前言 随着大模型的爆火&#xff0c;多模态大模型也随之卷了起来&#xff0c;基本每隔一小段时间就会冒出一个新模型。 今天给大家带来一个最新发现的关于视频理解的多模态大模型。 它的名字是MiniGPT4-video&#xff0c;可以看的出来其是MiniGPT4的一个分支&#xff1b;Mini…

root管理员用户启动kibana报错

问题描述: CentOS7.9.2009环境,以root管理员用户启动kibana7.11.1程序报如下错误: Kibana should not be run as root. Use --allow-root to continue. [root@elasticsearch bin]# whoami root [root@elasticsearch bin]# pwd /usr/local/kibana-7.11.1-linux-x86_64/bi…

STM32利用软件I2C通讯读MPU6050的ID号

今天的读ID号是建立在上篇文章中有了底层的I2C通讯的6个基本时序来编写的。首先需要完成的就是MPU6050的初始化函数 然后就是编写 指定地址写函数&#xff1a; 一&#xff1a;开始 二&#xff1a;发送 从机地址读写位&#xff08;1&#xff1a;读 0&#xff1…

ESP-IDF移植lvgl 驱动 ST7789

文章目录 1 前言2 准备3 移植LVGL3.1 工程准备3.2 修改 CMakeLists.txt文件编译 LVGL3.3 编译LVGL 4 编译 ST7789 LCD驱动5 发现问题 1 前言 本教程开始学习 LVGL的&#xff0c;开始之前要把环境配置好&#xff0c;首先就需要移植 lvgl&#xff0c;使用的是 esp32 环境&#xf…

【Vue】前端Crypto-js加密库md5加密转成二进制/十六进制/Base64格式

MD5是一种常用的哈希函数&#xff0c;用于生成数据的消息摘要&#xff0c;在前端开发中&#xff0c;我们经常需要对数据进行加密&#xff0c;以确保数据的安全性。 Crypto-js是一个常用的JavaScript加密库&#xff0c;它提供了MD5算法的实现&#xff0c;并且支持将加密结果转换…

C++_ 头指针在链表的操作中用来标识链表的起始位置

链表&#xff08;linked list&#xff09;是一种常见的数据结构&#xff0c;用于存储一系列元素。它由一系列节点组成&#xff0c;每个节点包含数据和指向下一个节点的指针。 在 C 中&#xff0c;可以使用结构体来表示链表节点&#xff0c;然后使用指针将这些节点连接起来。 -…

kafka学习记录

文章目录 windows单机版kafka搭建步骤主题的增删改查操作消息的生产与消费 Windows集群版kafka搭建步骤 prettyZoo 尚硅谷Kafka教程&#xff0c;2024新版kafka视频&#xff0c;零基础入门到实战 【尚硅谷】Kafka3.x教程&#xff08;从入门到调优&#xff0c;深入全面&#xff0…

分库分表-简单了解

通过下面这些文章&#xff0c;我知道了什么是分库分表&#xff0c; 以及 什么时候需要分库分表&#xff0c; 还有分库分表带来的问题。 我说MySQL单表超过2000w就要分库分表&#xff0c;面试官让我回去等通知&#xff1f; 目前还没有学习到分布式&#xff0c;微服务&#xf…

plsql developer 一键格式化sql/美化sql

PL/SQL 格式化工具 以 Oracle SQL Developer 为例&#xff0c;使用一键格式化的步骤如下&#xff1a; 打开 Oracle SQL Developer。在“文件”菜单中&#xff0c;选择“打开文件”&#xff0c;然后选择你的 PL/SQL 文件。打开文件后&#xff0c;你可以通过右键菜单选择“格式…

vue3 知识点的补充 之 第一节

01 vue2与vue3的区别 vue2 采用object.defuneProperty()实现 对数组不友好 重写了数组的方法&#xff0c;同时无法监听数组length长度的改变。对于对象只能劫持设置好的数据 新增需要使用vue.set vue3 采用proxy进行代理&#xff0c;不需要重写数组的方法 同时可以监听数组长度…

gdb相关指令

背景知识 通过上图&#xff0c;可以看到&#xff0c;gcc 和 g 默认形成的可执行程序是release的&#xff01;&#xff01;&#xff01;故无法直接被调试。因此带 -g 选项表示使用 Debug 模式进行编译&#xff0c;而且我们可以看到&#xff0c;Debug 模式下编译形成的可执…

OSCP靶场--ClamAV

OSCP靶场–ClamAV 考点 1.nmap扫描 ##┌──(root㉿kali)-[~/Desktop] └─# nmap -sV -sC 192.168.153.42 -p- -Pn --min-rate 2500 Starting Nmap 7.92 ( https://nmap.org ) at 2024-04-13 10:01 EDT Nmap scan report for 192.168.153.42 Host is up (0.24s latency). N…

ssl认证 生成证书的代码 java

网上流行的 InstallCert.java&#xff0c;应该出自于官网。但现在也找不到了&#xff0c;只能找到2011年的一篇文章&#xff08;在文章底下的参考链接&#xff09;。 以下是生成证书的代码&#xff1a; import java.io.BufferedReader; import java.io.File; import java.io.…

题目一 搭建电商平台WordPress

创建VPC01和VPC02&#xff0c;两个安全组&#xff08;按考试时拓扑图中实际要求的名称来创建&#xff0c;可能VPC 的名称是&#xff1a;web-active, db&#xff0c;上海容灾的VPC名称是&#xff1a; web-dril1&#xff09;&#xff0c;安全组要求最小化放行&#xff0c;包括业务…

033. 字母异位词分组

给定一个字符串数组 strs &#xff0c;将 变位词 组合在一起。 可以按任意顺序返回结果列表。 注意&#xff1a;若两个字符串中每个字符出现的次数都相同&#xff0c;则称它们互为变位词。 示例 1: 输入: strs [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”] 输出…

Ubuntu去除烦人的顶部【活动】按钮

文章目录 一、需求说明二、打开 extensions 网站三、安装 GNOME Shell 插件四、安装本地连接器五、安装 Hide Activities Button 插件六、最终效果七、卸载本地连接器命令参考 本文所使用的 Ubuntu 系统版本是 Ubuntu 22.04 ! 一、需求说明 使用 Ubuntu 的过程中&#xff0c;屏…