《程序是如何跑起来的》-----读书笔记篇

news2024/9/24 1:19:36

程序是如何跑起来的

  • 前言
  • 磁盘与内存的关系
    • 虚拟内存
    • dll 文件
  • 运行环境
  • 从源文件到可执行文件

前言

 不得不说,在这个假期借助“微信阅读”读到了很多有意义的书。不仅是思想境界上的,还有专业方向的。这一次我是在周三还是周四的一个活动中淘到了这本书,一开始大致看了一下,还只以为是的认为自己都大致了解了(毕竟也是学了好几年了嘛,得有点自信。)。在看了之后是真的赞叹,书是不嫌多的,总是很吸取到对自己有帮助的地方。
  这是一篇读书笔记性质的博客,有自己的理解,同时对于书中的内容也是进行选取的(重点选择自己觉得之前没有了解或没有掌握到的知识)。
 这本书呢,正如其名,大体是介绍了程序是如何在计算机中运行的。首先呢,对于没有学过太多有关方面知识(如计组、计网和编译原理等)也是可以通过这本书了解到一个大体框架的(比如这其中涉及到了很多方面的知识,那么在学到相关方面的课程的时候我们就大致明白了这个课程与其余知识的联系,能让我们能更好地对知识进行融会贯通);如果是学到了相关方面的知识,那么我认为较大的好处是一方面可以对我们所学的知识有一个新的认知与巩固(了解到在真实情况下所学的知识是如何使用到的),另一方面则是能查漏补缺将知识体系补充完整。

磁盘与内存的关系

在现如今的计算机体系中,程序必须要读到内存中才是可以正常运行的。而这就使得磁盘和内存之间就存在着很多巧妙的设计。
在这里插入图片描述

虚拟内存

虚拟内存指的是将磁盘的一部分作为假象的内存来使用。
  通过借助虚拟内存,在内存不足的时候也可以运行程序。

 由于CPU只能执行内存中的程序。虚拟内存虽然说是将一部分磁盘当作内存来使用,但实际运行部分的程序是必须在内存中的。那么我们可以想到,我们会将程序分成很多部分使得内存能一次性容纳在运行的部分。 在很多地方,将磁盘上虚拟内存的内容转移到实际内存中的操作称之为 ----- 置换

 现如今,虚拟内存主流的方式分为两种:分页式和分段式。在Windows中采用的是分页式的手段。该方式指的是在不影响程序构造的基础上,将程序按照一定大小的页进行分割,并以页为单位在内存和磁盘间进行置换。 如下图
在这里插入图片描述
 为了实现虚拟内存的功能,Windows在磁盘上提供了虚拟内存使用的文件(页文件)。该文件由Windows自动做成和管理。文件大小也就是虚拟内存的大小。我们可以通过Windows的控制面板查看或变更当前虚拟内存的设定。如下图
在这里插入图片描述

dll 文件

DLL(dynamic link library)文件,是在程序运行的时候可以动态加载library(函数和数据的集合)的文件。
 多个应用可以共有一个DLL文件。而通过共有同一个DLL文件可以达到节约内存的效果

 Windows的操作系统本身也是一个DLL文件的集合体。除了利用多个DLL文件可以节约内存之外,使用DLL文件可以在不变更EXE文件的情况下,只通过升级DLL文件就可以更新了。

运行环境

在程序中是离不开所依赖的运行环境的。因此,出现了我们如今常见的虚拟环境和docker等手段来构建适合程序运行的环境。那么程序的运行环境是什么呢?其实大致可以这么说:运行环境 = 操作系统 + 硬件。也就是说,操作系统和硬件决定了程序的运行环境。

 首先呢,现如今的同一类型硬件是可以选择安装多种操作系统的。同时,CPU只能解释其自身固有的机器语言。也就是说不同的CPU能解释的机器语言的种类也是不同的。我们都知道程序最终都是要编译成为机器语言的,这样才能被CPU所执行。因此可以这么说,运行环境是为了使得程序最终编译成的机器语言符合该计算机的CPU能执行的形式的这个目标。(如下图)
