深入理解计算机系统(一)

接上篇,记录一下【Unity 3D对博途PLCSIM的通讯】文章有点长~仔细看,很基础 本文参考链接:西门子PLC丨PROFINET通讯仿真(虚拟通讯)做了一些更详细的优化,本文使用的类库并非原作者使用的类库。 首先,昨天项目已经创建好了,这边也加了一个InputField和一个Button,可以实现简单的读取,ok开始。 放入准备好的通讯类库; 新建一个博途的项目,本次测试使用博途V15,测试环境为虚拟机,Unity运行在本地计算机,建立博途项目流程如下: 新建项目,右键项目-属性-保护-对勾,如图: 不得不说的是,仿真中加密的FB块是无法下载的哦~ 添加CPU... 阅读详情

信息就是位+上下文

#include<stdio.h>
 int main()
{
    printf("hello,world\n");
    return 0;
}

上面是一个hello程序。它的生命周期是从一个源程序开始的,就是程序员通过编辑器创建并保存的文本文件,文件名是hello.c。(源程序实际上就是由值0和1组成的位(比特)序列,8个位为一组称为字节,每个字节表示程序中的某些文本字符)

大部分计算机系统用ASCII标准来表示文本字符,就是用唯一的单字节大小的整数值来表示每个字符,

hello.c程序是以字节序列方式存储在文件中的,每个字节都有一个整数值对应于某个字符。

如下就是hello.c的ASCII码表示。 

我们可以编写如下代码来展示出它的ASCII码形式 

#include<stdio.h>

int main() {
    char str[] = "#include<stdio.h>int main()\n{\n    printf(\"hello,world\\n\");\n    return 0;\n}";
    for (int i = 0; str[i] != '\0'; i++) {
        printf("ASCII value of %c is %d\n", str[i], str[i]);
    }
    return 0;
}

 

 像这样只由ASCII字符构成的文件称为文本文件,所有其他文件都称为二进制文件

文件

通常来说文件分为两种,文本文件和二进制文件。当然文本文件也是由二进制组成,只不过比纯粹二进制文件多了上下文特征——编码。以上述ASCII编码的文本文件来说,每个字节表示一个字符,于是这些二进制数据在这个上下文环境中表现为字符,成了可供人们阅读的文本。

上述表示方法说明了一个基本思想:系统中的所有信息——包括磁盘文件、内存中的程序、内存中存放的用户数据以及网络上传送的数据,都是由一串比特表示的。区分不同数据对象的唯一方法是我们都到这些数据对象时的上下文。(在不同的上下文中,一个同样的字节序列可能表示一个整数、浮点数、字符串或者机器指令)

程序的生命周期

hello程序的生命周期是从一个高级C语言程序开始的,但是为了在系统上运行hello.c程序,每一条语句都被转化为一系列低级机器语言指令,然后这些指令按照一种称为可执行目标程序(可执行目标文件)的格式打包好,并以二进制磁盘文件的形式存放起来。

Unix系统上从源文件到目标文件的转化是由编译器驱动程序完成的。GCC编译器驱动程序读取源文件hello.c,并把它翻译成一个可执行目标文件hello。这个过程分为4个阶段,如下图所示执行这四个阶段的程序(预处理器、编译器、汇编器和链接器)一起构成了编译系统

  •  预处理阶段。预处理器根据以字符#开头的命令,修改原始的C程序。例如#include<stdio.h>命令告诉预处理器读取系统头文件stdio.h的内容,并把它直接插入程序文本中,得到另外一个C程序,以 .i 作为文件扩展名
  • 编译阶段。编译器将文本文件hello.i翻译成文本文件hello.s,它包含一个汇编语言程序。该程序包含函数main的定义,

 类似于这样的

main:
    ; 函数入口处
    push ebp        ; 保存旧的基址指针
    mov ebp, esp    ; 设置新的基址指针

    ; 打印 "hello, world"
    push dword hello    ; 将字符串地址压入栈中
    call printf        ; 调用 C 标准库的 printf 函数
    add esp, 4         ; 清理栈上的参数

    ; 返回 0
    mov eax, 0      ; 将返回值 0 放入寄存器 eax 中

    ; 函数出口处
    mov esp, ebp    ; 恢复栈指针
    pop ebp         ; 恢复基址指针
    ret             ; 返回

