计算机指令

Interview_操作系统_day21

為{幸葍}努か 提交于 2020-03-09 21:45:12
并发和并行 并发: 同一时刻只能运行一条指令。在宏观上看起来是多个程序同时运行,但微观上是多个程序的指令交替着运行的。并发不能提高计算机的性能,只能提高效率。 并行: 同一时刻可以运行多条指令。无论从宏观还是微观,都是一起执行的。比如多核 \(cpu\) ,多个程序分别运行在不同的核上,互不影响。并行确实提高了计算机的效率。 用户态和内核态区别 操作系统两种 \(CPU\) 状态: 核心态:运行操作系统程序 用户态:运行用户程序 操作系统的指令划分: 特权指令:只能由操作系统使用,用户不能使用的指令。 非特权指令:用户程序可以使用的指令。 特权级: \(R0、R1、R2、R3\) \(R0\) 相当于内核态, \(R3\) 相当于用户态 不同的特权级别可以运行不同的指令 区别: 内核态和用户态是操作系统的两种运行级别。用户态拥有最低的特权级,核心态拥有较高的特权级。 处于用户态时,进程能够访问到的内存空间和对象受到限制,其所占有的处理机是可以被抢占的。 处于内核态时,进程能够访问所有的内存空间和对象,且所占有的处理机是不可以被抢占的。 操作系统为什么要分内核态和用户态 为了安全。在 \(cpu\) 中,如果有些指令用错会使系统崩溃,所以用户程序是不可信的,无论程序员是否有意,都可能把系统弄崩溃。 分了内核态和用户态之后,操作系统对内核级别指令进行封装,然后为用户提供系统服务

C语言编译过程总结简版

假如想象 提交于 2020-03-09 20:02:53
C语言编译过程总结详解 C语言的编译链接过程要把我们编写的一个c程序(源代码)转换成可以在硬件上运行的程序(可执行代码),需要进行编译和链接。编译就是把文本形式源代码翻译为机器语言形式的目标文件的过程。链接是把目标文件、操作系统的启动代码和用到的库文件进行组织形成最终生成可执行代码的过程。过程图解如下: 从图上可以看到,整个代码的编译过程分为编译和链接两个过程,编译对应图中的大括号括起的部分,其余则为链接过程。 编译过程 编译过程又可以分成两个阶段:编译和会汇编。 编译 编译是读取源程序(字符流),对之进行词法和语法的分析,将高级语言指令转换为功能等效的汇编代码,源文件的编译过程包含两个主要阶段: 第一个阶段是预处理阶段,在正式的编译阶段之前进行。预处理阶段将根据已放置在文件中的预处理指令来修改源文件的内容。如#include指令就是一个预处理指令,它把头文件的内容添加到.cpp文件中。这个在编译之前修改源文件的方式提供了很大的灵活性,以适应不同的计算机和操作系统环境的限制。一个环境需要的代码跟另一个环境所需的代码可能有所不同,因为可用的硬件或操作系统是不同的。在许多情况下,可以把用于不同环境的代码放在同一个文件中,再在预处理阶段修改代码,使之适应当前的环境。 主要是以下几方面的处理: (1)宏定义指令,如 #define a b 对于这种伪指令

synchronized如何高中有序性的

不想你离开。 提交于 2020-03-09 12:15:58
问题: 为什么会出现指令重排? 计算机为提升程序执行性能,可以在硬件层面和程序处理器层面做一些优化,指令重排就是优化方式之一。 指令重排会引起什么问题? 由于程序处理器进行了指令重排,可能会引起程序执行有序性的问题。 如何解决程序执行有序性问题? 针对因程序处理器层面指令重排造成的有序性问题,最简单的方法就是禁止处理器优化和做指令重排,可以通过volatile中使用内存屏障来保证。 硬件层面可遵循as-if-serial语义解决有序性问题,当程序层面是单线程执行的,那么硬件层面优化必须遵循as-if-serial语义,从而解决了硬件层面优化造成的程序执行一致性问题。 java中通过synchronized提供的锁机制,确保了在加锁和解锁过程中的逻辑执行是单线程的,也就满足了符合as-if-serial语义,从而实现了有序性。 来源: oschina 链接: https://my.oschina.net/u/1000241/blog/3190416

控制台RPG开发教程4: 筹建地图工作组2