在这里插入图片描述
 同时,现如今的体系结构大部分是,程序操控硬件是通过操作系统来间接控制的。也就是说如果操作系统不同,应用程序向操作系统传递指令的途径也会有所不同。也就是说,在同类型的操作系统下,不管硬件如何,API基本上是没有差别的。(这也是使用操作系统的一个好处,对上层进行了透明操作)。因而,针对某特定操作系统的API所编写的程序,在任何硬件都可以运行。当然,可以由于CPU种类的不同,在本地上边的代码(机器语言)是有所不同的。

  1. 那么我如果想在Windows上运行Linux的程序的话什么办?一个方法就是利用虚拟机获得其他操作系统环境。也就是说我们在Windows上配置好Linux的虚拟机,之后程序就能调用Linux上的API从而能运行了,同时该Linux虚拟机需要适配好该Windows的硬件配置。(因为这个Linux调用的是Windows上的硬件)。(这个技术目前大部分是使用docker来替代了)
  2. 还有一种方式是使用想Java虚拟机这样的方式。我们的源代码会统一先编译为名为字节代码的程序。字节代码的运行环境就称为Java虚拟机。Java虚拟机是一边把Java字节代码逐一转换成本地代码一边运行的。(最终还是要转换成本地CPU能执行的本地代码,不同的是这个任何交给了Java虚拟机来进行转换----这也是Java运行较慢的主要原因)在这里插入图片描述

从源文件到可执行文件

  1. 将多个目标文件(通过对源文件进行编译才得到目标文件)结合生成EXE的工具称为链接器。通过编译和链接之后才能得到EXE文件。
  2. 把多个目标文件收录在一起的文件称为:库文件
  3. 仅包含Windows的DLL文件中存储的函数信息的文件称为:导入库。将导入库信息结合到EXE文件中,这样程序在运行时就可以利用DLL内的函数了。
  4. 链接器会从库文件中抽取除必要的目标文件并将其结合到EXE文件之中。此外,还存在一种程序运行时结合的DLL形式的库文件。

 Windows中的编译及链接机制如下图
在这里插入图片描述

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

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

相关文章

Nginx的介绍、安装与常用命令

前言:传统结构上(如下图所示)我们只会部署一台服务器用来跑服务,在并发量小,用户访问少的情况下基本够用但随着用户访问的越来越多,并发量慢慢增多了,这时候一台服务器已经不能满足我们了,需要我们增加服务…

随机过程及应用

随机过程及应用一、概率论基础1. 三元体定义2. 随机变量及其分布1. 离散随机变量2. 连续型随机变量3. 常见的随机变量和分布1. 离散类2. 连续类4. 二维连续随机变量1. 二维离散2. 二维连续5. 随机变量函数的分布1. 离散(可浅看)2. 一维连续 r.v 函数分布…

JS学习第3天——Web APIs之DOM(什么是DOM,相关API【创建、增删改查、属性操作、事件操作API】)

目录一、Web APIs介绍1、API2、Web API二、DOM1、DOM树2、获取元素3、事件基础4、操作元素属性5、节点(node)操作三、DOM操作总结(创建、增删改查、属性操作、事件操作API)1、创建2、增3、删4、改5、查6、属性操作7、事件操作四、…

[QCustomPlot] QCPBar绘制柱状图并同时显示柱状图的值

前言 博主在使用 qcustomplot 绘制柱状图时,发现网络上的教程。大都忽略了一个重要的点就是。柱状图没有明显显示出当前的值。经过博主寻找后发现在 qcustomplot 论坛中已经有了对应的解决方案。所以记录一下。qcustomplot论坛 代码 void MainWindow::drawBars()…

【N32WB03x SDK使用指南】

【N32WB03x SDK使用指南】1. 简介1.1 产品简介1.2 主要资源1.3 典型应用2. SDK/开发固件文件目录结构2.1 doc2.2 firmware2.3 middleware2.4 utilities2.5 projects Projects3. 项目配置与烧录3.1 编译环境安装3.2 固件支持包安装3.3 编译环境配置3.4 编译与下载3.5 BLE工程目录…

Vue.js基础特性、生命周期及常用指令

目录 一、Vue构造选项 el根标签 data数据对象 methods定义方法 二、生命周期 三、常用指令 一、Vue构造选项 选项说明el唯一根标签,决定Vue实例会管理哪一个DOM节点dataVue实例对应的数据对象methods定义Vue实例的方法,可以在其他地方调用&#x…

慢SQL出现原因、优化、开启慢查询日志

