自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(49)
  • 问答 (2)
  • 收藏
  • 关注

原创 对氢能的发展怎么看?

现在很多人都在关心氢气的安全问题,这确实是需要特别关注的,但绝对不是不可解决的。首先用氢人员的安全意识一定要提高,要怀有敬畏之心,不光是氢,就算是相对安全一点的天然气,汽油等同样要对其保持安全意识。其次用氢环境要绝对安全,通风设施,氢浓度传感器等要应装尽装。作为氢能利用最大的终端,氢燃料电池汽车敌人应该是去对标燃油车,燃油车的缺点,氢燃料电池汽车要没有,燃油车的优点,氢燃料电池汽车要继续保持。总之,目前氢燃料电池汽车要和纯电汽车差异化竞争,但最终的目的都是干掉燃油车。干掉燃油车后才有可能再来解决纯电汽车。

2023-09-07 11:17:12 212

原创 Abaqus中C++子程序开发入门

ABAQUS是支持C++子程序开发的,相比于传统的Fortran,C++作为高级语言的优势不言而喻,再搭配优秀的C++程序库,使得我们的编程效率大大提高,尤其是对于熟悉C++编程的开发者,不失为一种更好的选择。

2023-07-02 13:05:44 2475 2

原创 Boost.Asio Library

是Boost::Asio命名空间内的核心对象,I/O service是一个用于访问操作系统资源的通道,并在提交I/O请求的程序和执行I/O请求的操作系统之间建立通信。io_service对象使用最频繁的方法是,它用于不断应对io_service对象需要处理的事件。因此它会阻塞,直到所有的事件处理完毕。如果想让对象在没有事件需要处理时,依然阻塞,可以使用方法。例如:在上面的代码中,类通知对象它有工作要做,但我们没有定义工作是什么。因此,程序将被无限阻塞,所以最后一行代码不会输出。阻塞的原因是run()函数

2022-07-02 19:01:48 494

原创 Golang基础(7)

每个程序都会遇到错误。你应该为它们做好计划。有时候,处理错误可以像报告错误并退出程序一样简单。但是其他错误可能需要额外的操作。你可能需要关闭打开的文件或网络连接,或者以其他方式清理,这样你的程序就不会留下混乱。我们知道在C++中对堆区的内存由程序员手动分配手动释放。如果在释放内存之前程序崩溃,那么很有可能内存是没有释放,这样的情况出现多了,会不断消耗内存,进而影响操作系统的性能。可以通过defer语句去处理这个问题。你可以将defer关键字放在任何普通函数或方法调用之前,Go将延迟(也就是推迟)执行函数

2022-06-11 14:38:50 843

原创 Golang基础(6)

有时你并不关心一个值的特定类型。你不需要关心它是什么。你只需要知道它能做特定的事情。你能够在其上调用特定的接口。不需要关心是pen还是pencil,你仅仅需要一个Draw方法。不需要关心是Car还是Boat,你只需要一个Steer方法。那就是Go接口的目标。它允许你定义能够保存任何类型的变量和函数参数,前提是它定义了特定的方法。我们被思乡情绪淹没了,所以我们创建一个gadget包来帮助我们思乡。它包含一个模拟录音机的类型和另一个模拟播放器的类型。只能接受一种类型方法参数我们定义一个playList函

2022-06-09 18:45:45 328

原创 Golang基础(5)

定义类型大多数通常使用struct作为其基础类型,但它们也可以基于int、float64、string、bool或者任何其他的类型。基于基础类型string的类型,支持+、==、>和

2022-06-08 12:57:19 480

原创 Golang基础(4)

Go有另一种方法来保存数据集合:映射。一个映射是通过键来访问每一个值的集合。键是一个简单的方式来从映射中找出数据。就像一个整齐标记的文件夹,而不是乱糟糟的堆叠。为了声明一个保存映射的变量,请输入一个map关键字,后面跟着一对包含键类型的方括号([])。然后在方括号后面提供值的类型。数组和切片仅允许你使用整型作为索引。而你几乎可以使用任意类型来作为映射的键。映射字面量映射字面量以映射类型(以“映射[键类型]值类型”的形式)开始。后面跟着花括号,内含你想要映射初始就包含的键/值对。对于每一个键/值对,包含

2022-06-07 15:12:39 205

原创 Golang基础(3)