女生的网名这么多〃 提交于 2020-03-09 11:10:15
本次教程的内容: 获取键盘输入的两种方法 地图工作组的另一个工作,是监控键盘的输入。 让我们继续研究接收输入的几种方法。 最简单的接收键盘输入方法是使用cin对象。首先尝试运行下面的例程,并随便输入一个数字。 计算机会将它加上10之后再次输出到屏幕上。 # include <iostream> using namespace std; int main(){ int a; cin >> a; a= a+ 10; cout << a; } 注意 cin和cout的 符号的方向不一样 >> 。 这里的四条指令,第一条并不是真正的指令,并没有实际的动作。它的用处是定义变量。 也就是将精灵大楼的某个房间起个名字为a,至于这个房子的实际层号楼号,我们现在并不关心。 我们知道名字不等于地址,如果你想看它的具体地址,可以用&符号来获得,&名字,就代表这个名字的地址。这条指令可以查看a房间的具体地址 ​cout << &a; ​ 第二条指令,包含两个动作,一个是电话功能指令,电话过程是这样的。 精灵:请帮我看看用户从键盘输入了什么? 控制台工作组cin>>负责人:他现在还什么都没有输入。 精灵:好的没关系,我在线等。 控制台工作组cin>>负责人:他好像开始开始输入了,用不用告诉你他输入了什么? 精灵:现在不用,等他确定(按回车键)之后你再告诉我。 控制台工作组cin>>负责人

KVM之CPU虚拟化

做~自己de王妃 提交于 2020-03-08 22:21:27
1.1 为什么要虚拟化CPU 虚拟化技术是指在x86的系统中,一个或以上的客操作系统(Guest Operating System,简称:Guest OS)在一个主操作系统(Host Operating System,简称:Host OS)下运行的一种技术。这种技术只要求对客操作系统有很少的修改或甚至根本没有修改。x86处理器架构起先并不满足波佩克与戈德堡虚拟化需求(Popek and Goldberg virtualization requirements),这使得在x86处理器下对普通虚拟机的操作变得十分复杂。在2005年与2006年,英特尔与AMD分别在它们的x86架构上解决了这个问题以及其他的虚拟化困难。 1.2 关于CPU的Ring0、Ring1··· ring0是指CPU的运行级别,ring0是最高级别,ring1次之,ring2更次之…… 拿Linux+x86来说, 操作系统(内核)的代码运行在最高运行级别ring0上,可以使用特权指令,控制中断、修改页表、访问设备等等。 应用程序的代码运行在最低运行级别上ring3上,不能做受控操作。如果要做,比如要访问磁盘,写文件,那就要通过执行系统调用(函数),执行系统调用的时候,CPU的运行级别会发生从ring3到ring0的切换,并跳转到系统调用对应的内核代码位置执行,这样内核就为你完成了设备访问

HTTP所有概念

老子叫甜甜 提交于 2020-03-08 22:08:00
HTTP所有概念 上一篇文章我们大致讲解了一下 HTTP 的基本特征和使用,大家反响很不错,那么本篇文章我们就来深究一下 HTTP 的特性。我们接着上篇文章没有说完的 HTTP 标头继续来介绍(此篇文章会介绍所有标头的概念,但没有深入底层) HTTP 标头 先来回顾一下 HTTP1.1 标头都有哪几种 HTTP 1.1 的标头主要分为四种, 通用标头 、 实体标头 、 请求标头 、 响应标头 ,现在我们来对这几种标头进行介绍 通用标头 HTTP 通用标头之所以这样命名,是因为与其他三个类别不同,它们不是限定于特定种类的消息或者消息组件(请求,响应或消息实体)的。HTTP 通用标头主要用于传达有关消息本身的信息,而不是它所携带的内容。它们提供一般信息并控制如何处理和处理消息。 尽管通用标头不会限定于是请求还是响应报文,但是某些通用标头大部分或全部用于一种特定类型的请求中。也就是说,如果某个通用标头出现在请求报文中,那么大部分通用标头都会显示在该请求报文中。响应报文也是一样的。 先列出来一个清单,讲明我们都需要介绍哪些通用标头 Cache-Control Connection Date Pragma Trailer Transfer-Encoding Upgrade Via Warning Cache-Control 缓存(Cache) 是计算机领域里的一个重要概念

计算机基础二

