什么是进程?程序又是什么?程序运行在操作系统来看是怎么做的?

news2024/11/15 12:55:53

        相信很多人都看到过课本上写的进程的概念,那么真的理解了吗?

        课本上是这样讲的,课本概念:程序的一个执行实例,正在执行的程序等。

        那么进程到底是什么?我先把内核层面上的概念拿出来:内核观点:承担分配系统资源(CPU时间,内存)的实体。

        相信很多人跟我一样,在学 linux 之前,每次写代码的时候,写好了一个程序,我们都讲把程序跑起来....,这个程序怎么怎么.....,但是现在这里概念要变一下了。

        当我们写好一个程序,将代码运行之后,那么写的程序在底层是来看是怎么运行的?怎么执行代码等等....,那么我这里讲详细讲讲。

        这里我先把进程的概念抛出来,进程是什么呢?

        进程 = 内核数据结构 + 代码和数据

        那么代码和数据倒是可以稍微理解,但是什么是内核数据结构?(以下我先暂且讲程序,先不讲进程)

        这里先问一下?在系统看来,每次运行完一个程序(运行完指的是从最开始运行到退出,就好比你写了一串代码,从 main 运行到 return 退出)才运行下一个还是可以运行很多个?

        这个问题我觉得很好理解,当你写一个死循环不退出,那么在起一个程序运行,那么这个是不是也可以运行?所以是不是就是说可以运行很多个?而不是只能一个一个运行!(我这里讲的一个一个运行依然是一个运行完毕退出才运行下一个)

        所以说,系统中是不是存在很多个被运行起来的程序,那么这么多程序被运行起来,需要操作系统管理吗?需要的对吧!怎么管理呢?六字真言:先描述,在组织

        这就跟我们每个人在学校一样,学校里有好几万学生,那么学校肯定也是需要管理我们这些学生,不然那就乱套了。

        那么既然都要被管理起来,怎么管理?我先继续用学生的例子讲:

        那么我们学生要被管理起来,是怎么管理的?是不是学校为每个学生创建了属于每个学生独有的(私有的)学生学号、班级、宿舍号等等,那么每个学生的这些信息,是不是都被在学生端的教务系统中有保存?我学校反正是这样,登录学生端的教务系统,里面保存每个学生的个人信息,有学生的学号、班级、宿舍号、身份证号等等,这些信息是可以直接标识到对应的每个学生个人的身上,而不是一个信息可以找到很多个学生!如果这样那么就乱套了。

        那么问题回归操作系统上来,系统中存在大量的程序,操作系统是不是也要管理,并且也是为每个进程创建属于它自己的信息?那么是什么呢?应该可以猜到一些吧?比如像学生学号一样表示程序的号码等等。

        但是学生的信息被保存在教务系统中,那么程序的信息被保存在哪里?

        在操作系统中,保存每个程序信息的叫 PCB 结构体,这个 PCB 是什么?在 linux 操作系统中 PCB 是 task_struct,那么我们可以看一看源代码:

上面就是一个程序运行起来,系统为它创建的 PCB结构体,那么这里面这么多属性,方法(c语言的结构体里面不能写方法,但是可以定义函数指针), 我们目前学的就用到里面的一点点。(mm_struct、files struct)这个结构就是进程的PCB结构!!!

每个学生有他的学号,班级等等,那么跟程序相关的,文件?内存?等等.....

所以这里就要变一下程序概念了!!!程序是指你写的可执行文件(代码和数据)!!!

进程 是指 内核数据结构 + 代码和数据

那么内核数据结构有什么?先谈谈 mm_struct 

当程序被加载起来,程序的代码和数据是要被加载到内存的,这里的内存指的是物理内存!!!

那么我们常用的不就是物理内存吗?不是的!我们常用的是虚拟内存!!!

这里又一个新的概念 虚拟地址空间,那么什么是虚拟地址空间?在PCB结构中是什么?每个进程都有吗? 

这个虚拟内存就是 mm_struct,是每个进程独有的,看过我之前讲的C/C++内存管理的就应该知道,内存有3G的用户空间和1G的内核空间如下图,那么虚拟内存呢,如下图:

当进程被创建出来,那么操作系统为了管理每个进程,为每个进程创建PCB结构体,这个PCB结构体中就包括它的虚拟地址空间 mm_struct,每个进程独有的!!!,而中间的是页表,是虚拟内存映射到物理内存上的中间介质,我这里暂且不讲页表。

所以,进程是什么?

进程 = 一堆内核结构 + 代码和数据

那么这里最后解释一下程序被运行起来,在操作系统看来是怎么样做的?

当程序在编译的时候,形成的可执行程序的时候,在还没被加载内存的时候,还在磁盘上的时候,也就是处于一个.exe文件(windows)的时候,程序内部是有地址的!!
因为操作系统不仅要遵守地址空间,编译器也要遵守,所以在编译器编译代码的时候,就已经形成了代码区、全局区等等,并且采用和linux一样的编址方式,每个变量、每行代码都进行了编址,所以程序在编译的时候,每个字段早已具有了虚拟地址。

当创建进程的时候,将可执行文件加载到物理内存中,可执行文件中的代码指令依然时按照虚拟地址编码的,并且加载到物理内存的时候,虚拟地址也一并加载到了物理内存,内部时虚拟地址,但是外部是物理地址然后因为可执行文件内部是按照linux编址的方式,所以每行代码指令可以对应到虚拟地址上的各个区域,页表的左边填的就是虚拟地址,右边是物理地址,通过页表映射到物理地址
当CPu通过虚拟地址获取到物理地址中的代码指令的时候,也获取到了地址,此时的地址依然是虚拟地址

 

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

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

相关文章

【算法基础】基础算法

快速排序 模板题:785. 快速排序 - AcWing题库 思路: 定义一个x(一般喜欢用中间的),我们快速排序,让x左边的都比它小,同时让右边的都比它大。然后像二分一样不断细分,缩小范围进行同…

flink主要组件及高可用配置

背景 flink不论运行在哪种环境,例如Yarn,Mesos,Kebernute以及独立集群,每个应用都会包含重要的几个组件,本文就来讲述下flink的主要组件以及如何实现flink的高可用配置 flink主要组件 如图所示,flink主要…

TiDB 7.1 资源管控特性试用

作者: 啦啦啦啦啦 原文来源: https://tidb.net/blog/3ddb423a 一.背景 印象里 2022 年初的时候就有小伙伴在 asktug 提出 TiDB 未来是否会有多租户功能的问题了,没想到这么快就已经 GA 了。资源管控特性(Resource Control&…

【论文阅读】Weighted Boxes Fusion(WBF)模型融合原理解读

论文地址:https://arxiv.org/pdf/1910.13302.pdf 代码地址:GitHub - ZFTurbo/Weighted-Boxes-Fusion: Set of methods to ensemble boxes from different object detection models, including implementation of "Weighted boxes fusion (WBF)"…

chatgpt赋能python:Python中如何转化大小写

Python中如何转化大小写 在Python编程中,转化字符串的大小写是一个常见的操作。Python提供了内置函数和字符串方法来实现此操作。本文将介绍如何使用Python中的这些函数和方法来转换字符串的大小写。 使用内置函数str.upper()和str.lower() str.upper()函数将字符…

共创开源生态 | 小米肖翔荣获“2023中国开源优秀人物”奖

6月15-16日,以“开源创新 数字化转型 智能化重构”为主题的“第十八届开源中国・开源世界高峰论坛”在北京成功召开。小米工程师肖翔凭借其在 Apache 基金会的开源贡献及在操作系统领域内的技术突破,荣获“2023中国开源优秀人物”奖。 Xiaomi …

一文读懂候选边界框Selective Search、AnchorBased、Anchor Free

目标检测是计算机视觉中的一项重要任务,主要目的是在图像或视频中识别并定位感兴趣的对象。为了实现这一目标,目标检测算法通常会生成一系列候选边界框,这些框包围了图像中可能存在的目标对象。候选边界框技术对于减少目标检测的计算复杂度和…

Vue中的数据可视化词云展示与词云生成

Vue中的数据可视化词云展示与词云生成 数据可视化是现代Web应用程序中的一个重要组成部分,它使得数据更加易于理解和分析。词云是一种非常流行的数据可视化形式,它可以用来展示文本数据中的主题和关键字。在本文中,我们将介绍如何在Vue中使用…