文章目录慢SQL:出现原因:解决方式:开启慢查询日志:慢SQL: 出现原因: (1)数据库表索引设置不合理 (2)SQL语句有问题,需要优化 解决方式: (1&am…

Java 抽象类和接口

文章目录一、抽象类1. 抽象类定义2. 抽象类成员特点二、接口1. 接口概述2. 接口成员特点3. 类和接口的关系4. 抽象类和接口的区别5. 接口案例三、形参和返回值一、抽象类 1. 抽象类定义 在 Java 中,一个没有方法体的方法应该定义为抽象方法,而类中如果…

现在转行做程序员的多吗?

曾经有一名程序员说,他在编写程序时,就像一个发明家在做实验;当他把程序编好可以运行时,他就已经是个发明家了。 程序员作为众多转行人员首选的职业,也是被大众熟知了。但我们需要知道的不仅是它作为一个职业的定义&a…

Spring超级全家桶,学完绝对是惊艳面试官的程度

前言Spring框架自2002年诞生以来一直备受开发者青睐,它包括SpringMVC、SpringBoot、Spring Cloud、Spring Cloud Dataflow等解决方案。有人亲切的称之为:Spring 全家桶。很多研发人员把spring看作心目中最好的java项目,没有之一。所以这是重点…

AtCoder Beginner Contest 290 G. Edge Elimination(思维题 枚举+贪心)

题目 T(T<100)组样例&#xff0c;每次给出一棵深度为d的k叉树&#xff0c; 其中&#xff0c;第i层深的节点个数为 保证k叉树的所有节点个数tot不超过1e18&#xff0c; 求在k叉树上构建一棵大小恰为x的连通块&#xff0c;所需要断开的最少的树边的条数(x<tot<1e18)…

VScode远程连接服务器-过程试图写入的管道不存在-could not establist connection to【已解决】

问题描述 使用服务器的过程中突然与服务器断连&#xff0c;报错如下&#xff1a;could not establist connection to [20:23:39.487] > ssh: connect to host 10.201.0.131 port 22: Connection timed out > [20:23:39.495] > 过程试图写入的管道不存在。 > [20…

hook与mixin

看完vue3就开始看vue3的源码&#xff0c;表示很懵~ 刚把rollup打包搞完&#xff0c;这不响应式就接着来了&#xff01;&#xff0c;还是写篇直接使用vue3的博客清清脑吧&#xff01; 什么是hook、mixin&#xff1f; mixin: Vue2中多个组件内存在重复JS业务逻辑&#xff0c;使…

JavaScript 闭包【自留】

闭包的概念理解 闭包的定义 ✅ 这里先来看一下闭包的定义&#xff0c;分成两个:在计算机科学中和在JavaScript中。 ✅ 在计算机科学中对闭包的定义(维基百科): 闭包(英语:Closure)&#xff0c;又称词法闭包(Lexical Closure)或函数闭包(function closures);是在支持头等函数…

QT之OpenGL模板测试

QT之OpenGL模板测试1. 概述2. 使用步骤及函数介绍3. Demo4. 参考1. 概述 当片段着色器处理完一个片段之后&#xff0c;模板测试(Stencil Test)会开始执行&#xff0c;和深度测试一样&#xff0c;它可能会丢弃片段。被保留下来的片段会进入深度测试。 一个模板缓冲中&#xff…

Web Spider Babel安装 Ast抽象语法 - 基本使用

文章目录一、资源地址二、遍历2.1 树结构遍历模式2.2 案例三、下载安装四、案例操作总结提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、资源地址 Ast反混淆语法在线网址&#xff1a;https://astexplorer.net Babel官方文档&#xff1a;https://ww…

玩转Linux内核进程调度,这一篇就够(所有的知识点)

一&#xff0c;进程的分类 在 CPU 的角度看进程行为的话&#xff0c;可以分为两类&#xff1a; CPU 消耗型&#xff1a;此类进程就是一直占用 CPU 计算&#xff0c;CPU 利用率很高IO 消耗型&#xff1a;此类进程会涉及到 IO&#xff0c;需要和用户交互&#xff0c;比如键盘输…

性能测试流程

性能测试实战一.资源指标分析1.判断CPU是否瓶颈的方法2.判断内存是否瓶颈的方法3.判断磁盘I/O是否瓶颈的方法4.判断网络带宽是否是瓶颈的方法二.系统指标分析三.性能调优四.性能测试案例1.项目背景2.实施规划&#xff08;1&#xff09;需求分析&#xff08;2&#xff09;测试方…

Faster-Rcnn修改转数据集文件

目录 学习python的一些基础知识 argparser assert关键字 让你秒懂Python 类特殊方法__getitem__ lxml.etree.fromstring的使用 统计一下json文件内的种类 正脸红外光 正脸-混合红外光 正脸-交叉偏振光 正脸-平行偏振光 正脸-紫外光 正脸-棕色光 调用mydataset可视化…

我的 System Verilog 学习记录(5)

、 引言 本文简单介绍 System Verilog 语言的 控制流。 前文链接&#xff1a; 我的 System Verilog 学习记录&#xff08;1&#xff09; 我的 System Verilog 学习记录&#xff08;2&#xff09; 我的 System Verilog 学习记录&#xff08;3&#xff09; 我的 System Ver…