IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> 虚拟内存&&main函数的真面目(操作系统) -> 正文阅读

[系统运维]虚拟内存&&main函数的真面目(操作系统)

目录

首先我们有这样一段代码?🚀?

那么虚拟内存多大呢??🚀?

那虚拟地址空间是怎么布局的呢??🚀?

main函数的真面目(命令行参数和环境变量)?🚀?

总的来说?🚀?


C语言门篇进阶篇深剖篇都整理在这里了哈。然后这里个人主页,比点头像更好找文章哈。


作者和朋友建立的社区:非科班转码社区-CSDN社区云💖💛💙

期待hxd的支持哈🎉 🎉 🎉


最后是打鸡血环节:改变的确很难,但结果值得冒险,拿出点勇气来。路还很长,现在才刚开始而已。过去无可挽回,未来可以改变。🚀 🚀 🚀?

首先我们有这样一段代码?🚀?

我们写的代码不管是什么语言,无非就是产生指令数据这两种东西,在内存中分别存放在不同的区域
首先,能称得上是计算机系统肯定要有?

CPU 内存 和 I/O

但是操作系统为了避免底层硬件的差异,使我们应用层的用户在使用的时候调用统一的接口,就像我们的open,不止可以打开文件,还可以打开字符设备等等

比如说为了屏蔽底层I/O的差异,我们基于I/O层,通过系统提供的VFS(虚拟文件系统)来屏蔽I/O层底层的所有差异

为了屏蔽内存和I/O的差异,也是资源分配的管理单位,我们有虚拟存储器,也就是虚拟内存

为了屏蔽CPU 内存 I/O的底层差异,也作为这三个部件资源调度的基本单位,操作系统给我们提供了一个概念,进程
进程,虚拟内存,虚拟文件系统也是我们操作系统内核离不开的三个重要部分

操作系统内核把底层的这些东西都屏蔽起来了,所以说如果有操作系统在,我们就不可能直接把写的代码生成的可执行文件直接存放进内存当中,他是直接加载到虚拟存储中的

那么虚拟内存多大呢??🚀?

在x86 32bit Linux内核下,也就是CPU是32位,我们知道CPU是运算数据的(在ALU算数逻辑单元里面(CPU的位数也就是ALU(算术逻辑单元)的宽度)),而数据又是从数据总线来的,所以说CPU的位数就是ALU的宽度也就是数据总线的条数

补充:平时我们说CPU位数是32位,地址总线也是32位这只是32位CPU刚刚好就是这样,他的数据总线和地址总线都是32条的,确实并不是都是这样的。比如16位CPU来说,数据总线16条,地址总线20条,对于8位的CPU数据总线是8条,地址总线是16条。所以说不要认为CPU的位数就是地址总线的条数,但是可以认为CPU的位数是数据总线的条数哈。

然后回到虚拟内存

那肯定是虚拟的,不存在的,是人们假想的,是逻辑上抽象出来的,当我们每生成一个可执行文件在他运行的时候,操作系统都会给他提供一个虚拟内存

虚拟内存(虚拟地址空间)有多大呢?

其实是与CPU的位数有关,如果CPU的位数是32位,那么他的大小就是2^32(4G),也可以理解为CPU的寻址能力。这4G是每一个程序运行起来都会有的,注意是虚拟的

那虚拟地址空间是怎么布局的呢??🚀?

PS:如果堆还没有开辟,操作系统给了我们一个名词就是空洞,这是给堆预留的空间

text是存放指令的

数据段是存放数据的,包括data和bss?

在我们先前的程序中

(最下面的大括号也是在红框框哈)

其实很多人在写程序的时候都会有一个问题

我们都知道我们调用库函数要包含头文件,但是头文件里面只有声明又没有定义,那怎么程序就运行起来了呢?

当我们写出这样的程序的时候,其实只有他的声明,但是他的定义在哪里呢,有人就会说是在库里面,其实不是的,因为库是在磁盘的,但是我们在运行程序的时候是在内存,其实是在程序链接的时候链接的动态库,C语言是libc.so而C++是libc++.so,这个库也叫共享库

main函数的真面目(命令行参数和环境变量)?🚀?

总的来说?🚀?

在每一个进程运行的时候,系统都会给他分配一个与CPU位数有关的(4G的)虚拟地址空间,空间分成两部分,低3G是用户空间,是应用程序用户供程序执行的,高1G是内核空间,供内核代码来执行的。非常重要的一点,系统可以运行很多的进程,他们的用户空间都是独立的,但是内核空间都是共享的(因为只有一个系统)

PS:其实我们大家说的全局变量区其实是不准确的,因为并没有这个词,这是我们翻译过来的,可以说是text段(区)data段(区)和bss段(区)。

内核分区 16MB 892MB 128MB
第一部分DMA,直接内存访问,加快磁盘和内存交换数据用的(了解),在没有DMA之前,交换数据必须要从数据总线然后通过寄存器去交换,那是对CPU极大的浪费,有了DMA,比如我们加载一个文件进内存,就不用走寄存器了,比如我们打开一个文件涉及磁盘的数据进物理内存中,此时CPU就会空闲下来调度其他的进程。

第二部分是我们的常用部分

第三部分是高端内存

比如在我们32位Linux系统,映射高于1G的物理内存的时候,会用到高端内存。而64位机器用不到,因为其内核空间高达512G,而一般电脑8G都不错了。所以说HIGHMEM在32位机器上还是非常有必要的。

最后的最后,创作不易,希望读者三连支持💖

赠人玫瑰,手有余香💖

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-05-11 16:45:38  更:2022-05-11 16:48:30 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 15:52:27-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码