chatgpt赋能python:Python怎么转化数据类型?

Python怎么转化数据类型? Python是一种高级编程语言,它已经成为了许多程序员的首选语言。在Python中,数据类型是非常重要的一部分。但是,当我们需要将数据从一种类型转换为另一种类型时,该怎么做呢?在本文…

深度学习:探索人工智能的新前沿

第一章:引言 人工智能(Artificial Intelligence,AI)作为一项前沿技术,在近年来取得了巨大的进展。其中,深度学习(Deep Learning)作为人工智能领域的一个重要分支,更是引…

如何在VMware上安装CentOS7?

目录 一、器材准备 二、创建一个虚拟机 三、安装Centos7系统 一、器材准备 1. Centos7及以上版本的iso镜像 链接:centos7镜像 提取码:ao3n 2. VMware15及以上版本的软件工具包 链接:VMware16安装包以及激活码 提取码:40pe 二、创…

Framework - Zygote

一、概念 Zygote是 Android 中的第一个进程,负责孵化(fork)其它进程,而它自己由 Linux 内核启动的用户级进程 Init 创建。 二、作用 应用程序不能直接以本地进程的形态运行,必须在一个独立的虚拟机中运行,一…

Springboot实现数据传输加解密

前言 先给大家看下效果,原本我们的请求是这样子的 加密后的数据传输是这样子的 加解密步骤: 1.前端请求前进行加密,然后发送到后端 2.后端收到请求后解密 3.后端返回数据前进行加密 4.前端拿到加密串后,解密数据 加解密算法&…

搭建TiDB负载均衡环境-LVS+KeepAlived实践

作者: 我是咖啡哥 原文来源: https://tidb.net/blog/f614b200 昨天,发了一篇使用HAproxyKP搭建TiDB负载均衡环境的文章,今天我们再用LVSKP来做个实验。 环境信息 TiDB版本:V7.1.0 haproxy版本:2.6.2 …

【EXCEL】如何查找特殊字符 问号‘?’星号 ‘*’

目录 0.环境 1.适用场景 1)直接搜索问号的结果: 2)修改【查找内容】后,搜索结果变为精准定位: 2.具体做法 0.环境 windows wps(或excel,这里试了,此问题wps和excel表格是通用…

chatgpt赋能python:Python如何计算圆周率π

Python如何计算圆周率π 圆周率,又称π,是数学中一个重要的常数,它与圆的周长和直径的比值始终保持不变。在计算机编程中,计算圆周率π也是一个颇具挑战的问题。本文介绍了使用Python编程语言来计算圆周率π的方法,希…

C语言进阶---指针的进阶

前言 指针的主题,我们在初级阶段的《指针》章节已经接触过了。我们直到指针的概念。 ​ 1、指针就是个变量,用来存放地址,地址唯一标识一块内存空间。 ​ 2、指针的大小是固定的4/8个字节(32为平台/64位平台) ​ 3、指…

chatgpt赋能python:Python如何输出Unicode:一位10年编程经验的工程师的经验分享

Python如何输出Unicode:一位10年编程经验的工程师的经验分享 Python是一种常见的编程语言,被广泛应用于各种文本处理任务。其中一个有趣的方面是Python与Unicode的集成。在这篇博客文章中,我将分享我的经验,介绍如何在Python中输…

查看当前编译器(或交叉编译器)支持的C/C++标准

如果已经配置到系统环境中则直接使用&#xff1b; 如果没有配置到系统环境中&#xff0c;找到当前使用的交叉编译器的路径&#xff1b; gcc -E -dM - </dev/null | grep "STDC_VERSION" 或者编写一段小代码&#xff1a; printf("%ld\n",__STDC_VERS…

【栈与队列part02】| 20.有效的括号、1047.删除字符串中所有相邻重复项、150.逆波兰表达式求值

目录 ✿LeetCode20. 有效的括号❀ ✿LeetCode1047.删除字符串中的所有相邻重复项❀ ✿LeetCode150. 逆波兰表达式求值❀ ✿LeetCode20. 有效的括号❀ 链接&#xff1a;20.有效的括号 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;]…