数组保存特定数量的元素,不能增长或者收缩。要声明保存数组的变量,需要在方括号([])中指定它保存的元素数量,后跟数组所保存的元素类型。创建数组时,它所包含的所有值都初始化为数组所保存类型的零值。使用for…range安全遍历数组在range格式中,提供一个变量,该变量(index)将保存每个元素的整数索引,另一个变量(value)将保存元素本身的值,以及要循环的数组。循化将为数组中的每一元素运行一次,将元素的索引赋值给第一个变量,将元素的值赋值给第二个变量。可以使用给空白标识符(_)忽略于for…r

2022-06-06 11:22:53 486

原创 Golang基础(2)

函数调用函数命名名字必须以字母开头,后跟任何数量的附加字母和数字名称以大写字母开头的函数是可导出的,并且可以在当前包外使用,如果只需要在当前包内使用,应该以小写字母开头包含多个单词的名称应该使用驼峰式大小写函数返回值如果函数声明了返回值类型,Go要求它包含一个return语句且要求是最后一个语句Go不允许返回未声明的值Go要求返回值的类型与声明类型匹配错误值一个错误值是一个可以返回字符串的名为Error的方法返回的任何值。创建错误值的最简单方法是将字符串传递给errors包的N

2022-06-05 09:59:54 118

原创 Golang基础(1)

快速入门Golang的基本语法。

2022-06-04 08:47:18 424

原创 基于预线程化的并发服务器

1 服务器中的并发1.1 基于进程的并发当客户端向服务器发来连接请求,服务器就会派生一个子进程单独为客户端服务。这样各进程之间有着清晰的界限,虚拟内存相互独立,不会出现一个进程覆盖了另一个进程的虚拟地址空间,但也会有非常严重的局限性,独立的地址空间让进程间共享状态信息变得更加困难。此外,基于进程的设计,往往速度比较慢。1.2 I/O多路复用I/O多路复用的目的是让服务器能够分别对用户的连接请求和从标准输入键入的交互命令做出响应。其核心思想是使用select函数,要求内核挂起进程,只有在一个或多个I/

2022-05-15 14:20:41 197

原创 结合代码再看进程管理(下)

一、基本概念1 处理机的调度在多道程序系统中,进程的数量往往多于处理机的个数,因此进程争用处理机的情况在所难免。处理机调度是对处理机进行分配,即从就绪队列中按照一定的算法(公平、高效)选择一个进程并将处理机分配给它运行,以实现进程的并发运行。1.1 调度方式所谓进程调度方式,是指当某个进程正在处理机上执行时,若有某个更为重要或紧迫的进程需要处理,即有优先权更高的进程进入就绪队列,此时应如何分配处理机。通常有以下两种进程调度方式:非剥夺调度方式,又称非抢占方式。非剥夺调度方式是指当一个进程正在

2022-05-01 22:40:01 494

原创 结合代码再看进程管理(上)

一、基本概念1. 进程的状态与转换进程在其生命周期内,由于系统中各进程之间的相互制约关系及系统的运行环境的变化,使得进程的状态也在不断地发生变化(一个进程会经历若干不同状态)。通常进程有以下5 种状态,前 3 种是进程的基本状态。创建态。 进程正在被创建,尚未转到就绪态。创建进程通常需要多个步骤:(1)首先申请一个空白的 PCB,并向 PCB 中填写一些控制和管理进程的信息;(2)然后由系统为该进程分配运行时所必需的资源;(3)最后把该进程转入就绪态。就绪态。 进程获得了除处理机外的一切所需资

2022-04-21 16:44:17 463

原创 页机制下的内存分配与管理(下)

在上篇文章中介绍了基于显式链表的内存的分配与释放,这篇文章在此基础上进行内存访问管理的介绍。在页机制下,虚拟内存的访问可能产生缺页异常,这篇文章主要对产生缺页异常前后的处理过程进行介绍,其中会涉及到页面在内存和硬盘换入换出的过程,实现细节不作具体介绍。以上提到的过程都是虚拟存储的一部分,其中关键环节是页映射,为了便于理解这个过程我们站在操作系统的角度阐述一个可执行文件如何被装载。进程的建立(1)创建虚拟地址空间对我们来说,我们看到的地址其实是可执行文件中体现的虚拟地址,并不是可执行文件实际在内存.

2022-04-08 13:48:29 292

原创 ELF目标文件链接与程序头表