汇编语言为不同高级语言的不同编译器提供了通用的输出语言

  • 汇编阶段。将hello.s翻译成机器语言指令把这些指令打包成可重定位目标程序的格式,并将结果保存在hello.o这个二进制文件中,它包含的17个字节是函数main的指令编码
  • 链接阶段。hello程序调用了printf函数,它是每个C编译器都提供的标准C库中的一个函数。printf函数存在于一个名为printf.o的单独的预编译好了的目标文件中,而这个文件必须以某种方式合并到hello.o程序中,链接器就负责这种合并。结果就得到hello文件,它是一个可执行目标文件,可以被加载到内存中由系统执行

 系统的硬件组成

 

 总线

 贯穿整个系统的是一组电子管道,称作总线,它携带信息字节并负责在各个部件间传递。通常总线被设计成传送定长的字节块,也就是字。

I/O设备

I/O(输入/输出)设备是系统与外部世界的联系通道。上图中包括了四个I/O设备:键盘和鼠标,显示器,磁盘驱动器(就是磁盘)。最开始hello就存放在磁盘上。 

每个I/O设备都通过一个控制器或适配器与I/O总线相连。控制器和适配器之间的区别主要在于它们的封装方式。

控制器是I/O设备本身或者系统的主印制电路板(主板)上的芯片组。

适配器则是一块插在主板插槽上的卡。

但是它们的功能都是在I/O总线和I/O设备之间传递信息。

主存

 主存是一个临时存储设备,在处理器执行程序时,用来存放程序和程序处理的数据。从物理上来说,主存是由一组动态随机存储器(DRAM)芯片组成的。从逻辑上来说,存储器是一个线性的字节数组,每个字节都有其唯一的地址(数组索引),这些地址是从零开始的

处理器

 中央处理单元(CPU),简称处理器,是解释(执行)存储在主存中指令的引擎。处理器的核心是一个大小为一个字的存储设备(寄存器),称为程序计数器(PC)。在任何时刻,PC都指向主存中的某条机器语言指令(即含有该条指令的地址)

从系统通电开始,直到系统断电,处理器一直在不断地执行程序计数器指向的指令,再更新程序计数器,使其指向下一条指令。他们围绕着主存、寄存器文件、和算术/逻辑单元(ALU)进行。

运行hello程序

 hello.c源程序已经被编译系统翻译成了可执行目标文件hello,并被存放在磁盘上。要想运行该可执行文件,将它的文件名输入到称为shell的应用程序中。

当我们想要输入命令时,CPU中已经有一个正在运行的程序——shell。shell是一个命令行解释器,它输出一个提示符,等待输入一个命令行,然后执行这个命令。如果该命令行的第一个单词不是一个内置的shell命令,那么shell就会把它当作一个可执行文件的名字,加载并运行该文件。

初始时,shell程序执行它的指令,等待我们输入一个命令,当键盘输入字符串“./hello”后,shell程序将字符逐一读入寄存器,再把它放到内存中, 

 清晰一点表示就是下面这样

 

 当在键盘上敲入回车键时,shell程序就知道已经结束命令的输入。然后shell执行一系列指令来加载可执行hello文件,这些指令将hello目标文件中的代码和数据从磁盘复制到主存。数据包括最终会被输出的字符串”hello,world\n”

利用直接存储器(DMA)存取技术,数据可以不通过处理器而直接从磁盘到达主存

 一旦目标文件hello中的代码和数据被加载到主存,处理器就开始执行hello程序的main程序中的机器语言指令。这些指令将“hello,world\n"字符串中的字节从主存复制到寄存器文件,再从寄存器文件中复制到显示设备,最终显示到屏幕上。

 

 高速缓存很重要

 在上述示例中,系统花费了大量的时间把信息从一个地方挪到另一个地方。这些复制挪动操作就是开销,减慢了程序“真正”的工作。因此系统设计者的一个主要目标就是使这些复制操作尽可能快地完成。

处理器从寄存器文件中读取数据比从主存中读取几乎快100倍,而且这种差距还在增大。

针对这种差异,系统设计者采用了更小更快的存储设备,称为高速缓存存储器(cache或高速缓存),作为暂时的集结区域存储处理器近期可能会需要的信息。

 存储设备形成层次结构

 存储器层次结构的主要思想是上一层的存储器作为低一层存储器的高速缓存。 

