晶体管组合实现加法计算器
输入方式 |
---|
手工输入: 打孔纸带 |
助记符:01000010 mov sub ; 汇编语言就是机器语言。 |
高级语言--> 编译器 --> 机器语言 |
从CPU到 | 大约需要的cpu周期 | 大约需要的时间 |
---|---|---|
主存 memory | 约60-80纳秒 | |
QPI总线传输 (between sockets,not drawn) | 约20ns | |
L3 cache (1颗物理核全部线程共享) | 约40-45cycles | 约15ns |
L2 cache (每个ALU单独一个) | 约10cycles | 约3ns |
L1 cache (每个ALU单独一个) | 约3-4cycles | 约1 ns |
寄存器 | 1 cycle |
超线程
一个运算单元ALU对应2套寄存机registers和程序计数器PC,4核8线程,4个ALU,8组[寄存器registers和程序计数器PC]
cache line(Intel cpu是64字节,缓存行对齐),当cpu寄存器加载新的数据时,L1,l2,l3缓存都没有数据,去内存查找对应位的数据x,并将此数据x之后总共64字节的数据(包含一部分不用的)缓存到l3,l2,l1中,同时也得到了需要的数据,寄存器再次需要加载x+1的数据时,可以从缓存l1中直接取得此数据。
MESI Cache 缓存一致性协议(不同的cpu使用不通的协议,Intel使用MESI): cpu的cacheline标记四种状态 ,Modified 被修改,Exclusive 独享 ,Shared 分享可读不改,Invalid 失效。 一个cpu改了一个cache line的数据 此数据为Modified,会通知其他cpu 寄存器标记此数据 Invalid无效。在硬件通过缓存锁实现。无法缓存的数据和跨多个缓存行的数据使用总线锁保持一致性。
java 中volatile与synchronized都用于保证多线程中数据的安全
区别: 1. volatile修饰的变量,jvm每次都从主存(主内存)中读取,而不会从寄存器(工作内存)中读取。而synchronized则是锁住当前变量,同一时刻只有一个线程能够访问当前变量 2. volatile仅能用在变量级别,而synchronized可用在变量和方法中 3. volatle仅能实现变量的修改可见性(说的是一个线程如果更改了某个变量的值,其他线程能够立刻知道这个变量更改后的值),无法保证变量操作的原子性(一个操作要么全做,要么全不做,就像不可分割的原子一样。银行转账这个操作必须具有原子性,A转账给B1000元,A账户减去1000元,B账户加上1000元,两个操作不可分割,不可单独出现,否则会出现意料之外的结果。)。而synchronized可以实现变量的修改可见性与原子性 4. volatile不需要加锁,因此不会造成线程的阻塞,而且比synchronized更轻量级,而synchronized可能导致线程的阻塞
CPU乱序执行: 在读等待一个指令时,下一个指令不影响其他指令,会执行下一条指令。用于提高cpu利用率。有些情况为了不乱序执行,Intel 由加了lock指令保证指令执行的有序性(这是硬件层面的实现)。
java对象创建的过程
new 一个对象,会先在堆内存分配空间new ,然后调用构造函数invokespecial初始化空间的值, astore_1 把空间与对象关联。(DCL单例加volatle,禁止cpu指令从排序,防止多线程在对象初始化先关联对象后赋值(cpu指令重排序)的调用) jvm JSR内存屏障保证cpu指令不乱序执行,这是jvm实现(底层本质还是cpu lock指令)。
ZGC 的 NUMA 非一致性内存(多颗CPu访问不是自己插槽上的内存),分配内存会优先分配该线程所在cpu最近的内存。
双通道,从cpu到访问内存的总线扩容。
用户登录
用户登陆方式
命令行登录:init进程调用getty程序(意为get teletype),让用户输入用户名和密码。输入完成后,再调用login程序,核对密码(linux还会再多运行一个身份核对程序/etc/pam.d/login)。如果密码正确,就从文件 /etc/passwd 读取该用户指定的shell,然后启动这个shell。 ssh登录:这时系统调用sshd程序(linux还会再运行/etc/pam.d/ssh ),取代getty和login,然后启动shell。 图形界面登录:init进程调用显示管理器,Gnome图形界面对应的显示管理器为gdm(GNOME Display Manager),然后用户输入用户名和密码。如果密码正确,就读取/etc/gdm3/Xsession,启动用户的会话。
用户登陆加载配置文件顺序
/etc/profile ~/.bash_profile -- > $HOME/.bashrc
BIOS,用于加载电脑最基本的程序代码,担负着初始化硬件,检测硬件功能以及引导操作系统的任务。而UEFI就是与BIOS相对的概念,这种接口用于操作系统自动从预启动的操作环境,加载到一种操作系统上,从而达到开机程序化繁为简节省时间的目的。
BIOS是一组固化到计算机内主板上一个ROM芯片上的程序,它保存着计算机最重要的基本输入输出的程序、开机后自检程序和系统自启动程序,它可从CMOS中读写系统设置的具体信息。 其主要功能是为计算机提供最底层的、最直接的硬件设置和控制。
BIOS芯片中主要存放:
自诊断程序:通过读取CMOSRAM中的内容识别硬件配置,并对其进行自检和初始化; CMOS设置程序:引导过程中,用特殊热键启动,进行设置后,存入CMOS RAM中; 系统自举装载程序:在自检成功后将磁盘相对0道0扇区上的引导程序装入内存,让其运行引导操作系统; 主要I/O设备的驱动程序和中断服务:由于BIOS直接和系统硬件资源打交道,因此总是针对某一类型的硬件系统,而各种硬件系统又各有不同,所以存在各种不同种类的BIOS,随着硬件技术的发展,同一种BIOS也先后出现了不同的版本,新版本的BIOS比起老版本来说,功能更强。 注:CMOS是Complementary Metal Oxide Semiconductor(互补金属氧化物半导体)的缩写。它是指制造大规模集成电路芯片用的一种技术或用这种技术制造出来的芯片,是电脑主板上的一块可读写的RAM芯片。因为可读写的特性,所以在电脑主板上用来保存BIOS设置完电脑硬件参数后的数据,这个芯片仅仅是用来存放数据的。而对BIOS中各项参数的设定要通过专门的程序。BIOS设置程序一般都被厂商整合在芯片中,在开机时通过特定的按键就可进入BIOS设置程序,方便地对系统进行设置。因此BIOS设置有时也被叫做CMOS设置。 在计算机领域,CMOS常指保存计算机基本启动信息(如日期、时间、启动设置等)的芯片。有时人们会把CMOS和BIOS混称,其实CMOS是主板上的一块可读写的并行或串行FLASH芯片,是用来保存BIOS的硬件配置和用户对某些参数的设定。
BIOS主要功能:
第一个部分是用于电脑刚接通电源时对硬件部分的检测,也叫做加电自检(Power On Self Test,简称POST),功能是检查电脑是否良好,通常完整的POST自检将包括对CPU,640K基本内存,1M以上的扩展内存,ROM,主板,CMOS存储器,串并口,显示卡,软硬盘子系统及键盘进行测试,一旦在自检中发现问题,系统将给出提示信息或鸣笛警告。自检中如发现有错误,将按两种情况处理:对于严重故障(致命性故障)则停机,此时由于各种初始化操作还没完成,不能给出任何提示或信号;对于非严重故障则给出提示或声音报警信号,等待用户处理。 第二个部分是初始化,包括创建中断向量、设置寄存器、对一些外部设备进行初始化和检测等,其中很重要的而对BIOS中各项参数的设定要通过专门的程序。BIOS设置程序一般都被厂商整合在芯片中,在开机时通过特定的按键就可进入BIOS设置程序,方便地对系统进行设置。因此BIOS设置有时也被叫做CMOS设置。一部分是BIOS设置,主要是对硬件设置的一些参数,当电脑启动时会读取这些参数,并和实际硬件设置进行比较,如果不符合,会影响系统的启动。 第三个部分是引导程序,功能是引导DOS或其他操作系统。BIOS先从软盘或硬盘的开始扇区读取引导记录,如果没有找到,则会在显示器上显示没有引导设备,如果找到引导记录会把电脑的控制权转给引导记录,由引导记录把操作系统装入电脑,在电脑启动成功后,BIOS的这部分任务就完成了。
UEFI相比BIOS的优势 1、通过保护预启动或预引导进程,抵御bootkit攻击,从而提高安全性。 2、缩短了启动时间和从休眠状态恢复的时间。 3、支持容量超过2.2 TB的驱动器。 4、支持64位的现代固件设备驱动程序,系统在启动过程中可以使用它们来对超过172亿GB的内存进行寻址。 5、UEFI硬件可与BIOS结合使用。
GPT特点
对于大容量硬盘(2.2TB或者2.0TiB以上)的原生支持。现在虽然厂商各自针对大容量硬盘推出了在BIOS/MBR分区表的访问方案,不过总觉得有点别扭。 GPT不存在扩展分区和逻辑分区,所有分区全都是主分区,且理论上可存在的主分区个数是无限的(大多数操作系统会将主分区个数限制为128个,此处可能有谬误)。由此带来的好处显而易见,不必纠结于分区个数的限制和扩展分区/逻辑分区和主分区的转换了。而且这两年分区工具日渐成熟,对GPT的支持也已经算是良好了。 GPT的分区表在GPT头部和磁盘尾部各存一份,这种机制使得GPT的分区表不容易破坏或丢失,像我这样没有备份分区表习惯的人也不怕丢分区了。
内核态与用户态: Intel cpu (指令集分类)运行级别 0 1 2 3,linux系统使用0和3两种级别,内核态用0,用户态用3 ;linux内核执行的操作 -> 200多个系统调用(/lib64/libc.so.6)
程序 | 可执行文件 |
---|---|
进程 | 运行程序产生一个或者多个进程 |
线程 | 一个进程内的多个并行的任务 |
纤程、协程(golang中叫 corutine;java叫fiber) | 一个线程内部并行的任务,通过程序自身的堆栈模拟cpu寄存器与计数器结构,实现线程内部的功能切换,而不是真正的cpu工作线程生成与切换。 |
线程是linux调度的基本单位。
进程与线程区别 :进程分配资源,线程执行,进程产生时会初始化进程的内存结构,线程产生时继承共享进程的内存资源,不会再次初始化内存结构。jvm启动一个线程需要大约1M内存,纤程、协程大约需要4K内存;CPU切换不同进程消耗资源比CPU切换同一进程下的不同线程消耗资源多
纤程、协程:用于用户空间的异步编程,避免反复系统调用,还有进程切换造成的开销。
协程应用场景:同时有十万个请求,不需要开十万个线程,把线程做得轻量化,彻底运行在用户空间,Go 语言的 goroutine。IO 密集型任务的时候,协程更高效,CPU 密集型的任务,线程更高效。
用户态--系统调用--》内核态的过程: