Linux-3进程概念(一)

1.冯诺伊曼结构

1.1 冯诺依曼结构的概念

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

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

我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系

截至目前,我们所认识的计算机,都是有一个个的硬件组件组成
输入单元:包括键盘, 鼠标,扫描仪, 写板等
中央处理器(CPU):含有运算器和控制器等
输出单元:显示器,打印机等
 

输入设备和输出设备处理数据的速度相较于CPU是很慢的,如果数据直接从输入输出设备中发送或者接收就会形成一个很大的速度差,这样就会使得整个计算机运行起来的效率还是很低。

因为有IO设备和CPU的效率不均衡,因此引进了存储器(也就是内存),快于IO设备又慢于CPU。

冯诺依曼体系中数据的输入输出就不是直接传到CPU。数据由输入设备先传递到内存,然后CPU再从内存中读取数据进行处理,处理完CPU再写入内存,最后由内存传给输出设备。

总结:

不考虑缓存情况,这里的CPU能且只能对内存进行读写,不能访问外设(输入或输出设备)
外设(输入或输出设备)要输入或者输出数据,也只能写入内存或者从内存中读取。                           一切设备都与内存打交道

2.操作系统

2.1操作系统的概念

操作系统是一个进行软硬件资源管理的软件

 底层硬件是以冯诺依曼结构组织的

操作系统和底层硬件之间还有个驱动程序,那么这个驱动程序呢就是让操作系统通过调用不同的驱动程序去管理不同的硬件

2.2设计操作系统的目的

操作系统包括:

内核(进程管理,内存管理,文件管理,驱动管理)其他程序(例如函数库,shell 程序等)

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

管理的目的:为用户程序提供一个良好稳定的运行环境    

与硬件交互,管理所有的软硬件资源。

2.3操作系统的管理的理解

那么什么叫做管理?如何理解?

管理的本质就是对数据或者说信息进行管理

而管理者(OS)的工作是做决策,根据数据做决策

那么数据量大时管理者该怎么做管理呢?

可以将事物抽象成为一个对象,这个对象中保存着一个事物的信息(属性),也就是抽取事物的属性来描述这个事物

比如说学生:可以抽取姓名、性别、年龄、学号等

看着是不是很眼熟,这就是先描述,用一个数据类型(struct)以及学生的属性来描述学生

然后通过某种数据结构(容器)对大量的学生(数据/对象)进行管理,链表就很合适(可以通过学号或成绩等来做管理)

决策者(OS)所有的决策工作就变成了对链表的增删查改

对学生(数据)的管理也变成了对链表的增删查改

这也就是再组织的过程

总结:

先描述:将事物抽离出属性,通过大量属性定义出对象(通过结构体或类定义出对象(变量))

再组织:通过容器(数据结构)对大量的对象进行管理

2.4系统调用和库函数概念

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

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

3.进程

3.1进程的概念

进程是一个运行起来的程序,在具体点呢?

我们先想想下面几个问题

啥是程序呢?程序在哪呢?

程序在电脑中不就是二进制文件嘛,既然是文件那它就存在磁盘里

就是磁盘里的那个.exe(可执行程序)文件,将这玩意加载到内存里就是进程了(暂时先这么理解)

3.2描述进程-PCB

可以同时运行多个程序吗?

可以同时运行,一定要将多个.exe(可执行程序)加载到内存

操作系统要不要管理多个加载到内存的程序呢?

操作系统如何管理多个加载到内存的程序呢?

先描述,再组织

先描述:

进程加载到内存里,操作系统咋知道谁是谁啊

所以对进程的属性进行抽离,根据属性创建出对象来描述每个进程"长啥样"

由此就产生了processes control block(PCB)也叫进程控制块

那么为什么程序加载到内存,变成进程之后我们要给每个进程创建一个PCB对象呢?

因为操作系统要对进程进行管理

PCB中有一个属性(指针)指向对应的进程,那么对进程的管理变成对PCB对象的管理

然后PCB里面又有指向下个PCB对象的指针,那么就变成对链表的增删查改(再组织)

所以进程的本质是

内核数据结构 + 可执行程序 = 进程

未来,所有对进程的控制和操作只和进程的PCB有关,和进程的可执行程序无关

Linux操作系统下PCB是task_struct

task_struct描述内容分类

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

进程标示符: 描述本进程的唯一标示符,用来区别其他进程

也就是进程的PID,PID是操作系统中唯一标识的进程号