操作系统管理硬件

如图10,所有应用程序对硬件的操作都必须通过操作系统

操作系统有两个基本功能:(1)防止硬件被失控的应用程序滥用;(2)向应用程序提供简单一致的机制来控制复杂而又通常大不相同的低级硬件设备

操作系统通过(进程、虚拟内存和文件)来实现这两个功能

文件是对I/O设备的抽象表示,虚拟内存是对内存和磁盘I/O设备的抽象表示,进程则是对处理器、主存和I/O设备的抽象表示

 

 进程

 像hello这样的程序运行时,操作系统会提供一种假象,就好像系统上只有这个程序在运行。程序看上去是独占地使用处理器、主存和I/O设备。处理器看上去就像不间断地一条接一条地执行程序中的指令。这些假象是通过进程的概念来实现的。

进程是操作系统对一个正在运行的程序的一种抽象。在一个系统上可以同时运行多个进程,而每个进程都好像在独占地使用硬件。而并发运行则是指一个进程的指令和另一个进程的指令是交错执行的。

无论是在单核还是多核系统中,一个CPU看上去都像是在并发地执行多个进程,这是通过处理器在进程间切换来实现的,操作系统实现这种交错执行的机制称为上下文切换。操作系统保持跟踪进程运行所需的所有状态信息,这种状态就是上下文。

在任何一个时刻单处理器系统都只能执行一个进程的代码,当操作系统决定要把控制权从当前进程转移到某个新进程时,就会进行上下文切换,然后将控制权传递到新进程。

线程 

一个进程实际上可以由多个称为线程的执行单元组成,每个线程都运行在进程的上下文中,并共享同样的代码和全局数据。 

进程与线程

虚拟内存

虚拟内存是一个抽象概念,它为每个进程提供了一个假象,即每个进程都在独占地使用主存。每个进程看到的内存都是一致的,称为虚拟地址空间。

下图是Linux进程的虚拟地址空间,地址空间最上面的区域是保留给操作系统中的代码和数据的,对所有进程而言都一样。底部区域存放用户进程定义的代码和数据。(地址是从下往上增大的) 

 虚拟内存的运作需要硬件和操作系统软件之间精密复杂的交互。基本思想是把一个进程虚拟内存的内容存储在磁盘上,然后用主存作为磁盘的高速缓存。

文件

文件就是字节序列

系统之间利用网络通信 

 系统经常通过网络和其他系统连接到一起,如下图所示,当系统从主存复制一串字节到网络适配器时,数据流经过网络到达另一台机器。从一个单独的系统来看,网络可视为一个I/O设备。

 

 系统不仅仅只是硬件,系统是硬件和系统软件互相交织的集合体,它们必须共同协作以达到运行应用程序的最终目的。

Xilinx IP库在Modelsim/Questasim中的高效仿真实践 本文详细介绍了在Modelsim/Questasim中高效仿真Xilinx FPGA设计的核心方法。针对仿真时常见的IP核缺失错误,重点解析了两种主流解决方案:使用Vivado的compile_simlib命令自动编译完整仿真库,以及利用export_simulation命令为特定工程生成仿真脚本。文章还提供了手动配置库的深入理解、实战排错步骤及高级避坑指南,帮助用户构建稳定、高效的独立仿真环境。 阅读详情

相关推荐

混合开关电容DCDC变换器技术解析与工程应用指南

在电源设计领域,传统DCDC变换器在高降压比或高升压比场景下,往往面临占空比过窄、开关应力大、效率偏低等瓶颈。开关电容变换器虽能实现固定比例的电压变换,却受限于调节能力。混合开关电容DCDC变换器通过“开关电容网络粗调变比+电感式DCDC细调输出”的策略,兼顾高效率、高功率密度与宽调压范围。本文梳理了其典型拓扑(如2:1/4:1 SC+Buck)、关键对比、控制策略(含软充电)及工程应用中的常见问题,帮助电源工程师在服务器供电、快充、车载电源等场景下快速选型与调试。

weixin_29164185的博客 314

深入理解计算机系统

