冯诺依曼体系结构与进程的初步理解

news2024/12/25 12:25:09

目录

一,冯诺依曼体系结构

1.是什么?特点

2.为什么?

二,操作系统

三,进程

1.什么是进程?

2.查看进程

 3.进程的管理

4.fork()创建子进程

1.fork()简介

2.fork()干了啥

3.fork()为什么会有两个返回值?

4.子进程与父进程谁先运行?

5.一个变量里有两个值


一,冯诺依曼体系结构

1.是什么?特点

先来看看一张图,看看什么叫做冯诺依曼体系结构:

这张图便是冯诺依曼体系结构的图。中央处理器便是我们的Cpu。通过这张图我们能看到的便是Cpu只和存储器相连,这个存储器便是内存。然后内存再和输入输出设备相连。于是我们可以得到一个结论:Cpu只和内存相连不和外设相连,内存和外设相连。

2.为什么?

我们的计算机大多数都是遵循冯诺依曼体系结构设计的。但这是为什么呢?原因其实就是性价比高。这样做能够然更多人买得起一台好用且不贵的计算机。为什么呢?因为在计算机中有一个金字塔:

在这个金字塔里,越是金字塔上面的运行速度就越快但是也越贵。越是下面的就越慢但是越便宜。为了造出又快又便宜的计算机,于是便有了冯诺依曼体系结构的出现。冯诺依曼体系结构的Cpu只和内存相连,内存和外设相连。于是便可以通过先将外设里的数据先搬到内存中存储然后再搬到cpu中处理。这样便可以在保证造价较低的情况下保证计算机的运行速度。

二,操作系统

在计算机中有大量的资源需要被管理,于是我们便要有一款可以管理资源的软件。这个软件就被叫做操作系统。在计算机中有一个层状结构如下:

这个层状结构从上到下分别是:用户-》用户接口-》系统调用接口-》操作系统-》驱动程序-》底层硬件。

        可以看到操作系统便在这个层状结构的中间位置。所以计算机在运行时传输数据的时候必定要经过操作系统。操作系统管理的只是一些数据,而不是具体的硬件。Linux操作系统其实有狭义和广义之分,狭义的操作系统便是Linux内核。广义的操作系统便是Linux内核+系统调用接口+lib库。如下图:

狭义:

广义:

三,进程

1.什么是进程?

进程其实就是加载到内存中的可执行程序。所以进程与程序就有以下区别:

1.位置:进程在内存中,程序在磁盘里

2.状态:程序的状态是静态的,进程的状态是动态的

2.查看进程

在Linux下可以通过命令(ps ajx | grep 可执行程序名)来查看进程。

比如我有以下可执行程序:

  

可执行程序是Mycode.

然后通过这个窗口:在

再来打开一个窗口输入查看进程的指令便可以查看可执行程序的进程:

但是这些数字是啥子意思呢?鬼知道啊?于是我们再来一条指令(ps ajx | head -1&& ps ajx | grep 可执行程序)来查看更加详细的信息:

通过这条指令便可以看到在这些数字上面多了一些叫做PPID和PID的东西,这是啥啊?

不知道!!!

现在我们再来学一条指令能让我们看到动态的进程信息,指令如下:

while:;do ps ajx | head -1&& ps ajx | grep 可执行程序;sleep 1;echo "###########";done;

然后我们便可以看到滚动起来的进程信息了:

 3.进程的管理

   我们该如何管理一个事物呢?联想到生活中其实我们是通过管理事物的属性来管理事务的,比如管理一个人的时候便要知道这个人的姓名,性别,电话等等。而我们在管理进程的时候也是这样子管理的,这套管理的方法也被称为先描述后组织

    在操作系统中有一个叫做PCB的东西,全称叫做process control block(进程控制块)。在Linux中这个东西就叫做:task_struck()。在这个结构体里面便管理着PID,PPID等进程属性。PID和PPID的意思就是子ID和父ID可以通过getpid()和getppid()两个函数来的到PID和PPID。

    所以说到这里的话那就可以再来丰富一下生成进程的过程:

然后如果有多个进程的话便会生成多个PCB。这些PCB形成一个双向循环链表。于是这个列表就会存储着所有进程的信息,操作系统通过控制这个链表便可以控制所有的进程。

4.fork()创建子进程

1.fork()简介

fork()其实是一个系统调用接口。它的作用便是创建子进程。现在可以来对这个接口来使用一番。写下以下程序:

 #include<stdio.h>
  2 #include<unistd.h>
  3 #include<sys/types.h>
  4 int main()
  5 {
  6   pid_t id = fork();//接收fork()的返回值
  7   if(id<0) return 1;
  8   else if(id == 0)//因为给子进程返回0
  9   {
 10     while(1)
 11     {
 12       sleep(1);
 13       printf("I am a child process,my id is: %d,my father id is:%d\n",getpid(),getppid(    ));
 14     printf("\n");                                                                      
 15     }
 16   }
 17 
 18   else//因为给父进程返回子进程的pid()
 19   {
 20     while(1)
 21     {
 22      sleep(1);
 23      printf("I am a father process,my id is: %d,my father id is:%d\n",getpid(),getppid(    ));
 24      printf("\n");
 25 
 26     }
 27   }
 28 
 29 
 30   return 0;
 31 
 32 }

然后将这段代码运行起来会是下面的样子:

可以发现这里会有同时执行父子进程的情况:

能同时执行两个不同的if else语句那就说明id接收了两个返回值。fork()能同时返回两个值。

2.fork()干了啥

      我们通过上面的学习可以知道,fork()可以创建一个子进程。但是是如何创建子进程的呢?首先要明确的一点便是:fork()是一个系统级别的接口,fork()只能在内存中创建子进程。所以子进程是没有可执行程序的,所以创建子进程其实就是创建一个PCB。这个PCB里面的属性大多数都是继承于父进程的。

3.fork()为什么会有两个返回值?

这是因为fork()在创建完一个子进程以后,在系统中就有两个进程了。fork()在返回的时候会将两个返回值分别放在两个不同的寄存器里面。当返回结束时,父子进程各自会读取各自的返回值。于是就得到了两个不同的返回值。

4.子进程与父进程谁先运行?

在一般条件下我们是无法预测的。这两个进程谁先运行完全由操作系统说了算。操作系统调度谁,谁就先执行。

5.一个变量里有两个值

为什么一个变量id里面却有两个值呢?这是因为id在接收返回值的时候使用了一个叫做写时拷贝的技术实现了。fork()返回一次id就接收一次,id接收完了以后便执行下面的代码。然后fork()再返回一个值id再写入一次,id接收完了以后再执行下面的代码。

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

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

相关文章

【Java】微服务——Ribbon负载均衡(跟进源码分析原理)

添加LoadBalanced注解&#xff0c;即可实现负载均衡功能&#xff0c;这是什么原理 1.负载均衡原理 SpringCloud底层其实是利用了一个名为Ribbon的组件&#xff0c;来实现负载均衡功能的。 2.源码跟踪 为什么我们只输入了service名称就可以访问了呢&#xff1f;之前还要获取…

mstsc无法保存RDP凭据, 100%生效

问题 即使如下两项都打勾&#xff0c;其还是无法保存凭据&#xff0c;特别是连接Ubuntu (freerdp server)&#xff1a; 解决方法 网上多种复杂方法&#xff0c;不生效&#xff0c;其思路是修改后台配置&#xff0c;以使mstsc跟平常一样自动记住凭据。最后&#xff0c;如下的…

Python无废话-办公自动化Excel写入操作

Python 办公自动化-Excel写入 创建并保存Excel文件 import openpyxl workbookopenpyxl.Workbook() #创建空Excel文件 sheetworkbook.active #获取活动的工作表 sheet.title“测试“ #修改sheet工作表名称为测试 workbook.save(“data\input\Test.xlsx”) #保存Excel文件 …

R中的min()函数 和max()函数

通过min()函数和max()函数产生Inf 数值空集的最小值和最大值是Inf和–Inf(按此顺序&#xff01;)这确保了传递性&#xff0c;例如min(x1&#xff0c;min(x2)) min(x1&#xff0c;x2)。对于数值x&#xff0c;每当length (x) 0时&#xff0c;max(x) - Inf和min(x) Inf(如果需…

C#餐饮收银系统

一、引言 餐饮收银系统是一种用于管理餐馆、咖啡厅、快餐店等餐饮业务的计算机化工具。它旨在简化点餐、结账、库存管理等任务&#xff0c;提高运营效率&#xff0c;增强客户体验&#xff0c;同时提供准确的财务记录。C# 餐饮收银系统是一种使用C#编程语言开发的餐饮业务管理软…

SDK Vitis记录

文章目录 SDK记录SDK中报错“undefined reference to sqrt”的解决方法通过XML文件导入工程的include路径方法说明 其他设置编译选项设置某些文件/文件夹不编译单独设置文件的编译选项 向存储区中导入/导出数据通过GUI操作使用命令行操作 产生C代码的MAP文件在Xilinx SDK 工程的…

Golang 中的调试技巧

掌握有效的策略和工具&#xff0c;实现顺畅的开发 调试是每位开发人员都必须掌握的关键技能。它是识别、隔离和解决代码库中问题的过程。在 Golang 的世界中&#xff0c;掌握有效的调试技巧可以显著提升您的开发工作流程&#xff0c;并帮助您创建更可靠和健壮的应用程序。在本…

C语言 —— 函数栈帧的创建和销毁

在我们之前学习函数的时候&#xff0c;我们可能有很多困惑? 比如: 局部变量是怎么创建的?为什么局部变量的值是随机值?函数是怎么传参的?传参的顺序是怎样的?形参和实参是什么关系?函数调用是怎么做的?函数调用是结束后怎么返回的? 那么要解决这些问题, 我们就需要知道…

Raspberry Pi 5 新平台 新芯片组

Raspberry Pi 5 的 CPU 和 GPU 性能提高了两到三倍&#xff1b;内存和 I/O 带宽大约是两倍&#xff1b;并且是首款采用英国剑桥内部设计的芯片的 Raspberry Pi 计算机&#xff0c;4GB 型号的售价为 60 美元&#xff0c;8GB 版本的售价为 80 美元 主要特点包括&#xff1a; 2.4…

Zama的fhEVM:基于全同态加密实现的隐私智能合约

1. 引言 Zama的fhEVM定位为&#xff1a; 基于全同态加密实现的隐私智能合约 解决方案 开源代码见&#xff1a; https://github.com/zama-ai/fhevm&#xff08;TypeScript Solidity&#xff09; Zama的fhEVM协议中主要包含&#xff1a; https://github.com/zama-ai/tfhe-…

Windows11+VS2022+OCCT7.6.0安装配置记录

Windows11VS2022OCCT7.6.0安装配置记录 工具及源码准备VS2022以及CMake下载OCCT源码下载第三方库 CMake修改occt_toolkit.cmake进行CMake Visual Studio环境配置配置包含目录配置库目录配置链接器设置系统环境变量配置项目调试环境环境测试 其他方法 主要参考此文&#xff0c;在…

自然语言处理的分类

动动发财的小手&#xff0c;点个赞吧&#xff01; 简介 作为理解、生成和处理自然语言文本的有效方法&#xff0c;自然语言处理&#xff08;NLP&#xff09;的研究近年来呈现出快速传播和广泛采用。鉴于 NLP 的快速发展&#xff0c;获得该领域的概述并对其进行维护是很困难的。…

Golang 语言学习 01 包含如何快速学习一门新语言

Golang方向 区块链 go服务器端 (后台流量支撑程序) 支撑主站后台流量&#xff08;排序&#xff0c;推荐&#xff0c;搜索等&#xff09;&#xff0c;提供负载均衡&#xff0c;cache&#xff0c;容错&#xff0c;按条件分流&#xff0c;统计运行指标 (qps&#xff0c; latenc…

java飞机大战

一、 概述 1.1 项目简介 本次Java课程设计是做一个飞机大战的游戏&#xff0c;应用Swing编程&#xff0c;完成一个界面简洁流畅、游戏方式简单&#xff0c;玩起来易于上手的桌面游戏。该飞机大战项目运用的主要技术即是Swing编程中的一些窗口类库、事件监听以及贴图技术。 1…

微信小程序WebSocket实现stream流式聊天对话功能

要在微信小程序实现聊天对话功能&#xff0c;回话是流式应答&#xff0c;这里使用了WebSocket技术。WebSocket大家应该都很熟悉&#xff0c;使用wx.connectSocket就可以了。这里可能需要注意下的是流式应答&#xff0c;后端如何发送&#xff0c;前端如何接收。直接上代码&#…

【1】c++设计模式——>UML类图的画法

UML介绍 UML:unified modeling language 统一建模语言 面向对象设计主要就是使用UML类图&#xff0c;类图用于描述系统中所包含的类以及他们之间的相互关系&#xff0c;帮助人们简化对系统的理解&#xff0c;他是系统分析和设计阶段的重要产物&#xff0c;也是系统编码和测试的…

小程序 用户反馈 与 客服对话 使用说明

在开发小程序时&#xff0c;通过翻阅官方文档&#xff0c;会发现 button 的 open-type 属性有很多值可以选。因此&#xff0c;我们就可以实现相应的按钮功能。 微信开发文档-表单组件-buttonhttps://developers.weixin.qq.com/miniprogram/dev/component/button.html contact…

嵌入式学习笔记(44)S5PV210的SD卡启动实战

8.5.1任务&#xff1a;大于16KB的bin文件使用SD卡启动 (1)总体思路&#xff1a;将我们的代码分为2部分&#xff0c;第一部分BL1小于等于16KB&#xff0c;第二部分为任意大小&#xff0c;iROM代码执行完成后从SD卡启动会自动读取BL1到iRAM中执行&#xff1b;BL1执行时负责初始化…

ChatGPT启蒙之旅:弟弟妹妹的关键概念入门

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

腾讯云服务器哪个配置比较值得?

腾讯云服务器哪款配置比较好值得买&#xff1f;轻量应用服务器性价比值得买&#xff0c;轻量2核2G3M带宽95元一年、2核4G5M带宽218元一年、2核2G4M带宽三年540元一年、4核8G12M配置446元一年、8核16G18M带宽1668元15个月、16核32G28M轻量服务器3468元15个月。腾讯活动入口&…