通过系统调用获取标识符

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
int main()
{printf("before fork: I am a prcess, pid: %d, ppid: %d\n", getpid(), getppid());printf("创建进程\n");sleep(5);pid_t id = fork();if(id<0){return 0;}else if(id == 0){//子进程while(1){printf("after fork, 我是子进程: I am a prcess, pid: %d, ppid: %d,returnid:%d\n", getpid(), getppid(), id);sleep(1);} }else{while(1){printf("after fork,i am a fatherprcess,pid:%d,return id:%d\n",getpid(),getppid(),id);sleep(1);                                                    }return 0;
}

3.3组织进程

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

3.4查看进程

进程的信息可以通过 /proc 系统文件夹查看

1.通过ps aux 可以查看系统中所有进程的信息

2.可以通过 ps axj 查看进程的父进程号

 3.5fork初识

3.5.1 通过fork创建进程

fork成功返回子进程的pid给父进程,返回0给子进程

失败返回-1给父进程,子进程不会创建

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{int id = fork();if(id < 0){perror("fork");return 1;}else if(id == 0){ //child  可以执行你所需要的子进程内容printf("I am child : %d!, ret: %d\n", getpid(), id);}else{ //father  执行所需要的父进程内容printf("I am father : %d!, ret: %d\n", getpid(), id);}sleep(1);return 0;
}

父子非同一个进程,可以同时跑(两个执行流)

进程 = 内核数据结构 + 可执行程序的代码和数据

子进程又没有自身的代码和数据,子进程会指向父进程的代码和数据

子进程被创建是以父进程为模板的

3.5.2fork的返回值

为什么给父进程返回子进程的pid,而给子进程返回0?

我们要明白,一个父亲可以有多个孩子,而一个孩子只能有一个父亲

父亲:孩子 = 1:n 的关系  当然 孩子也可以有一个

但重要的是父进程是唯一的,子进程可以很容易的找到父进程,而父进程需要通过子进程的pid去找到子进程

为什么fork函数会返回两次?

还记得我们上面写的代码吗?

if(id < 0)
{//...
}
else if(if == 0)
{//...
}
else
{//...
}

id如果是同一个变量怎么可能既大于0又等于0

一个进程挂掉是不会影响另一个进程的

(任意)进程之间是具有独立性的,互相不能影响

前面我们提到子进程没有自身的代码和数据,子进程会指向父进程的代码和数据。那么当子进程要改变(写入)变量时会出现写时拷贝,可以用同一个变量名来表示不同的内存

在return子进程之前已经有父子进程分流了

返回的本质就是写入

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

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

相关文章

Django连接Mysql

修改setting.py配置文件 连接前&#xff0c;需要创建数据库 安装mysql客户端 因为连接需要一个客户端&#xff0c;而python没有客户端&#xff0c;所以就需要一个客户端来接收你填写的参数 pip install mysqlclient

【Java程序设计】【C00246】基于Springboot的留守儿童爱心网站(有论文)

基于Springboot的留守儿童爱心网站&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的留守儿童爱心网站 本系统分为系统功能模块、管理员功能模块以及用户功能模块。 系统功能模块&#xff1a;系统首页的主要功能展…

为什么(如何)从 Java 8/11 迁移到 Java 21,从 Spring Boot 2 迁移到最新的 Spring Boot 3.2 ?

介绍 如果您的工作配置与 Java 有一定的关系&#xff0c;您一定已经注意到 了Java 最新稳定版本 Java 21 引起了很多关注。 这个新版本引入了一些未来的功能&#xff0c;改进了之前引入/孵化的一些突破性功能&#xff0c;弃用了多余的功能&#xff0c;并删除了一些错误。它使…

CTF-WEB进阶与学习

PHP弱类型 在进行比较的时候&#xff0c;会先判断两种字符串的类型是否相等&#xff0c;再比较 在进行比较的时候&#xff0c;会先将字符串类型转化成相同&#xff0c;再比较 如果比较一个数字和字符串或者比较涉及到数字内容的字符串&#xff0c;则字符串会被转换成数值 并且…

c语言游戏实战(3):三子棋

前言&#xff1a; 三子棋是一种民间传统游戏&#xff0c;又叫九宫棋、圈圈叉叉棋、一条龙、井字棋等。游戏规则是双方对战&#xff0c;双方依次在9宫格棋盘上摆放棋子&#xff0c;率先将自己的三个棋子走成一条线就视为胜利。但因棋盘太小&#xff0c;三子棋在很多时候会出现和…

人工智能|深度学习——基于全局注意力的改进YOLOv7-AC的水下场景目标检测系统

代码下载&#xff1a; 基于全局注意力的改进YOLOv7-AC的水下场景目标检测系统.zip资源-CSDN文库 1.研究的背景 水下场景目标检测是水下机器人、水下无人机和水下监控等领域中的重要任务之一。然而&#xff0c;由于水下环境的复杂性和特殊性&#xff0c;水下目标检测面临着许多挑…

计算机网络——新型网络架构:SDN/NFV

1. 传统节点与SDN节点 1.1 传统节点(Traditional Node) 这幅图展示了传统网络节点的结构。在这种设置中&#xff0c;控制层和数据层是集成在同一个设备内。 以太网交换机&#xff1a;在传统网络中&#xff0c;交换机包括控制层和数据层&#xff0c;它不仅负责数据包的传输&…

编译spring原码

1.下载原码 spring原码下载地址链接: github地址 最好选择一个release版本&#xff0c;毕竟发布版稳定&#xff0c;上述连接指向的是5.2.0 release 2.配置gradle 由于spring源码是用gradle管理的。为了能顺利得下载项目所需的jar包&#xff0c;因此要先配置一下gradle&#xff…

docker安装zpan

安装 1.创建数据库 docker run -di --namezpan_mysql -p 3309:3306 -e MYSQL_ROOT_PASSWORD123456 mysql 2.手动新建数据库zpan 3.创建目录 mkdir -p /opt/zpan cd /opt/zpan 4.编写配置文件 vim config.yml #详细配置文档可参考&#xff1a; https://zpan.space/#/zh…

机器学习之DeepSequence软件使用学习1

简介 DeepSequence 是一个生成性的、无监督的生物序列潜变量模型。给定一个多重序列比对作为输入&#xff0c;它可以用来预测可获得的突变&#xff0c;提取监督式学习的定量特征&#xff0c;并生成满足明显约束的新序列文库。它将序列中的高阶依赖性建模为残差子集之间约束的非…

2024/2/6学习记录

ts 因为已经学习过了 js &#xff0c;下面的都是挑了一些 ts 与 js 不同的地方来记录。 安装 npm install -g typescript 安装好之后&#xff0c;可以看看自己的版本 ts基础语法 模块 函数 变量 语法和表达式 注释 编译 ts 文件需要用 tsc xxx.ts &#xff0c;js 文件…

《计算机网络简易速速上手小册》第8章:软件定义网络(SDN)与网络功能虚拟化(NFV)(2024 最新版)

第8章&#xff1a;软件定义网络&#xff08;SDN&#xff09;与网络功能虚拟化&#xff08;NFV&#xff09; 文章目录 8.1 SDN 架构与原理 - 智能网络的构建积木8.1.1 基础知识8.1.2 重点案例&#xff1a;使用 Python 控制 OpenFlow 交换机准备工作Python 脚本示例 8.1.3 拓展案…

C++ STL精通之旅:向量、集合与映射等容器详解

目录 常用容器 顺序容器 向量vector 构造 尾接 & 尾删 中括号运算符 获取长度 清空 判空 改变长度 提前分配好空间 代码演示 运行结果 关联容器 集合set 构造 遍历 其他 代码演示 运行结果​编辑 映射map 常用方法 构造 遍历 其他 代码演示1​编…

【VSTO开发-WPS】下调试

重点2步&#xff1a; 1、注册表添加 Windows Registry Editor Version 5.00[HKEY_CURRENT_USER\Software\kingsoft\Office\WPP\AddinsWL] "项目名称"""2、visual studio 运行后&#xff0c;要选中附加到调试&#xff0c;并指定启动项目。 如PPT输入WPP搜…

Java锁到底是个什么东西

一、java锁存在的必要性 要认识java锁&#xff0c;就必须对2个前置概念有一个深刻的理解&#xff1a;多线程和共享资源。 对于程序来说&#xff0c;数据就是资源。 在单个线程操作数据时&#xff0c;或快或慢不存在什么问题&#xff0c;一个人你爱干什么干什么。 多个线程操…

【Go语言成长之路】创建Go模块

文章目录 创建Go模块一、包、模块、函数的关系二、创建模块2.1 创建目录2.2 跟踪包2.3 编写模块代码 三、其它模块调用函数3.1 修改hello.go代码3.2 修改go.mod文件3.3 运行程序 四、错误处理4.1 函数添加错误处理4.2 调用者获取函数返回值4.4 执行错误处理代码 五、单元测试5.…

LeetCode、198. 打家劫舍【中等,一维线性DP】

文章目录 前言LeetCode、198. 打家劫舍【中等&#xff0c;一维线性DP】题目及分类思路线性DP&#xff08;一维&#xff09; 资料获取 前言 博主介绍&#xff1a;✌目前全网粉丝2W&#xff0c;csdn博客专家、Java领域优质创作者&#xff0c;博客之星、阿里云平台优质作者、专注…

Python循环语句——for循环的基础语法

一、引言 在Python编程的世界中&#xff0c;for循环无疑是一个强大的工具。它为我们提供了一种简洁、高效的方式来重复执行某段代码&#xff0c;从而实现各种复杂的功能。无论你是初学者还是资深开发者&#xff0c;掌握for循环的用法都是必不可少的。在本文中&#xff0c;我们…

element ui表格手写拖动排序

效果图&#xff1a; 思路&#xff1a; 重点在于&#xff1a;拖动行到某一位置&#xff0c;拿到这一位置的标识&#xff0c;数据插入进这个位置 vueuse的拖拽hooks useDraggable 可以用&#xff1b;html5 drag能拖动行元素&#xff1b;mounsedown、mounsemove时间实现拖拽 页…

【Iceberg学习四】Evolution和Maintenance在Iceberg的实现

Evolution Iceberg 支持就底表演化。您可以像 SQL 一样演化表结构——即使是嵌套结构——或者当数据量变化时改变分区布局。Iceberg 不需要像重写表数据或迁移到新表这样耗费资源的操作。 例如&#xff0c;Hive 表的分区布局无法更改&#xff0c;因此从每日分区布局变更到每小…