今天做OS实验时发现一个问题如题,困扰很久,通过试错硬是把原因给试出来了。在开始描述问题之前,首先对了解下ELF文件的结构。ELF文件由4部分组成,分别是ELF头(ELF header)、程序头表(Program header table)、节(Section)和节头表(Section header table)。实际上,一个文件中不一定包含全部内容(比如对于目标文件来说没有程序头表),而且它们的位置也未必如下图所示这样安排,只有ELF头的位置是固定的,其余各部分的位置、大小等信息由ELF头中的各项值.

2022-04-02 22:18:33 1163

原创 页机制下的内存分配与管理(上)

对于操作系统内核中页内存管理有必要理一下。其中涉及到采用什么数据结构管理内存,内存的分配与释放应该采用什么算法,而这其中要造哪些轮子,以便于达到目的。所谓轮子可以是宏、普通函数或者内联函数,好的轮子可以提高代码的编写效率,可读性也越好。对于已有的轮子要明确,输入什么输出什么。在分页机制下,物理内存将以页为单位进行组织,页内存管理的需求是:能够分配指定的页数(>=1);能够释放某页。每一页通过一个结构体描述其状态,所有的页对应一个Page型的数组,大小由管理页的数量而定:struct.

2022-04-01 22:23:18 331

原创 特权级保护和任务切换

