自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(29)
  • 收藏
  • 关注

原创 汇编的杂乱无章

从汇编的角度理解程序(三)—— 函数调用我们已经知道,程序是按顺序执行的指令流水线(PipeLine)。分支和循环逻辑,可以通过在流水线中往后跳或往前跳实现。其实,函数调用也不过是在跳转。调用某个函数,就跳转到那个函数的指令流的开始位置,函数执行完成后,再跳转回来。函数能获取外部写入的数据(输入),能持有自己独特的数据(本地状态),还能向外部写数据(输出)。而理论上程序所拥有的函数数量是无限的,但是寄存器的数量却很少,无限的函数怎么通过有限的寄存器数量来保存它们各自的数据呢?一、 如何通过跳转实现函

2021-10-22 20:06:05 179

原创 汇编的杂乱无章

从汇编的角度理解程序(三)—— 函数调用我们已经知道,程序是按顺序执行的指令流水线(PipeLine)。分支和循环逻辑,可以通过在流水线中往后跳或往前跳实现。其实,函数调用也不过是在跳转。调用某个函数,就跳转到那个函数的指令流的开始位置,函数执行完成后,再跳转回来。函数能获取外部写入的数据(输入),能持有自己独特的数据(本地状态),还能向外部写数据(输出)。而理论上程序所拥有的函数数量是无限的,但是寄存器的数量却很少,无限的函数怎么通过有限的寄存器数量来保存它们各自的数据呢?一、 如何通过跳转实现函

2021-10-22 20:02:35 261

原创 无符号格式化输出的区别%d,%u?

上来就是重点unsigned int uint;int i = -1;uint = i;printf("%x %u %d\n", uint, uint, uint);printf("%x %u %d\n", i, i, i);//输出 ffffffff 4294967295 -1 ffffffff 4294967295 -1/* 因为 根据打印格式打印的 %d 有符号32位整数 %u 无符号32位整数 %lld 有符号64位整数*/uint = 0xffffffff;i =

2021-10-13 13:01:16 6966 1

原创 虚拟机NAT模式下物理主机和虚拟机ping的问题

原文链接:https://blog.csdn.net/ww1473345713/article/details/51490525在NAT模式下物理机无法ping通虚拟机​ 今天在做一个端口转发实验时遇到了一个问题,发现在NAT模式下自己的虚拟机可以ping通物理机,但是物理机ping不同虚拟机。自己又不想换成桥接模式,怎么办呢,我也不知道。​ 众所周知,在NAT模式下,物理机和虚拟机互相通信是完全没有问题的,那么问题就应该出现在外地网络配置上面。原因:最大的原因可能是因为VMware Networ

2021-09-07 00:35:46 1196

原创 如何理解存储器层次

转: https://zhuanlan.zhihu.com/p/51869081随着摩尔定律指引下半导体行业的发展迅猛,CPU运算能力显著增长,此时如何构建与之匹配的高效存储器问题随之而来。这问题好比诸位解题高手,约莫五分钟就解出手头卷子的题目,但下一套卷子尚需半小时才能从教务处慢慢悠悠送来。这自然不能忍耐。本文尝试通俗地解释计算机高效运行的基础:存储器层次结构Memory hierarchy在这里插入图片描述看图很头大吧?下面尽量通俗地从构建和运行两个角度解读“层次结构:Cache、TL

2021-09-05 23:39:35 121

原创 计组概念简记

