首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

操作系统学习笔记-计算机系统概述

等鸡蛋炒的差不多了之后我要开始下西红柿,但是我却发现没有西红柿,于是我又去菜市场买来西红柿,回家继续做饭。这样的做饭过程实在是过于繁琐,于是乎出于方便考虑,我决定买一台冰箱。...在每个指令周期开始时,处理器从存储器中取一条指令。在典型的处理器中,程序计数器(Program Counter,PC)保存下一次要取的指令地址。...例如,考虑一个简化的计算机,每条指令占据存储器中一个16位的字,假设程序计数器PC被设置为地址300,处理器下一次将在地址为300的存储单元处取指令,在随后的指令周期中,它将从地址为301、302、303...程序的执行顺序取决于它们的相对优先级和是否在等待I/O 当程序被中断时,控制权转移给中断处理程序 中断处理程序完成,控制权有可能不返回到之前被中断的应用程序,而是转移到其他等待运行的具有更高优先级的程序...容量递增 存取时间递增 处理器访问存储器的频率递减 局部性原理 在CPU访问寄存器时,无论是存取数据或存取指令,都趋于聚集在这一片连续的区域中,这就是局部性原理。

72910

源头活水-perf events分类

在这里,我们给出一些事件相关的含义: 事件名 含义 cpu-clock cpu-clock,可以看成是cpu执行的计数器 task-clock 某个任务在cpu上运行时的clock数 page-faults...CPU间迁移的数量,过多的话可能会导致缓存失效 minor-faults 是缺页中断的一部分,指的是访问在内存中但是没有映射到程序地址空间的页发生的错误 major-faults 是缺页中断的一部分,指的是访问不在内存中的页...比如在A时刻某事件计数器触发了,内核在A+2周期来拿数据,这会导致数据的失真。我们可以参考硬件厂商的手册来了解硬件事件,后续我们也会介绍类似PEBS这样的更高级的硬件事件特性。...分支预测失败的指令情况,过多的分支预测失败也会影响程序的运行速度 cpu-cycles cpu的时钟情况,和cpu-clock不是一个概念 stalled_cycles_frontend cpu前端的停滞周期数...,cpu的前端是负责解码的部分,停滞可能是因为I-cache失效,如果停滞会导致后端空转 stalled_cycles_backend cpu后端的停滞周期数,cpu的后端负责执行前端解出来的微指令,停滞可能是因为指令的关键路径较长或者访存拖慢了运行