第一章 1.1 信息就是位+上下文 1、源程序实际上就是一个有0和1组成的位(又称为比特)序列,这些为被组成8个一组,称为字节。每个字节表示程序中某个文本字符。 2、系统中所有的信息---包括磁盘文件、储存器中程序、储存器中存放的用户数据以及网路上传送的数据,都是由一串比特表示的。 1.2 程序被其他程序翻译成不同的格式 1、为了在系统上运行hello.c程序,每条C语句都被其他程序转化为一系...

天码丶行满 2472

ThreeJS教程:地图案例(包围盒、正投影)

推荐:将加入你的3D工具链。

jianshi2023的博客 1008

《深入理解计算机系统》CSAPP,全书分章节分享(一)

这是一本很经典的书,它涵盖对计算机系统从硬件到软件的全面理解,包括处理器架构、存储系统、网络通信等,很适合学习计算机底层知识。由于实在太经典了,就不做过多的赘述了。 处理器读取并解释存放在主存里的二进制指令。因为计算机花费了大量的时间在内存、I/O 设备和 CPU 寄存器之间复制数据,所以将系统中的存储设备划分成层次结构——CPU 寄存器在顶部,接着是多层的硬件高速缓存存储器、DRAM主存和磁盘存储器。在层次模型中,位于更高层的存储设备比低层的存储设备要更快,单位比特造价也更高。层次结构中较高层次的存储设备

m0_74255303的博客 3996

Linux实战:rMATS可变剪切分析从零到一,避坑指南与结果深度解析

本文详细介绍了在Linux系统上从零开始部署rMATS进行可变剪切分析的完整流程,包括环境搭建、安装避坑指南、参数优化及结果解读。特别针对gfortran依赖、数学库配置等常见问题提供解决方案,并深入解析JC与JCEC结果的差异及可视化技巧,帮助生物信息学研究者高效完成可变剪切分析。

weixin_30394669的博客 410

【ComfyUI】SD1.5 + ControlNet 边缘检测融合动漫转真人

本文介绍了一个基于ComfyUI的动漫转真人图像生成工作流,通过多模型协同实现高质量的二次元图像转换。该工作流集成了Canny线稿预处理、ControlNet结构控制、VAE编码解码和人脸精细化处理等核心环节,采用majicmixRealistic_v7作为主模型,配合yolov8、SAM等辅助模型。整个流程包含11个标准化步骤,从图像输入、预处理到最终超分输出,通过ControlNet引导和CLIP语义控制确保生成图像的写实感和结构准确性,特别针对人脸区域进行专业优化,最终可输出高分辨率写实人像。

Mr数据杨 1127

【深入理解计算机系统-学习笔记】第一章 计算机系统漫游

第一章 计算机系统漫游 简介: 我们通过跟踪hello程序的生命周期来开始对系统的学习—-从它被程序员创建开始,到在系统上运行,输出简单的消息,然后终止 我们将沿着这个程序的生命周期,简单得介绍一些逐步出现的关键概念、专业数据和组成部分 hello代码: #include <stdio.h> int main() { printf("hello, workd\n"); return 0; } 1.1、信息就是位+上下文 hello程序的生命周期从源程序开始 源程序:即源文件,程序员通过创

shitou_12的博客 849

Python 【编程实战】玩转 MCP 在工具函数中获取请求 Headers 的正确姿势

本文介绍了如何在使用FastMCP框架的工具函数中获取请求信息。通过Context对象可以访问请求上下文,包括请求头、用户信息等。具体实现方式是在工具函数中注入ctx:Context参数,通过ctx.request_context.request获取Starlette的Request对象,从而访问headers等信息。Context参数的位置可以灵活放置,但建议放在函数参数的开头或末尾。这种机制为权限校验、数据打点等操作提供了统一访问不同通信模式下请求信息的解决方案。

wjianwei666的专栏 390

《深入理解计算机系统》学习笔记 —— 1.计算机系统概述

《深入理解计算机系统》 视频链接https://www.bilibili.com/video/BV1Lp4y167im/?spm_id_from=333.788shell命令解释程序: 如果输入的第一个字母不是内置的可执行命令,则他就会假设这是一个可执行文件的名字。后面会讲解shell实现。 PC:program count,大小为一个word的存储区域。word在不同的系统上是不同的32位机器4byte, 64位机器8byte。(如何查看一个机器是多少位呢?) 其实他就是4byte或者8byte的存储空

Charles Ren's Tech Blog 2110

【Burp入门第三十一篇】Burp+SwitchyOmega实现本地localhost代理

在部分情况下(如本地靶场),当我们需要在Burp中查看、修改本地流量包的时候,按以下三个配置是不能得到本地流量包的。

等风来 3214

吊打BEVFormer!GaussianBeV实战:用3D高斯开启BEV分割新范式

GaussianBeV是一种基于3D高斯建模的BEV分割新方法,在自动驾驶感知任务中实现了SOTA性能。其核心创新在于将场景元素表示为3D高斯分布,通过均值、协方差和权重精确描述物体位置、形状和置信度,相比传统BEV方法具有更强的空间建模能力。文章详细介绍了GaussianBeV的原理、环境配置、训练推理流程及其在自动驾驶和城市3D重建中的应用,并讨论了优化方向和未来发展趋势。该方法在nuScenes等数据集上表现出色,为BEV分割任务提供了新的解决方案。

m0_71589036的博客 106

深入理解计算机系统——知识总结

第 1 章 计算机系统漫游 #include <stdio.h> int main() { printf ( "Hello, world\n") ; return 0; } 尽管hello程序非常简单,但是为了它的运行,系统的每个主要组成部分需要协调工作,本书就是了解在系统执行hello程序时,系统发生了什么以及问什么会这样。 本章就是通过跟踪hello程序的生命周期来开始对系统进行学习——从它开始被程序员创建开始,到在系统上运行,输出简单的消息,然后终止的过程。 1.1 信息就

belle_mei的博客 1万+

GPFS扩展技术原理(十一)-FMDN广播与EID加解密

GFPS扩展技术原理(十一)FMDN广播及EID加解密

十多年蓝牙协议软件开发,擅长蓝牙协议分析 936

《深入理解计算机系统》学习总结一

  前几天开始看的《深入理解计算机系统》这本书,东西超级多,书老厚了。但是为了巩固一下我薄弱的计算机的基础知识还是决定看看。下面的是我写的关于这本书上对我来讲比较重要的一些知识点,外加一些东西的总结。因为书太厚了,所以博客会不断更新。 第一章 计算机系统   这章主要是对后面的内容的梳理,简略的谈了一下。但是个人认为我们在接触一本新书的时候看目录来加深自己的宏观把握能力也很重要。另外,本书很重...

Katrina_ALi的博客 1万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

由读《深入理解计算机系统》一书引发对程序本质的探讨以及自己的一些理解

首先不得不说《深入理解计算机系统》着的是一本很不错的书,有一种强烈推荐给咱们计算机科学学院的同学把它作为程序设计及计算机科学入门书籍的冲动,当然,话说我也只是一个学生的角色,还是要“在其位,谋其政”啊。但是强烈推荐每个学习计算机专业的同学看下这本书的愿望还是有的。就像一条书评说的“计算机专业的同学越早接触这本书越好”,自认为这本书是迄今为止对我影响最深的一本书,是我对计算机系统不只是编程有了一个全

liteng0905的专栏 1293

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

推荐大家一本书《深入理解计算机系统》

我第一次看到这本书的第一版时,好像是03年,记得当时就被震撼了,一个大学本科大二的教材可以到这个水平,而很多内容我也第一次接触,非常汗颜,后来我花了一些时间进行了仔细的学习,遗憾的是,很多要点并没有具体的实验,当时的感觉这本书已经非常接近实践性了,但遗憾的是,有些要点还是没有告诉读者如何实践,这本书第一版在scholar.google.com上可以下载的,有兴趣的读者还可以看看这一个版本。也就是...

编程资料大全 134

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

《深入理解计算机系统》实验一Data Lab

《深入理解计算机系统》实验一Data Lab

达的程序员日记 1万+

深入理解计算机系统实验练习,【深入理解计算机系统】CSAPP-实验一:DataLab思路以及代码...

【深入理解计算机系统】CSAPP-实验一:DataLab思路以及代码【深入理解计算机系统】CSAPP-实验一:DataLab思路以及代码前言datalab主要是对整型以及浮点型的实验,其中对条件语句、算数运算以及逻辑运算限定了不同的规则。本机使用win10 +wsl2.0 + ubuntu18.04完成实验。得分满以及dlc检验可过。点击打开我的github,查看我的全部代码遇到问题参考了以下博主...

weixin_28745309的博客 1100