程序:程序由一些指令组成指令:这里的指令指 MOV AX,BX这样的汇编指令机器指令:机器指令是指令翻译后的结果,比如上面的指令翻译结果为89D8微指令:机器指令是由数个微指令组成,且每一个时钟周期对应一个微指令,比如MOV AX,BX,应该由这些微指令组成:取值周期:时钟周期①:(PC)->MAR (控制信号PCout = 1,MARin = 1)时钟周期②:M->MDR (控制信号MEMR = 1,MDRinE = 1)时钟周期③:(PC)+1->PC (控制信号

2021-08-17 23:19:56 413

原创 内存的基本常识

ROM属于内存ROM是内存中的一种,也称作只读存储器,只能读出事先所存数据的固态半导体存储器为广义上内存指Cache、ROM和RAM三部分,其中Cache现在是做在CPU里面的,ROM在主板上,用来存放BIOS,装机内存指的是RAM。只能读出事先所存数据的固态半导体存储器。...

2021-08-14 20:56:49 102

原创 BCD码的一些事

在生活中用的最多的数字是十进制数字,而计算机系统的所有数据本质上都是0-1这种二进制的我们如果直接使用二进制表示十进制,会发现需要大量的权值来换算。为了方便换算,便于人们处理,就发明了一种一一对应关系的BCD码。BCD码(Binary-Coded Decimal),亦称为二-十进制代码。用4位二进制数来表示1位十进制数中的0~9这10个数字,是一种用二进制编码的十进制代码。BCD码这种编码形式利用了四个位元来储存一个十进制的数码,使二进制和十进制之间的转换得以快捷的进行。其中的合理范围外是什么呢?

2021-08-11 15:44:13 589

原创 进制之间转换

二进制到八进制或者十六进制的转换进制的常见书写方式十进制到二进制的转换方法 - 除模取余(倒序)关于小数部分 - 乘模取整(正序)

2021-08-11 15:21:32 92

原创 原码、反码和补码

8位编码范围表汇总1、原码源码的范围:-127 ~ +127,最高位是符号位,0表示正数,1表示负数[+127]原 = 0 1111111[-127]原 = 1 1111111数值“0”由两种原码表示形式:[+0]原 = 0 0000000[-0]原 = 1 00000002、反码源码的范围:-127 ~ +127,最高位是符号位,0表示正数,1表示负数[+127]反 = 0 1111111[-127]反 = 1 0000000数值“0”由两种反码表示形式:[+0]反 = 0

2021-08-10 22:00:38 5373 12

原创 列表List

List 列表1.引出list - 类似数组和结构体的综合如何通过一个变量存储公司所有员工的名字?2.列表的功能创建、查询、切片、增加、修改、删除、循环、排序3.列表的定义和创建定义:[ ] 内以逗号分隔,按照索引,存放各种数据类型,每个位置代表一个元素复制代码list创建1 (推荐)>>> names = []>>> names[]list创建2>>> list()[]>>> names = list

2021-08-09 22:45:48 557

原创 字符编码的一些概念

1.二进制定义二进制是计算技术中广泛采用的一种数制。二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”,由18世纪德国数理哲学大师莱布尼兹发现。当前的计算机系统使用的基本上是二进制系统,数据在计算机中主要是以补码的形式存储的。计算机中的二进制则是一个非常微小的开关,用“开”来表示1,“关”来表示0。我们发现刚刚我们讲述的狼烟的故事和现在这个新理论出奇相似。假设狼烟点燃用1表示,狼烟灭掉用0表示,那么刚刚我们用狼烟表示百万雄师的理论就可以用在计算机上,这种

2021-08-09 19:56:30 194

原创 《操作系统》之I/O系统

计算机的两个主要工作是I/O和处理,在很多情况下,主要工作是I/O,而处理只是附带的。例如:当浏览器网页和编辑文本时,直接兴趣是读取或者输入信息,而非计算。计算机的操作系统I/O 的功能是,管理和控制I/O 操作和I/O设备。概述计算机设备的控制是操作系统的设计人员的主要关注之一。因为I/O设备的功能与速度差异很大。所以需要采用不同的方法来控制设备,这些方法构成了内核的I/O子系统。I/O设备技术呈现两个冲突趋势。一方面。软件和硬件的接口标准化日益增长。这个趋势有助于将改进和升级设备,从而可以集成到

2021-08-07 23:21:39 1564

原创 《操作系统》之文件系统篇(二)- 文件系统实现

文件系统结构文件系统本身通过由许多不同层组成,每层的设计利用更低层的功能,创造新的功能。I/O控制层(I/O control):包括设备驱动和中断处理程序,以在主内存和磁盘系统之间进行信息交流。基本文件系统(basic file system): 本层需要发送通用命令给设备驱动层,并且还要管理内存缓冲区和保存各种文件系统,目录和数据块的缓存。文件组织模块(file-organization module): 知道文件及其逻辑块以及物理块。由于知道所用的文件系统的类型和文件位置,文件组织可以将逻辑块

2021-08-07 19:53:39 563

原创 《操作系统》之文件系统篇(一)- 基本概念

基本概念文件文件是操作系统对存储设备的物理属性加以抽象定义的逻辑存储单位。文件包括文件的属性和操作:属性包括:名称,标识符,类型,位置,尺寸,权限,创建和修改时间,文件的所有者和使用者等等。文件的操作包括:创建文件,读文件,写文件,重新定位文件的读写位置,删除文件和截断文件。进行文件操作的实质?上面的文件操作涉及搜索目录。为了方便文件操作的搜索更简单,许多系统在首次使用文件之前进行系统调用open()。 操作系统在内核上维护一个打开文件表用于维护所有打开文件的信息。当进行访问文件时,直接使用这

2021-08-07 16:34:15 465

原创 《操作系统》之磁盘篇(二)-RAID结构

本来打算在磁盘(一)中讲,但是RAID在后面的文件系统中很重要,所以单独提出来。RAID结构磁盘冗余阵列(Redundant Array of Independent Disk, RAID) 是由多块硬盘通过RAID 控制器控制管理组成的一个更大容量的逻辑盘,在操作系统中识别为一个盘符。RAID什么是RAID?RAID :磁盘阵列1988年由加利福尼亚大学伯克利分校提出来的。多个磁盘合成一个“阵列”来提高更好的性能,冗余,或都提供。RAID 可以提高磁盘I/O能力,也可以提高磁盘的耐用性。

2021-08-07 12:41:07 1760

原创 《操作系统》之磁盘篇

磁盘现代计算机系统最常用的外部大量存储就是磁盘或者硬盘。磁盘的大致结构为图上所示。他包括一系列的盘片(platter),在盘片的两面都涂着磁质材料。通过在盘片上进行磁性记录可以保存信息。读写磁头(read-write head)在一个盘片“飞行”从而可以读写数据。磁头是悬挂在磁臂(arm)上的,磁臂将所有磁头作为一个整体和进行一起移动。每一个磁盘的盘片(platter)上逻辑的可以分为磁道(track)。磁道又可以分为扇区(sector)。同一磁道上的柱面形成了柱面(cylinder)。每个磁盘驱

2021-08-07 12:24:23 920

原创 操作系统个人见解之内存篇

1.逻辑地址和物理地址?进程的地址空间。内存,虚拟内存和交换空间是怎么回事? 为什么进程地址空间可以比物理内存大?个人理解这个这个问题就通俗的比喻下就是一座高楼,和图纸的比喻。(虽然这个在后面分页分段的映射上不能使用,但是这是一个区别物理和逻辑地址好的方法)。物理地址就是楼层的建好后的实体, 每个物理地址代表这个楼房的一个位置。逻辑地址就好比手里拿到的工程师拿到图纸,你也可以通过地址指出楼的不同位置,但是只是逻辑上的,而不是实际运行的。进程的地址空间其实也类比下,实际的物理地址空间。比如32位的物理

2021-08-07 00:58:47 99

原创 《操作系统》之内存篇(七)-内存分配,伙伴系统,slab策略

分配内核内存在用户模式下运行进程请求额外的内存时(new, malloc)时,从内核【操作系统】维护的空闲页帧列表上分配页面(书上的这句话,我理解为,new和malloc的时候,在虚拟空间会在堆空间进行申请内存,但是映射到物理内存,需要重新分配物理帧,而这个帧是由内核维护的空闲帧列表上来的)。这个帧的列表是用来进行页面置换的,所以在它相邻的部分,不一定是来自于进程的同一个连续的虚拟内存,而是来自于物理内存的不同空闲页面。而且在用户申请单个字节的时候,他为了避免内存碎片,会分配整个帧给进程。用于内核分配

2021-08-07 00:54:43 852

原创 《操作系统》之内存篇(六)-内存映射

内存映射文件假设采用标准系统调用open(), read(), write()来顺序读取磁盘文件。每个文件的访问都需要系统调用和磁盘访问。或者采用虚拟内存技术,将文件I/O作为常规的内存访问。这种方法称为内存映射文件,它允许虚拟内存和文件进行逻辑关联。基本机制实现文件的内存映射,是将每个磁盘块映射到一个或者多个内存页面。(注意这里是内存页面,内存页面,内存!!!重要的事情说三遍)最初,文件访问按普通请求调页来进行,从而产生缺页错误。这样,**文件的一个页面或者多个页面大小的内容从文件系统读取到了物理

2021-08-07 00:34:30 1552

原创 《操作系统》之内存篇(五)-页面置换

页面置换在内存分配页面的时候,不仅用于保存程序页面,用于I/O 的缓冲也需要消耗大量的内存,这种使用会增加内存置换算法的压力。确定多少内存给用户程序,多少内存给I/O缓冲去是个很棘手的问题,有的系统给I/O缓冲分配了固定百分比的内存,有些系统则允许用户进程和I/O子系统进行竞争所有内存。基本概念当用户进程在执行时,可能发生缺页错误。操作系统确定所需要页面的磁盘位置,但是却发现内存上没有空闲的帧。所有内存都在使用。这时,操作系统不能终止一个进程来释放,因此这样太不友好了。此时,它会选择交换出一个进程,以

2021-08-07 00:26:29 610

原创 《操作系统》之内存篇(四)-虚拟内存

经过以前的学习,了解到了内存的管理策略。不管是分页,还是分段,或者是页表的管理策略。这些都有一个共同的目标:将多个进程都保存在内存中,这一操作,都是为了保证在进程启动时,进程处于内存中。但是虚拟内存技术允许执行进程不必完全处于内存。这就使得程序可以完全大于物理内存,从而在开发的过程中,程序员不用担心内存的限制。基本概念**虚拟内存:**虚拟内存可以是一种逻辑上扩充物理内存的技术。它会把进程的逻辑地址空间进行扩展。(书中说的虚拟内存,可以看做是假象的逻辑内存,虽然在平常使用top 命令看到了虚拟内存表示

2021-08-07 00:08:23 207

原创 《操作系统》之内存篇(三)-分页的页表结构

之前讨论了分段和分页,现在看下页表的主要涉及的页表结构。分层分页大多数现代计算机系统支持大逻辑地址空间(2^32 ~ 2^64)。这种情况下,页表本身可以非常大。例如:假如具有32位逻辑地址空间的一个计算机系统。如果系统的页大小为4KB(2^12)。那么页表可以多达100万的条目 (2^32/ 2^12)。假设某个项目有4字节。那么每个进程需要4MB的地址物理地址来存储页表本身。显然,我们并不想在内存中连续分配这么多页表。这个问题的一个简单的解决方法就是讲页表划分为更小的块。完成这种划分方法有很多种

2021-08-06 23:48:37 2832

原创 《操作系统》之内存篇(二)-分段-分页

分段 基本概念在编写代码的时候,程序员认为它是由主程序加上一组方法,过程或者函数的集合。他还包括这种数据结构:对象,数组,堆栈,变量。每个模块或者数据元素通过名字来引用。而不关心具体的内存位置。分段就是支持这种用户视图的内存管理方法。逻辑地址空间是由一组段构成。每个段都有名称和长度,比如,代码段,数据段,堆栈,堆等等。地址指定了段名称和段内偏移。所以段一般是由两个量来进行表示:<段号, 偏移>通常,在编译用户程序的时候,编译器会自动生成:代码全局变量堆栈程序库分段的硬

2021-08-06 23:21:22 704

原创 《操作系统》之CPU调度

基本概念根据之前进程一章中的介绍,进程的执行一般会分为两个执行周期:CPU执行和I/O等待。**抢占调度:**在进程执行的过程中,CPU被操作系统中断而执行其他进程的调度,称为抢占调度。**非抢占调度:**一个进程分配到CPU 后,该进程会一直占用CPU,直到它终止或者切换到等待状态。进程调度算法先到先服务(First-Come First-Served, FCFS)最简单的调度算法:可以采用FIFO队列实现。最短作业优先(Shortest-Job-First, SJF)当CPU变为空闲时

2021-08-06 23:04:25 365

原创 《操作系统》之内存篇(一)

《操作系统概念精要》之内存篇(一)基本概念内存是现在计算机运行的核心。CPU可以直接访问的通用存储只有内存和处理器的内置寄存器。机器指令可以用内存地址作为参数,但是磁盘地址不可以。在访问速度上,寄存器的内容一般都可以在一个时钟周期解释并执行完。但是对于内存,可能需要多个时钟周期。所以为了访问速度上能更加快速,一般会有高速缓存。在系统安全上,首先,用户的进程不能影响操作系统的执行; 在多用户系统上,还应该保护不同的进程之间不能互相影响。所以一般会有专门的硬件方式来进行保护。为了进程之间不会相互影响,

2021-08-06 22:59:03 392

原创 杂草丛生的C

scanf中。格式化输入字符串时候%s遇到空白符就会停止,类似的空白符有空格、制表符、换行符。最后这些还会滞留在缓冲区。printf中,%s输出字符串是直到字符串结束符’\0’才停止。

2021-03-28 01:12:47 90

原创 力扣刷题记录 - 203 移除链表元素

C:/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */struct ListNode* removeElements(struct ListNode* head, int val){ struct ListNode *p; if(head == NULL) // 对开始结点进.

2021-02-06 17:46:35 104

原创 力扣刷题记录 -1、 两数之和

我的解法:C:/**Note: The returned array must be malloced, assume caller calls free().首先搞清楚函数中的形参的意思:int* nums表示传进去一个数组的地址;int numsSize表示传进去的数组大小;int target表示数组中两数相加需要等于的值;int* returnSize表示返回的数组的大小。/int twoSum(int* nums, int numsSize, int target, int.

2021-02-06 17:40:37 72

空空如也

空空如也

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

TA关注的人

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