34120
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    探索CPU的黑盒子:解密指令执行的秘密

    引言在我们之前的章节中,我们着重讲解了CPU内部的处理过程,以及与之密切相关的数据总线知识。在这个基础上,我们今天将继续深入探讨CPU执行指令的相关知识,这对于我们理解计算机的工作原理至关重要。...在地址0100和0101处的指令是按顺序执行的,程序计数器(PC)的值递增。当执行到地址0102处的指令时,会判断寄存器0106的数值是否大于0。...在不满足条件的情况下,指令会直接跳过。因此,程序计数器的执行过程不是简单地递增1,而是跳转到下一条指令的地址。函数调用机制接下来,我们将继续介绍函数调用机制。...在将函数的入口地址设置到程序计数器之前,call指令会将调用函数后要执行的指令地址存储在名为栈的主存中。函数处理完毕后,通过函数的出口执行return指令。...return指令的功能是将保存在栈中的地址设置到程序计数器。例如,当调用MyFun函数之前,地址0154被保存在栈中。在MyFun函数处理完成后,将会将0154的地址保存在程序计数器中。

    43220

    计算机的组成是什么样的?计算机的指挥中心CPU为啥那么强大?

    程序相对地址:指向当前程序计数器指向的地址加上一个有符号数,这种寻址方式主要用于代码中的分支指令,您可以将其视为基本偏移量的特例。...3.4 程序计数器 CPU 从程序计数器指向的内存中读取机器码,分析其含义,执行,并写入结果。...获取完成后,将程序计数器递增 1,还有一些指令会为程序计数器赋一个特定的值,即移动程序计数器(称为分支指令)。...子程序调用当一条指令被取/译码时,当前程序计数器值被写入执行/存储周期中栈指针所指示的地址,栈指针和将要调用的子程序的地址分配给程序计数器。...另一方面,当获取/解码退出子程序并返回的指令时,堆栈指针在执行/存储周期中递减,从堆栈指针指示的地址读取值,并且值分配给程序计数器。增加。

    52420

    ​Linux内核透明巨型页支持

    因此这些组件 可以继续在常规页面或常规pte映射上工作。 如果由于内存碎片而导致大页面分配失败, 常规页面应该优雅地分配和混合在 相同的vma中,没有任何故障或重大延迟,没有用户感知。...应用程序不需要修改就可以利用它。 然而,应用程序可以进一步优化以利用这个功能,就像他们之前优化过避免每个malloc(4k)都需要大量的mmap系统调用。...thp_split_pmd: 每当pmd分裂成pte表时,thp_split_pmd就会递增。例如,当应用程序调用mprotect()或unmap()在大页面的一部分。...如果您没有遍历页表,但是遇到了一个物理的大页,但是您不能在代码中原生地处理它, 您可以通过调用split_huge_page(page)来分裂它。这就是Linux VM在尝试切换大页面之前所做的。...持有页表锁将防止巨型的PMD被转换成一个常规的PMD(split_huge_pmd可以与页表遍历并行)。如果第二个pmd_trans_huge返回false,则应该释放页表锁并回退到之前的旧代码中。

    2.8K40

    React 开发者常犯的 3 个错误

    直接修改状态 在更新 React 组件状态时,最重要的是调用 setState 方法去更新,并且传入的对象是一个新的副本,而不是直接修改之前的状态。...问题在于 React 状态更新可以批处理(batchUpdate),这意味着多个状态更新可以在一个更新周期中发生。...类似的递增计数器也是如此。...如:在 React 内部生命周期以及事件处理函数中是异步的。 如:在 setTimeout 函数中调用 setState 却是同步的。...以上就是今天给大家分享的 React 中的三个常见错误及其纠正方法。记住,犯错误是正常的,但要避免犯同样的错误。你在学习、我在学习、我们都在学习。让我们继续学习,一起变得更好。

    88230

    谢宝友:深入理解RCU之六:分级RCU基础

    无条件的read-to-write提升,在LINUX内核中,有几个地方需要这样使用。 8. 兼容的API。 9. 抢占RCU读端临界区的要求可以被去掉。 10....在经典RCU中,6个CPU在每一个优雅周期内竞争同一个全局锁,在上图中,仅仅是三个节点竞争最上层的rcu_node锁 (降低了50%)。...在一个很繁忙的系统上,通常的路径是最上面的两个循环。在每一个优雅周期(GP)开始时进行初始化,等待静止状态 (QS)。在一个特定的优雅周期中,当每一个CPU都经历过静止状态时,它其实什么都不用做。...rcu_enter_nohz() 函数递增每CPU dynticks_nesting变量,也递增每CPU dynticks计数器,然后,后者必然拥有一个偶数值。...在某些地方,在可抢占RCU实现中使用分级是有必要的。 后续章节将继续分析分级RCU的代码,以及Linux中其他一些RCU的实现。也许还会讨论实现RCU这类复杂并行软件的开发方法及其形式化验证。

    1.1K10

    你想了解的JDK 10版本更新都在这里

    单就下载 JDK 时,所看到的简短版本字符串形式来说,在 7u40 版本之前,u 之后的数字,代表了 JDK 发布以来的第几个修正版本,然而 Oracle 改变规则,为了彰显出安全之类的重大 修补(Cirtical...为此,之前既有的 JDK 6/7 发布版本,还被重新命名。...版本号的新模式是: FEATURE.INTERIM.UPDATE.PATCH $ FEATURE:计数器将每 6 个月递增一次,并基于功能发布版本,例如:JDK 10,JDK 11。...在 Java 9 之前,我们必须明确写出局部变量的类型,并确保它与用于初始化它的初始化程序兼容: String message = "Good bye, Java 9"; 在 Java 10 中,这是我们可以声明局部变量的方式...此源代码布局有几个缺点: 对于GC开发人员,实施新的垃圾收集器需要有关所有这些地方的知识,以及如何扩展它们以满足其特定需求的知识。

    89030

    简易RISC软核CPU设计

    软核(Soft IP Core) : 软核在EDA 设计领域指的是综合之前的寄存器传输级(RTL) 模型;通常遍是指以HDL代码(Verilog,VHDL...)为形式的可综合源代码;固核(Firm IP...指令寄存器、累加器、算术逻辑运算单元、数据控制器、状态控制器、程序计数器、地址多路器等基本部件。是用于实现根据特定指令集生成的汇编代码的硬件运行环境。...cpu的工作大致分为以下几个步骤; ? 1:取指。该阶段从内存中读取指令,PC(程序计数器)制定指令的地址。 2:译码。该阶段将从内存读取的指令翻译为各种操作。并从寄存器中取出操作数。 3:执行。...在CPU的工作流程中,首先读取PC(程序计数器)指向的地址的指令,送入到译码模块,译码器对opcode指令进行译码,经过译码之后得到指令需要的操作数寄存器索引,可以使用此索引从通用寄存器组(Register...地址的选择输出信号由时钟信号的 6 分频 fetch 提供。 ? 图 7 地址多路器原理图 4.7 程序计数器 它用于提供指令地址,以便读取指令。指令按地址顺序存放在存储器中。

    1.2K40

    ava多线程:volatile变量、happens-before关系及内存一致性

    程序执行期间,为了获得更好的性能,CPU 可能会将变量拷贝到自己的内存中(即所谓的 CPU 缓存)。由于现代计算机有多个 CPU,同样也存在多个 CPU 缓存。...在多线程环境下,有可能多个线程同时执行,每个线程使用不同的 CPU(虽然这完全依赖于底层的操作系统),每个 CPU 都从主内存中拷贝变量到它自己的缓存中。...所以,所有在 volatile 变量写操作之前完成的写操作,将会对随后该 volatile 变量读操作之后的所有语句可见。 嗯…,好吧…,我有点明白了,但是可能通过一个例子会更清楚。...因为我们的写操作在访问 hasValue 之前,读操作在 hasValue 的读之后,它会自动与主内存同步。 还有另一个有趣的结论。JVM 因它的程序优化机制而闻名。...你可以认为递增操作如下: 读取计数器的值。 加 1。 将新的值写回计数器。 递减操作的过程如下: 读取计数器的值。 减 1。 将新的值写回计数器。

    73720

    linux系统编程之基础必备(一):计算机体系结构一点基础知识

    :  与外频相同或者是外频的倍数 –总线数据带宽:  (总线频率 * 数据位宽)/ 8     无论是在CPU外部接总线的设备还是在CPU内部接总线的设备都有各自的地址范围,都可以像访问内存一样访问,...操作系统(OperatingSystem)本身也是一段保存在磁盘上的程序,计算机在启动时执行一段固定的启动代码(称为Bootloader)首先把操作系统从磁盘加载到内存,然后执行操作系统中的代码把用户需要的其它程序加载到内存...我们在程序中使用的变量和函数都有各自的地址,程序被编译后,这些地址就成了指令中的地址, 指令中的地址被CPU解释执行,就成了CPU执行单元发出的内存地址,所以在启用MMU的情况下,程序中使用的地址都是虚拟地址...CPU在产生中断或异常时不仅会跳转到中断或异常服务程序,还会自动切换模式,从用户模式切换到特权模式,因此从中断或异常服务程序可以跳转到内核代码中执行。...,用户程序只能通过寄存器传几个参数,之后就要按内核设计好的代码路线走,而不能由用户程序随心所欲,想调哪个内核函数就调哪个内核函数,这样可以保证系统服务被安全地调用。

    1.4K50

    从SDN-Washing到SDN-Hiding

    在过去的六个月中,我参加了不少的贸易展览,并与众多的企业和通信服务提供商进行了交谈,我开始思考软件定义网络在流行的Gartner炒作周期中处于什么位置。 ?...然而,在过去6个月的主要贸易展览会上,我们可以发现在许多主要厂商和运营商的展品和信息中,SDN几乎从他们的营销信息中消失了。...在企业市场中,所有处于边缘的SDN都聚集在SD-WAN的保护伞下,并且从消息传递的角度来看,数据中心的SDN大部分已经消失了。在园区网络中,SDN起初就没有很多。...在移动端,也很少能看到在核心、传输或边缘提及SDN。 SDN自2016年以来一直处于萎靡不振的低谷中吗?还是发生了别的事情? 精明的营销 我认为SDN没有出现在营销信息中有几个原因。...如果我是一家公司的首席执行官,并且看到我的一项关键技术已经被贴上了过度炒作的标签,并滑向幻灭的谷底,那么我会让我的营销部门进行品牌重塑。为什么要让我的公司和它的产品容易受到不必要的批评和负面的影响?

    63350

    译文《Java并发编程之volatile》

    这听起来可能有点抽象,所以让我详细说明。 在多线程应用程序中,如果多个线程对同一个无声明volatile关键词的变量进行操作,出于性能原因,每个线程可以在处理变量时将变量从主内存复制到CPU缓存中。...这就可能会导致几个问题,我将在以下部分内容解释这些问题。...指令重排序的挑战 为了提高性能,一般允许 JVM 和 CPU 在保证程序语义不变的情况下对程序中的指令进行重新排序。...同时间线程2也可以从主内存中读取到相同的计数器变量,其中变量的值仍为0,存进其自己的CPU高速缓存。 然后,线程2也可以将计数器(counter)递增到1,也还未将其写回主内存。...共享计数器(counter)变量的实际值应该是2,但每个线程在其CPU缓存中的变量值为1,在主内存中该值仍然为0。真是一团糟!即使线程最终将其共享计数器变量的值写回主内存,该值也将是错误的。

    25230

    《我的Vivado实战—单周期CPU指令分析》

    作为电子计算机三大核心部件(CPU、内存、I/O设备)之一的CPU,在计算机体系结构中承载着控制调配硬件资源、执行通用运算等重要职责。下面我们来了解较为简单的单周期CPU功能指令。...首先找到rs在本周期中存放的源操作数地址,rs=00;然后在Objects中添加immediate组件,找到立即数的值,immediate=8;最后进入ALU分析计算结果,在ALU的代码文件中有两个引脚...slti: 分析第九个周期,指令地址为6c460008,在程序测试段中,可以看到,本条指令为slti,那么现在开始检验指令slti的实现过程:指令slti的功能是:if (rs 的指令代码长度占4个字节,所以指令地址二进制数最低2位均为0,将指令地址放进指令代码中时,可省掉!...在众多信号状态中,首先从最高层开始梳理逻辑,划分模块,进而到每个模块的内部核心处继续划分,这样就避免了在信号条件变动很多的情况下不能够清晰的理清的问题。

    78410

    定时器

    功能框指令直接拖入块中,自动生成定时器的背景数据块,该块位于“系统块>程序资源”中,参见图6。 图6 自动生成定时器的背景数据块 2. 功能框指令直接拖入FB块中,生成多重背景,参见图7。...在正常程序中②的执行时间在整个扫描周期中占比很小,因此只有很低的概率可以实现脉冲。所以不能使用此种方法,第二个错误方法与之类似。 3. 如何使用定时器实现精确定时? 答:不能做到。...举例来说,定时1s的接通延时定时器,当程序扫描到定时器功能框的Q点或ET时或者扫描到背景DB(或IEC_TIMER类型的变量)中的Q点或者ET时,如果时间为997ms,只会继续定时等下一次扫描,而下一次扫描到可能就是...IEC_COUNTER6计数值为 INT 数据类型的计数器结构。 例如,此数据类型用于“CTU”、“CTD”和“CTUD”指令。IEC_UCOUNTER6计数值为 UINT 数据类型的计数器结构。...在块接口中,将 IEC 定时器声明为结构中多重实例的语法如下所示: IEC 定时器声明为 ARRAY 元素 块接口中的声明 程序代码: SCL#MyARRAY[1].TOF(IN := ,

    4.8K30

    python——循环(for循环、while循环)及练习

    大家好,又见面了,我是你们的朋友全栈君。...目标程序的三大流程 1.while 循环的基本使用 2.break 和 continue 3.while 循环嵌套 在程序开发中,一共有三种流程方式: 顺序:从上向下,顺序执行代码 分支:根据条件判断...,决定执行代码的分支 循环:让特定代码重复执行(解决程序员重复工作) 一、for循环 1、基本用法 for 循环使用的语法: “”” for 变量 in range(10): 循环需要执行的代码...实现命令行提示符 break:跳出整个循环,不会再执行循环后续的内容 continue:跳出本次循环,continue后面的代码不再执行,但是还是会继续循环 exit():结束程序的运行...*,每一行星号的数量依次递增 2.完成 5 行内容的简单输出 分析每行内部的*应该如何处理 输出 * ** *** ***** ******* 如下: 第一种: # 1.控制行 for

    3.2K20

    Linux从头学02:x86中内存【段寻址】方式的来龙去脉

    这篇文章我们就来继续挖掘一下,8086 这个开天辟地的处理器中,是如何利用段机制来对内存进行寻址的。 什么是代码段? 在上一篇文章:Linux 从头学 01:CPU 是如何执行一条指令的?...我们在高级语言编程中(eg: C 语言),在定义一个变量的时候,必须明确这个变量的类型是什么。一旦类型确定了,那么它在被加载到内存中之后,所占据的空间大小也就确定了。 比如下面这张图: ?...我们知道,在 C 语言中,假如有一个指针 ptr 最终指向了这里的 30000H 物理地址处(C 代码中的 ptr 是虚拟地址,经过地址转换之后执行这里的 30000H 物理地址)。...PS: 之前我曾说过,文章的主要目的是学习 Linux 操作系统,但是为了学习一些相对底层的内容,在开始阶段必须抛开操作系统的外衣,进入到硬件最近的地方去看。 但是该怎么看呢?...CPU 在执行这条指令的时候,就会到 30000H(假设此时数据段寄存器 DS 的值为 3000H) 这个物理地址处,取出 2 个字节的数据,放到通用寄存器 ax 中,此时 ax 寄存器中的值就是 2211H

    1.7K30

    计算机小白的成长历程——分支与循环(7)

    如果我们从case1进入,则程序会从case1里的执行语句开始执行,也就是流程图中的执行语句1一直执行到遇到break; 如果我从case2进入,则case1的执行语句被跳过,程序直接从case2里的执行语句开始执行...可以在评论区分享出来。接下来我们来看第三题: 4.编写代码求两个数的最大公约数 这一题我们先要解决几个问题: 1.什么是最大公约数?...几个整数中公有的约数,叫做这几个数的公约数;其中最大的一个,叫做这几个数的最大公约数。 2.如何求最大公约数? 求最大公约数有多种方法,常见的有质因数分解法、短除法、辗转相除法、更相减损法。...下面我们继续看下一题: 5.打印闰年(1000-2000) 这一题做之前,我们先了解一下闰年以及闰年的判定方式: 1.什么是闰年? 凡公历中有闰日(2月29日)的年份,阴阳历中有闰月的年份。...我们今天的内容就全部结束了,希望这篇内容能够帮助大家提升理解能力和动手操作能力,接下来随着学习的深入,我会继续分享我在学习中的感受,谢谢大家的翻阅,咱们下一篇见。

    21520

    Redis持久化RDB原理+伪代码实现

    在本章的最后,我们将对实际的 RDB 文件进行分析和解读,将之前学到的关于 RDB 文件的知识投人到实际应用中。...BGSAVE 因为 BGSAVE 命令的保存工作是由子进程执行的,所以在子进程创建 RDB 文件的过程中, Redis 服务器仍然可以继续处理客户端的命令请求,但是,在 BGSAVE 命令执行期间,服务器处理...例如: SET message "hello" # 程序此时将 dirty计数器增加1 SADD database Redis MongoDB MariaDB # 程序此时将 dirty计数器增加3...从 Version 5 开始,如果在配置文件中开启 rdbchecksum yes ,会在 RDB 文件的结尾处,用 8 个字节, CRC64 计算整个文件内容的检验和。...: 头5字节固定为REDIS 第6~9共四字节为 RDB 版本号 接下来为 redis-ver 和它的值,即 redis 版本 接着 redis-bits 和它的值,即 redis 的位数,值为32或64

    69320

    【linux】进程状态与优先级

    一个进程可以有几个状态(在Linux内核里,进程有时候也叫做任务),Linux更改进程状态,本质是改PCB中的状态属性 下面的状态在kernel源代码里定义: /* * The task state array...这些操作涉及到与硬件的直接交互,必须在继续执行之前完成。 数据完整性:此状态设计为不可中断,主要是为了保护数据完整性。...上下文和寄存器 进程的上下文主要包括以下部分: CPU 寄存器: 通用寄存器:这些寄存器存储了进程执行中的临时数据、函数参数、返回值等。 程序计数器(PC):指向要执行的下一条指令的地址。...保存上下文:操作系统保存当前进程的所有寄存器状态,以及必要的程序计数器和其他关键信息到该进程的进程控制块(PCB)中。 调度决策:调度器选择另一个进程执行。...恢复上下文:操作系统从即将执行的进程的PCB中恢复寄存器、程序计数器等状态信息。 执行新进程:新的进程开始执行或继续执行。 性能考虑 开销:进程切换是有成本的。

    20120
    领券