深入理解计算机系统笔记一

   我看的是《深入理解计算机系统》原书第三版,这真的是一本相见恨晚的好书。看了几天,有些内容已经在实际编程中获益了。我重点关注的是优化程序性能。作为程序员,我们无须为了写出高效代码而去了解一些编译器的内部工作。但是,为了在C程序中作出好的编码选择,我们确实需要了解一些机器代码以及编译器将不同的C语句转化为机器代码的方式。比如一个switch语句是否总是比一系列的if-else语句高效得多?whi...

lucky_greenegg的专栏 437

计算机整数编码实验《深入理解计算机系统》Lab1:Data Lab(一)

计算机整数编码实验《深入理解计算机系统》Lab1:Data Lab(一) 去发现同类优质开源项目:https://gitcode.com/ 实验介绍 本资源文件为《深入理解计算机系统》课程中的第一个实验——Data Lab(一)。本实验旨在通过计算机组成与体系结构的知识,让学生深入理解计算机中整数的编码方式及其操作。 实验中,学生将仅使用!,~单目运算符以及&,^|+<<&gt...

gitblog_06752的博客 419

深入理解计算机系统:Data Lab(一)——探索整数编码实验的魅力

深入理解计算机系统:Data Lab(一)——探索整数编码实验的魅力 去发现同类优质开源项目:https://gitcode.com/ 计算机整数编码实验深入理解计算机系统Lab1DataLab一:通过底层运算理解计算机整数编码 《深入理解计算机系统》Lab1:Data Lab(一)是一个专门设计的实验项目,旨在帮助学生深入掌握计算机系统中整数的编码及其操作。以下是关于该项目的详细介绍。 项目介绍...

gitblog_06749的博客 279

跟踪报道TopLanguage关于《深入理解计算机系统(第2版)》一书翻译问题 的讨论...

【引子】 在TopLanguage里,我把《深入理解计算机系统(第2版)》译者在翻译过程中遇到的一些问题发布出来,请教各位高手,反响很强烈。与此同时,译者也已经加入到这次讨论当中。特分享在这里。当然,有兴趣的话,你也可以到这里查看:http://groups.google.ht/group/pongba/browse_thread/thread/acd33c3b1be37126   T...

华章IT官方博客 623

《深入理解计算机系统》笔记(一)栈【插图】

读后感         这本书是美国“卡内基-梅隆大学(CMU)”的教科书,逻辑严谨。虽然是教科书,还是有些晦涩难懂啊,不太形象。第二章主要讲整数,浮点数,很是晦涩,全是数学公式。作者的思维数学的思维,动不动就是n、m、k、∑等等,让我们数学很烂的同学如何是好。如果能以普通人的思维把数学知识加进去就好了。         该书确实系统的介绍了计算机,很完善。它能给你以下几个重要级别的模型和过程

郭晓东的专栏 9105

南邮深入理解计算机系统实验一源码 Datalab1 bits.c文件

南邮深入理解计算机系统实验一源码 Datalab1 bits.c文件

zyt2005815的博客 614

深入理解计算机系统CSAPP实验一DataLab非官方版资源文件介绍

深入理解计算机系统CSAPP实验一DataLab非官方版资源文件介绍 去发现同类优质开源项目:https://gitcode.com/ 在计算机科学领域,理论与实践相结合的学习方式至关重要。《深入理解计算机系统》CSAPP实验一DataLab非官方版资源文件,正是为帮助读者深刻理解计算机系统基本原理而诞生的工具。以下,我们将详细介绍该项目的核心功能、技术分析、应用场景以及项目特点。 项目介绍 《深...

gitblog_06770的博客 418

0.0《深入理解计算机系统》笔记(一)栈【插图】

读后感 这本书是美国“卡内基-梅隆大学(CMU)”的教科书,逻辑严谨。虽然是教科书,还是有些晦涩难懂啊,不太形象。第二章主要讲整数,浮点数,很是晦涩,全是数学公式。作者的思维数学的思维,动不动就是n、m、k、∑等等,让我们数学很烂的同学如何是好。如果能以普通人的思维把数学知识加进去就好了。 该书确实系统的介绍了计算机,很完善。它能给你以下几个重要级别的...

257
上一篇: STL六大组件介绍
下一篇: C与C++不一样的地方
yangSHU21
博客等级 码龄4年 303粉丝 96原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值