计算机指令

Java并发指南2:深入理解Java内存模型JMM

走远了吗. 提交于 2019-11-26 23:17:23
一:JMM基础与happens-before 并发编程模型的分类 在并发编程中,我们需要处理两个关键问题:线程之间如何通信及线程之间如何同步(这里的线程是指并发执行的活动实体)。通信是指线程之间以何种机制来交换信息。在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递。 在共享内存的并发模型里,线程之间共享程序的公共状态,线程之间通过写-读内存中的公共状态来隐式进行通信。在消息传递的并发模型里,线程之间没有公共状态,线程之间必须通过明确的发送消息来显式进行通信。 同步是指程序用于控制不同线程之间操作发生相对顺序的机制。在共享内存并发模型里,同步是显式进行的。程序员必须显式指定某个方法或某段代码需要在线程之间互斥执行。在消息传递的并发模型里,由于消息的发送必须在消息的接收之前,因此同步是隐式进行的。 Java内存模型的抽象 Java的并发采用的是共享内存模型,Java线程之间的通信总是隐式进行,整个通信过程对程序员完全透明。如果编写多线程程序的Java程序员不理解隐式进行的线程之间通信的工作机制,很可能会遇到各种奇怪的内存可见性问题。 在java中,所有实例域、静态域和数组元素存储在堆内存中,堆内存在线程之间共享(本文使用“共享变量”这个术语代指实例域,静态域和数组元素)。局部变量(Local variables),方法定义参数(java语言规范称之为formal

操作系统原理(1)

為{幸葍}努か 提交于 2019-11-26 22:02:16
计算机体系结构 一个计算机系统由运算器、控制器、存储器(即内存)、输入设备、输出设备组成。其中运算器运算数据,而数据在内存中,运算器要通过控制器到内存中获取数据,运算器最后将运算后的结果通过控制器保存在内存中,通常程序由指令和数据组成,当程序运行时指令和数据保存在内存中,指令中有数据在内存中的地址信息,从而运算器知道数据在内存的位置,然后通过控制器获取所需的数据;一般来说IO设备是通过北桥或南桥芯片连入的,北桥成为高速总线控制器:内存和CPU通过北桥连接在一起。南桥称为低速总线控制器:外围设备和南桥连在一起,然后南桥和北桥相连; 对一个简单的PC机而言,在某一时刻只能运行一个程序,但PC计算能力很强一个程序运行的程序内容和占用的CPU时间不是特别长,因此为了能够尽可能利用计算机的资源,需要让PC具有同时运行多个程序的能力,因此每个程序在运行时需要一个协调器称为内核(内核是运行在硬件之上负责管理硬件资源并且将硬件资源虚拟成其他样子提供给上层所需的应用程序(这样做的原因是如果某一应用程序直接运行在硬件之上则此程序就可以控制硬件的各种属性,其它程序运行时可能彼此会产生干扰,一个恶意的程序可能导致其它程序统统退出所以就需要统一的资源管理者,而且每个程序要想使用硬件必须通过内核来完成,而内核也不会让程序直接访问硬件而是通过将硬件提供的计算能力通过一个个的称为系统调用(system call

shell脚本编程基础

落爺英雄遲暮 提交于 2019-11-26 21:28:09
一编程基础 1程序编程风格 程序:指令+数据 程序编程风格: (1)过程式:以指令为中心,数据服务于指令。 程序员把主要的精力集中在程序指令上,一步步怎么做的。比如C、C++符合人类处理事情的逻辑关系的,不过这适合简单的事情。 对于大型的应用程序的开发这种方法是非常难的,会产生混乱。 (2)对象式:以数据为中心,指令服务于数据。 通过指令处理数据,得到我们关心的结果,程序最重要的功能是在处理数据上。 对于大型的事是采用这种方法。比如盖大楼要雇用一些团队,把大的工作分解成小的工作。设计图纸有专门的设计院来完成,搬砖要有专门的工人。 对于大的项目来说不太关注每个流程了。更多的考虑把任务分包给具体的人,每个团队做自己的事,做完就好,不关心做事的方式。 就像有句话叫做只要白猫黑猫能抓住老鼠的就是好猫。 大项目使用的是面向对象,而小项目是面向过程。我们现在编脚本还是面向过程式的。 2程序的执行方式 (1)计算机:运行二进制指令 计算机只能识别二进制。计算机真的要运行一个程序,要把人类能够理解的东西转化成二进制。 (2)编程语言: 1低级:汇编 汇编语言也是字符串,和机器语言是一一对应的,要把汇编语言转化成机器码进行分析。 2高级: <1>编译 <1>编译:高级语言-->编译器-->目标代码 比如java,C# 编译型的语言要转化成二进制的内容才会执行,需要有编译器生成二进制的东西。

RAM

你。 提交于 2019-11-26 20:02:02
1. 前记 我们知道,不同的计算机结构对RAM 的使用方式是有区别的,典型的计算机结构有两个,冯诺依曼结构和哈佛结构,而两大阵营的领军人物就是传说中的Intel X86系列的8086和51单片机系列的8051。请先对号入座,不理解的跳过去,继续往下看。 2. What? 长啥样? 内存条,RAM中的一种,常见的应该是DDR SDRAM。相信各位都触摸过它,冷冰,无情,当然,你上电后它就变了样,暖暖的,无怨无悔的为我们干活。 嘿!别唬我,这个俺知道,51单片机。没错,51单片机里面也内置了RAM ,叫片内RAM。 这个就是一般嵌入式板卡上的RAM, 为了加以区分,就叫片外RAM。 广义上讲,CPU内部的寄存器也算是RAM的一种。 在哪里? PC主板图片 嵌入式板卡图片 找一找你系统上的内存吧,再看看CPU datasheet 上有没有提到内置RAM。 特点是啥? RAM(Random Access Memory),随机存储器。特点如下: 如其名,可随时读写 快,读写速度杠杠的,CPU最喜欢和它一起“玩”了 掉电后,数据全部丢失,因此,别指望RAM中的数据长期存储,那么,我想要长期存储公司所有员工的数据怎么办?用FLASH吧。 请参考: RAM、ROM、Flash的分类、性能比较 RAM,ROM,FLASH存储器区别 与CPU的连接方式 RAM是用来存储CPU计算所需的数据的

虚拟化原理(2)

对着背影说爱祢 提交于 2019-11-26 19:04:17
虚拟化概述 将底层的计算机资源虚拟成多组彼此之间互相隔离的计算平台,并且每一个计算平台都应该有五大部件的所有设备(运算器,控制器,存储器,IO设备)。 虚拟化技术的分类 模拟:硬件+操作系统+模拟器软件,虚拟机的cpu架构和物理cpu的架构可以不一致。(模拟器模拟出来的CPU指令集和底层物理CPU的指令集不同,就需要虚拟机监视器将模拟的CPU指令集转化为真正物理CPU的指令集,这个过程需要软件参与而且性能差) 常用的模拟又:PearPC, Bochs, QEMU 完全虚拟化:虚拟CPU和物理CPU的架构完全相同。(虚拟CPU和物理CPU的架构完全相同,对虚拟机而言只要不是调用到特权指令或敏感指令,普通指令就能直接在底层物理CPU上执行,无需进行转化。如果虚拟机调用到特权指令,特权指令由虚拟机监视器捕获后进行翻译后转化成宿主机的指令集 或者 虚拟机向虚拟机监视器(VMM)通过调用hypersor call的方式来实现,这取决于是完全虚拟化还是半虚拟化。完全虚拟化可以借助于HVM技术省略指令转换的过程) 常见的完全虚拟化有:VMware Workstation, VMware Server, Parallels Desktop, KVM, Xen 半虚拟化:para-virtualization 在硬件之上运行hypervisor,hypervisor将底层功能通过hypervisor

堆栈,堆栈,堆和栈的区别【转载】

谁说我不能喝 提交于 2019-11-26 18:35:42
原文: http://www.cppblog.com/oosky/archive/2006/01/21/2958.html 非本人作也!因非常经典,所以收归旗下,与众人阅之!原作者不祥! 堆和栈的区别 一、预备知识—程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。 3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放 4、文字常量区—常量字符串就是放在这里的。 程序结束后由系统释放 5、程序代码区—存放函数体的二进制代码。 二、例子程序 这是一个前辈写的,非常详细 //main.cpp int a = 0; 全局初始化区 char *p1; 全局未初始化区 main() { int b; 栈 char s[] = "abc"; 栈 char *p2; 栈 char *p3 = "123456"; 123456\0在常量区,p3在栈上。

Windows中进程的内存结构

落爺英雄遲暮 提交于 2019-11-26 17:39:09
基础知识: 堆栈是一种简单的数据结构,是一种只允许在其一端进行插入或删除的线性表。允许插入或删除操作的一端称为栈顶,另一端称为栈底,对堆栈的插入和删除操作被称为入栈和出栈。有一组CPU指令可以实现对进程的内存实现堆栈访问。其中,POP指令实现出栈操作,PUSH指令实现入栈操作。CPU的ESP寄存器存放当前线程的栈顶指针,EBP寄存器中保存当前线程的栈底指针。CPU的EIP寄存器存放下一个CPU指令存放的内存地址,当CPU执行完当前的指令后,从EIP寄存器中读取下一条指令的内存地址,然后继续执行。 接触过编程的人都知道,高级语言都能通过变量名来访问内存中的数据。那么这些变量在内存中是如何存放的呢?程序又是如何使用这些变量的呢?下面就会对此进行深入的讨论。下文中的C语言代码如没有特别声明,默认都使用VC编译的release版。 首先,来了解一下 C 语言的变量是如何在内存分部的。C 语言有全局变量(Global)、本地变量(Local),静态变量(Static)、寄存器变量(Register)。每种变量都有不同的分配方式。先来看下面这段代码: #include <stdio.h> int g1=0, g2=0, g3=0; int main() { static int s1=0, s2=0, s3=0; int v1=0, v2=0, v3=0; //打印出各个变量的内存地址

Linux知识汇总

走远了吗. 提交于 2019-11-26 15:51:00
1 Linux介绍 1.1 常见的操作系统 Windows 它微软公司开发的一款桌面操作系统(闭源系统)。版本有dos、win98、win NT、win XP、win 7、win vista、win 8、win 10。服务器操作系统:win server 2003、win server 2008、win server 2012。 Mac 苹果公司开发的一款操作系统(闭源系统),目前最新的版本是IOS12。界面风格还是不错。对于系统底层的优化也是很好。 Linux Linux是一个开源的操作系统,目前是市面上占有率极高的服务器操作系统。目前其分支有很多。安卓 Linux的开发作者,李纳斯·托瓦兹。 Linux是开源的操作系统。所谓开源就是指开放源代码。 1983年 GNU计划 格奴计划 Linux分支: 常见的有centos(社区企业网络操作系统)、RedHat、乌班图、debian等等。 Unix Unix是Linux操作系统的前身,Unix时间戳是指1970年1月1日0时0分0秒,1970年是Unix的时间元年,也就是Unix诞生的年份。 1.2 Linux操作系统好处 之所以大部分的公司开发的时候都是使用Linux操作系统,取决于两个特性: 稳定性:取决于系统的底层架构,一般情况下Linux系统能做到很长时间不关机一点也不卡顿; 安全性:开源系统

java架构之路(一)JMM和volatile关键字

隐身守侯 提交于 2019-11-26 12:45:55
  说到JMM大家一定很陌生,被我们所熟知的一定是jvm虚拟机,而我们今天讲的JMM和JVM虚拟机没有半毛钱关系,千万不要把JMM的任何事情联想到JVM,把JMM当做一个完全新的事物去理解和认识。 我们先看一下计算机的理论模型,也是冯诺依曼计算机模型,先来张图。 其实我们更关注与计算机的内部CPU的计算和内存之间的关系。我们在来深入的看一下是如何计算的。 我们来看一下这个玩意的处理流程啊,当我们的数据和方法加载的内存区,需要处理时,内存将数据和方法传递到CPU的L3->L2->L1然后再进入到CPU进行计算,然后再由L1->L2->L3->再返回到主内存中,但是我们的科技反展的很快的,现在貌似没有单核的CPU了吧,什么8核16核的CPU随处可见,我们这里只的CPU只是CPU的一个核来计算这些玩意。假设我们的方法是f(x) = x + 1,我们入参是1,期望得到结果是2,1+1=2,我计算的没错吧。如果我们两个核同时执行该方法呢?我们的CPU2反应稍微慢了一点呢?假如当我们的内存再向CPU2发送参数时,可能CPU1已经计算完成并且已经返回了。这时CPU2取得的参数就是2,这时再进行计算就是2+1了。结果并不是我们期望的结果。这其实就是数据未同步造成的。我们应该想尽我们的办法去同步一下数据。    我们中间加了一层缓存一致性协议。也就是我们的MESI,在多处理器系统中

计算机组成原理 - 一些简单题和设计分析题

此生再无相见时 提交于 2019-11-26 12:34:03
为了前几天的计算机组成原理的复习,从google上搜索的一些烟台大学历年考试试题进行的一些总结,现在分享给需要的朋友。 简答题 1. CPU中包括哪几种寄存器?分别说明其作用。 答:CPU有以下寄存器: (1)指令寄存器(IR):用来保存当前正在执行的一条指令。 (2)程序计数器(PC):用来确定下一条指令的地址。 (3)地址寄存器(AR):用来保存当前CPU所访问的内存单元的地址。 (4)缓冲寄存器(DR):<1>作为CPU和内存、外部设备之间信息传送的中转站。 <2>补偿CPU和内存、外围设备之间在操作速度上的差别。 <3>在单累加器结构的运算器中,缓冲寄存器还可兼作为操作数寄存器。 (5)通用寄存器(AC):当运算器的算术逻辑单元(ALU)执行全部算术和逻辑运算时,为ALU提供一个工作区。 (6)状态条件寄存器:保存由算术指令和逻辑指令运行或测试的结果建立的各种条 件码内容。除此之外,还保存中断和系统工作状态等信息,以便使CPU和系统能及时了解机器运行状态和程序运行状态。 2.根据操作数所在位置,指出其寻址方式(填空)。 (1)、操作数在寄存器中,为____ 寄存器 ____寻址方式。 (2)、操作数地址在寄存器中,为_ 寄存器间接 _寻址方式。 (3)、操作数地址(主存)在指令中,为___ 直接 ___寻址方式。 (4)、操作数在指令中,为__ 立即 ____寻址方式。