在简单的内核与程序加载部分,不管是内核还是用户程序,是把所有的的段描述符都放在GDT中,为了有效地在任务之间进行隔离,处理器建议每个任务都有自己的描述符表,称为局部描述符表(LDT),并把那些专属自己的段放在LDT中。为了访问这些LDT,处理器使用了局部描述符表寄存器(LDTR)。在一个多任务系统中,LDTR只指向当前任务的LDT,LDTR也包含了32位线性基地址和16位界限。在任务切换过程中,为了保存任务的状态,并在下次重新执行是恢复他们,每个任务都应当用一个额外的内存区域保存相关信息,叫做任务状态段(

2022-03-26 19:31:06 849

原创 简单的内核与程序加载

前言在进入保护模式后,段的访问是基于段的信息描述符表中定义的描述符,但是操作系统是怎么知道任意一个加载程序的段的信息呢?所以有必要探讨这个问题。1.操作系统是怎么加载用户程序,然后转移到用户程序去执行;2.操作系统怎么提供大量的例程供用户程序使用,比如显示字符。当然在主流的操作系统中肯定与书中提到的有所区别,但通过这个过程去认识普通程序的加载过程,对理解现代操作系统肯定是有所帮助的。主引导程序主引导程序负责把内核加载到内存中,因为此时已经启动保护模式,内存的访问都要通过描述符(描述符要加载进段寄

2022-03-25 20:16:45 771

原创 数据结构与算法阶段总结(二)

1. 二叉树1.1 二叉树的遍历1. 先(根)序遍历操作过程:若二叉树为空,则什么都不做;否则,1)访问根节点;2)先序遍历左子树;3)先序遍历右子树。对应的递归算法如下:void preOrder(treeNode *T) { if(T!=NULL) { visit(T);//访问根节点 preOrder(T->left);//递归遍历左子树 preOrder(T->right);//递归遍历右子树}}2. 中(根)序遍历操作过程:若二叉树为空,则什么都

2022-03-17 22:24:05 396

原创 从实模式到保护模式

对《X86汇编语言从实模式到保护模式》书中的内容进行总结。实模式因为早期的处理器是16位的如8086,后来处理器逐渐升级为32位的如80386,实模式的存在主要还是为了让32位处理器兼容针对16位处理器开发的程序。处理器中代表的寄存器:8086处理器的寄存器都是16位的,为了达到1MB的寻址空间,在寻址的时候先将段寄存器的内容左移四位形成20位的段地址,再加上16位的偏移地址得到20位的物理地址。在寻址时,通常两个寄存器搭配完成,指令段的寻址由[CS:IP]确定,数据段的寻址由[DS:偏移]确.

2022-03-16 19:41:30 1084

原创 malloc lab

实验参考资料

2022-03-10 20:25:27 1706

原创 shell lab

在做shell lab之前,有必要先对操作系统的进程管理进行了解。重点参考资料:异常控制流;实验指导书。

2022-03-09 21:54:19 3904

原创 操作系统内存管理

为了更加有效地管理内存并少出错,现代操作系统提供了一种对主存的抽象概念,叫做虚拟内存(VM)。从概念上讲,可以将虚拟内存看作存储在磁盘上的字节序列,存储在磁盘上的虚拟内存的内容要缓存到主存中,这个操作有点类似Cache的工作原理。在开始操作系统内存管理之前先了解一下Cache的工作原理。虚拟内存实现的思路:在程序运行时,只把当前必要的很小一部分代码和数据装入内存中。其余代码和数据需要时再装入。不再运行的代码和数据及时从内存删除。利用了程序运行的局部性。1. 页式虚拟内存管理概念: 把进程空间(虚拟

2022-02-22 22:38:34 1021

原创 操作系统进程管理

1. 进程的概念2. 进程控制3. 线程4. 临界区和锁5. 同步和P-V操作6. Windows和Linux同步机制7. 进程通信

2022-02-18 14:25:51 1257

原创 cache lab

前言在开始做这个实验的时候不知如何下手,我觉得有一下几个原因,1.对cache的工作原理还不够熟悉,包括将内存的数据以块为单位装入cache不够清楚;2.C语言功底有待加强,getopt(),fscanf()等函数的用法不清楚;3.熟悉了上面两点,还是没有思路。。。4.于是看了别人的思路,原来建立一个二维数组的malloc方法是这样的。...

2022-02-07 13:17:51 1904

原创 贪吃蛇小项目

在这个项目中体现出的用C++面向对象的思想解决问题,值得好好回顾下。开始编程前在正式编写程序之前,应该分析清楚以下几点。1.明确游戏的玩法贪吃蛇是大家非常熟悉的小游戏,其中只涉及到蛇的移动,食物随机出现在限定区域内,当蛇吃到食物后,蛇的身子会加长一个单位。当蛇头碰到墙壁或者自己的身体时,游戏结束。2.涉及到的模块2.1 墙模块首先明确墙模块里有哪些行为和属性。成员属性: 一个二维数组。成员行为: 初始化数组,设置好数组中的数据;画墙,在屏幕上输出;通过对外接口,根据索引设置二维数组的数据.

2022-01-30 21:55:53 2062

原创 优化程序性能

注意一些在循环中可以用到的提升程序性能的方法,并且避免一些不必要的内存访问。#include<iostream>using namespace std;//实现一个功能:更新数组元素,更新值为此位置及前面元素之和。//方法1void test01(int *arr,int *sum,int len) { sum[0]=arr[0]; for(int i=1;i<len;i++) { sum[i]=sum[i-1]+arr[i]; }.

2022-01-23 22:46:34 329

原创 bomb实验phase_6

一、总体分析首先看phase_6所有汇编代码的内容。 0x00000000004010f4 <+0>: push %r14 0x00000000004010f6 <+2>: push %r13 0x00000000004010f8 <+4>: push %r12 0x00000000004010fa <+6>: push %rbp 0x00000000004010fb <+7

2022-01-22 13:31:45 822

原创 GCC编译器和GDB、Bochs调试器的使用

介绍两种工具的用法

2022-01-15 22:03:50 801

原创 通用循环双向链表

通过设计一个通用循环双向链表,以实现对由不同类型节点组成的链表进行统一管理。实现此链表的关键是如何将不同类型的节点串联起来,并且能够访问节点内的数据。用途设计的链表主要用于操作系统,所以代码的运行效率是首要考虑的问题,在定义的过程中将不考虑普通函数的定义,优先选用内联函数和宏函数。思路为了将节点链接起来,所有节点必须存在公共部分,公共部分中包含能够指向前置节点和后置节点的指针。通过公共部分在节点中的偏移量,以确定节点的地址,进而访问节点内的数据,如下图。设计方法公共部分设计typedef.

2022-01-01 13:53:18 341

原创 从信号处理认识傅里叶变换

1. 傅里叶级数2. 傅里叶变换

2021-12-23 13:47:07 2608

原创 人工神经网络初步

1. 什么是神经网络【百度百科】人工神经网络(Artificial Neural Network,即ANN ),是20世纪80 年代以来人工智能领域兴起的研究热点。它从信息处理角度对人脑神经元网络进行抽象, 建立某种简单模型,按不同的连接方式组成不同的网络。在工程与学术界也常直接简称为神经网络或类神经网络。神经网络是一种运算模型,由大量的节点(或称神经元)之间相互联接构成。每个节点代表一种特定的输出函数,称为激励函数(activation function)。每两个节点间的连接都代表一个对于通过该连接信

2021-12-19 14:05:16 849

原创 概率论与数理统计复习

2021-12-18 23:01:16 802

原创 关于内联函数

前言在程序设计中为什么要使用函数,首先来看下函数的定义:许多程序设计语言中,可以将一段经常需要使用的代码封装起来,在需要使用时可以直接调用,所以,函数也可以说是许多代码的集合。也就是说把实现某一功能的代码进行封装起来形成函数。函数的类型有很多,这里主要比较普通函数,宏定义函数以及内联函数。1. 普通函数普通函数是相对常见的函数,将实现某一功能的代码封装成普通函数,同时也会付出相应的代价。下面代价的分析引自这篇文章C语言宏定义和宏定义函数。1.函数调用会带来额外的开销,它需要开辟一片栈空间,记录返

2021-12-16 19:00:26 567

原创 关于static关键字

1. 宏定义函数2. 内联函数

2021-12-16 15:20:44 254

原创 从信号处理认识卷积

跟随祖师爷奥本海姆学的。1. 线性时不变系统线性时不变系统具有这样的特性: 对输入的线性组合的响应是单个响应的相同的线性组合。时不变性的性质表明系统对时间原点不敏感。更具体地说,如果输入在时间上移动了一定的量,那么输出也简单地移动了相同的量(系统对输入的处理不随时间变化)。线性的重要性体现在,对于系统输入信号可以分解为一些线性组合的基本的输入信号,那么响应可以被构造成对应每一个基本输入的线性组合。信号(或函数)可以以多种方式分解为基本信号的线性组合。例如,我们可以考虑用多项式形式表示一

2021-12-15 23:09:47 3929

原创 ucoreOS-lab0

前言对操作系统学习中的一些关键知识进行了总结,跟随课程是清华大学《操作系统》慕课课程。一、 环境的搭建因为课程需要的是Linux实验环境,我采用的是WSL下的Linux环境,相比于虚拟机感觉轻便点,也避免了双系统方案不能用Windows的不便。WSL的具体安装步骤可以参考这个链接。下面进行软件的安装,在课程的实验手册中已经对需要的软件进行了详细说明。主要用到的软件有Vim(负责代码的阅读,编辑等),gcc(代码编译),gdb(代码调试),diff、patch(比较代码、文本和文件夹差异),还有一个非常

2021-12-12 11:56:04 1015

原创 【基础入门】Makefile

在学习Makefile的时候最好是一边熟悉语法规则一边手敲代码进行验证,只是看的话,看完了也就忘完了没有深刻的体会。文中部分内容参考至阮一峰Make命令教程一、make命令还记得我第一次接触make命令是在做毕业设计,使用Linux系统安装开源软件的时候,那时候就是跟着安装教程一步一步执行命令行操作,每执行一个命令,屏幕上就会蹦出一大串看不懂的输出,那时候感觉好高级。比如在安装文件的主目录下新建一个build文件夹,然后进入打开终端,输入cmake ../src,之后make一下。现在来看在bui

2021-12-12 10:31:50 559

原创 AT&T汇编语言

内联汇编通常是指在 C/C++ 代码中嵌入的汇编代码,内联汇编方式两个作用,一是程序的某些关键代码直接用汇编语言编写,可提高代码的执行效率;二是有些操作无法通过高级语言实现,或者实现起来很困难,必须借助汇编语言达到目的。{ int a=10, b; asm ("movl %1, %%eax; movl %%eax, %0;" :"=r"(b) /* output */ :"r"(a) /* input */ :"%eax"); /* clobbered register */}在上例中,我们使用汇编指

2021-12-11 22:16:40 2739

原创 计算机组成原理一篇过

早期冯诺依曼机“存储程序”的概念是指将指令以二进制代码的形式事先输入计算机的主存储器(内存),然后按其在存储器中的首地址执行程序的第一条指令,以后就按该程序的规定顺序我行其他指令,直至程序执行结束。冯·诺依曼计算机的特点:1,计算机由五大部件组成2,指令和数据以同等地位存于存储器,可按地址寻访3,指令和数据用二进制表示4,指令由操作码和地址码组成5·存储程序6.以运算器为中心(输入/输出设备与存储器之间的数据传送通过运算器完成)?现代计算机结构主.

2021-12-11 21:21:05 2101

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除