和自甴很熟 提交于 2020-03-08 20:22:32
一、cpu 详解 CPU 按照指令集可以分为精简指令集 CPU 和复杂指令集 CPU 两种,区别在于前者的指令集精简,每个指令的运行时间都很短,完成的动作也很单纯,指令的执行效能较佳;但是若要做复杂的事情,就要由多个指令来完成。后者的指令集每个小指令可以执行一些较低阶的硬件操作,指令数目多而且复杂,每条指令的长度并不相同。因为指令执行较为复杂所以每条指令花费的时间较长,但每条个别指令可以处理的工作较为丰富。 1、x86-64的含义 x86: 是针对 CPU 的型号或者说架构的一种统称 。 64 位: CPU 的位数指的是 CPU 一次性能从内存中取出多少位二进制指令 ,64bit 指的是一次性能从内存中取出 64 位二进制指令 。 CPU具有向下兼容性:64位的CPU 既能运行 32 位的程序也能运行 64 位的程序 2 、 内核态与用户态( 代表 cpu 的两种工作状态 ) (1)内核态:运行的程序是操作系统,可以操作计算机硬件 (2)用户态:运行的程序是应用程序,不能操作计算机硬件 内核态与用户态的转换: 应用程序的运行必然涉及到计算机硬件的操作,那就必须有用户态切换到内核态下才能实现,所以计算机工作时在频繁发生内核态与用户态的转换。 3 、多线程与多核芯片 (1)2 核 4 线程 ( 假 4 核 ) : 2 核代表有两个 cpu , 4 线程指的是每个 cpu 都有两个线程

我的面试经之JVM(一)JVM简述

穿精又带淫゛_ 提交于 2020-03-08 18:40:16
Java 跨平台语言 JVM 跨语言平台 Java进化史: 虚拟机:Virtual Machine,对硬件进行模拟的软件,虚拟的计算机 Java虚拟机:执行Jvm字节码的虚拟计算机,是二进制字节码的运行环境 JVM的位置 jvm整体结构 方法区和堆,多个线程共享 Java栈(又叫虚拟机栈),本地方发栈,程序计数器这三个每个线程独有一份 【运行时数据区是单例的,一个虚拟机一个】 【hotspot 才有方法区,其他两大商用虚拟机没有【HotSpot,JRocket,J9】】 class files前边是编译器前端 执行引擎相当于编译器后端 java代码执行流程 第一次编译,把java源文件编译成字节码.class文件,第二次编译JIT编译器把.class文件编译成机器指令文件,并且缓存到方法区 JVM架构模型 指令集架构分为两种,基于栈的指令集架构,基于寄存器的指令集架构 两种指令集架构区别 基于栈式架构的特点:   设计和实现简单【每执行一个方法,就进行一次入栈的操作】,适用于资源受限的系统(eg:嵌入式)   避开了寄存器的分配难题;使用零地址指令分配方式   指令流中的指令大比分是零地址指令,其执行过程依赖于操作栈,指令集更小,编译器容易实现   不需要硬件实现,可以执性更好,更好实现跨平台 基于寄存器架构的特点:   典型的是x86的二进制指令集

并发编程和并行编程有什么区别?

风流意气都作罢 提交于 2020-03-08 18:16:49
并行编程和并行编程有什么区别? 我问谷歌,但没有找到任何可以帮助我理解这种差异的东西。 你能给我两个例子吗? 现在,我找到了以下解释: http : //www.linux-mag.com/id/7411- 但是“并发是程序的属性”与“并行执行是机器的属性”对我来说还不够-我还是不能说什么。 #1楼 我在一些博客中找到了此内容。 认为它是有用和相关的。 并发和并行性不是一回事。 如果未预先确定两个任务的执行顺序,则两个任务T1和T2是并发的, T1可以在T2之前执行并完成,T2可以在相同时间(并行)同时执行T1,T1和T2之前执行并完成,T1和T2可以交替执行,...如果有两个并发线程如果操作系统将其调度为在一个单核非SMT非CMP处理器上运行,则可能会并发但不会并行。 并行可能在多核,多处理器或分布式系统上进行。 并发通常被称为程序的属性,并且是比并行性更笼统的概念。 资料来源: https : //blogs.oracle.com/yuanlin/entry/concurrency_vs_parallelism_concurrent_programming #2楼 我相信并发编程是指多线程编程,它是让您的程序运行从硬件详细信息中抽象出来的多个线程。 并行编程是指专门设计程序算法以利用可用的并行执行。 例如,您可以并行执行某些算法的两个分支

为什么有函数调用栈?

跟風遠走 提交于 2020-03-08 01:59:57
为什么引入栈 完成函数调用的过程,需要有个地方存放函数调用返回后要执行的指令地址(简称返回地址) 极客时间-深入计算机组成原理 函数调用过程中,栈的使用 A1 call B A3 B1 B2 retq rip寄存器: 存放下一条要执行的指令地址 callq指令做两件事 把rip的地址A3压栈(也就是被调用函数返回后,调用者本来接下来会执行的那条指令的地址) // 本来这个指令地址都被放在rip了,正常情况就要执行了,但是被call指令弄走了. 把被调用函数的第一条指令地址放入rip,使得cpu下一个就开始执行子函数。 retq指令做1件事 把栈的A3弹出,放入rip。使得cpu加下来继续执行A函数。 深入理解计算机系统-3.7 来源: https://www.cnblogs.com/yudidi/p/12439271.html