计算机底层知识

计算机底层知识

正文

  • 计算机底层知识
  • JDK数据库
  • 汇编语言本质就是机器语言、符号语言
  • CPU
  • 锁总线
  • cache line缓存行对齐,伪分享
  • MESI(Intel)
  • 内存屏障
  • 禁止乱序
  • 合并写(wc buffer)
  • ZGC MUMA
  • 内核分配
  • 进程,线程,纤程(Fiber),中断
  • 僵尸线程
  • 孤儿进程
  • 多任务
  • 进程类型
  • 进程优先级
  • CFS(Completely Fair Scheduler)
  • 中断
  • 线程上下文切换
  • 阻塞非阻塞
  • 内存管理
  • 内核同步机制

JDK数据库

Derby

汇编语言本质就是机器语言、符号语言

CPU

包括:PC(Program Counter),程序计数器,记录当前指令地址;Redister,暂时存储计算机计算用到的数据;ALU,运算单元;CU,控制单元;MMU,内存管理单元;cache。

锁总线

缓存一致性,缓存锁。

cache line缓存行对齐,伪分享

对于有些特别敏感的数字,会存在线程高竞争访问,为了保证不发生伪共享,可以使用缓存行对齐的编程方式;JDK中很多采用long padding提高效率;jdk8加了@Contended’注解,需要加上jvm参数-XX:-RestrictContended;long p1…p7;cursor;long p8…p14。

MESI(Intel)

Modified;Exclusive;Shared;Invalid。

内存屏障

对某部分内存做操作前后添加的屏障,屏障前后的操作是不可以乱序执行的。
volatile底层使用lock addl实现,+0;addl 0x0 esp;
sychnoized使用lock compare and exchange;
请求顺序执行用ThreadPool中的singleThread;
light weight process轻量级进程。

禁止乱序

CPU:mfrence,lfence,sfence;原子指令:lock(x86),full barrier,硬件;
软件:内存屏障或者原子指令。
jvm层级:JSR内存屏障,load*store,storestore vola写 storeload;loadload vola读 loadstore。
8个happends before原则。
as-if-serial。

合并写(wc buffer)

指向L2;一般是四个字节。

ZGC MUMA

非统一内存访问,访问自己内存要比别的内存快得多。

内核分配

微内核;宏内核;外核。

进程,线程,纤程(Fiber),中断

进程就是一个程序运行起来的状态;进程是OS分配资源的基础单位,线程是OS执行调度的基本单位;线程共享进程的内存空间。linux称进程为task,内核中使用ProcessControlBlock,内核描述符,使用fork(内部使用clone())和exec()调用;
jvm中的线程与OS一一对应;
纤程好处:空间只有4K,线程是1M;切换比较简单。启动多个–kotiln,go,python,scala–quaser-core;
纤程用处:很短的计算任务,不需要内核。并发量高。是用户空间的,切换和调度不需要OS;和线程实现一样,纤程也有自己的纤程栈;内核线程是内核独有的线程;

僵尸线程

在父进程生成子进程后,子进程的PCB结构被维护,子进程退出,如果父进程没有被释放,子进程将成为一个僵尸进程。

孤儿进程

在子进程结束前,父进程已经退出,孤儿的进程将成为init的子进程,由1个进程维护。

多任务

抢占式,非抢占式,让出CPU(YIELDING)

进程类型

IO密集型;CPU密集型。

进程优先级

实时进程,调度策略:SCHED_FIFO和SCHED_RR(Round Robin)
普通进程,CFS.

CFS(Completely Fair Scheduler)

按优先级分配时间片的比例,记录每个进程的执行时间,如果有一个进程执行时间不到他应该分配的比例,优先执行。

中断

硬件跟操作系统内核打交道的一种机制;硬中断:键盘,打印,网络,硬盘,时钟;软中断:和内核打交道,int 0x80H,sysenter;软中断80中断==系统调用;中断向量表,callback;系统调用int 0x80或者sysenter原语,通过ax寄存器填入调用号,系统通过bx、cx,dx、si、di传入内核,返回值通过ax返回;java读网络-》jvm read()-》c库read()-》内核空间-》system_call()(系统调用处理程序)-》sys_read();

线程上下文切换

cpu通过分配时间片来执行任务,当一个任务的时间片用完就会切换到另一任务。在切换之前会保存上一个任务的状态,当下次再切换到该任务,就会加载这个状态。

阻塞非阻塞

用户执行read时候会调用系统的read,用户read的执行与否会决定是否阻塞。
内核操作会经过一个系统调用的过程,系统调用就会在寄存器装好多东西,然后通过80中断产生调用,然后通过ax拿结果。

内存管理

发展历程:单进程-》多进程(互相打扰,内存不够用);分页(解决内存不够用):内存页4k标准页,用到哪块加载那块,内存满了,会把最不常用的放到swap分区,进行交换分区–LRU(Lease Recently Used)算法(哈希表+链表);
虚拟内存(解决互相打扰问题);为什么使用虚拟内存:隔离应用程序(每个程序都有自己连续可用的内存,突破物理内存的限制,应用程序不需要考虑物理内存是否可用,是否能够分配);保护物理内存,不被恶意程序访问;逻辑地址+段的基地址=线性地址(虚拟空间)在通过Memory Management Unit+os映射到物理地址;
为了保证互不影响,让进程工作在虚拟空间,程序中用到的空间地址不再是直接的物理地址,而是虚拟的地址,这样,A进程永远不可能访问到B进程的空间。
虚拟空间多大:寻址空间 64位系统2^64 ,比物理空间大很多,单位是byte;
站在虚拟的角度,进程是独享整个系统+cpu。
ZGC:GC信息记录在指针上,不是记录在头部,immediate memory use;算法叫做:colored pointer;42位指针寻址空间4T jdk13-》16T,目前为止最大16T 2^44;CPU如何区分一个立即数和一条指令:总线内部分为数据总线,地址总线,控制总线。地址总线目前:48位(41+4+2)颜色指针本质上包含了地址映射的概念。

内核同步机制

说明:java中的actomic使用自旋锁实现,java中的semaphore使用自旋锁;
保证原子性,有序性、可见性;
内核同步常用方法:1.原子操作-内核中类似于AtomicXXX,位于 2 自旋锁 内核中通过汇编支持的cas,位于 3 读-写自旋,类似于semaphore(PV操作down up操作占有和释放),重量级锁,线程会进入wait,适合长时间持有锁的情况 5 读-写信号量-downread upread downwrite upwrite(多个写可以分段写,比较少用)(分段锁) 6 互斥体(mutex)- 特殊的信号量(二值信号量) 7 完成变量- 特殊的信号量(A发出信号给B,B等待在完成变量上)vfock()在子进程结束时通过完成变量叫醒父进程类似于(countdownlatch) 8 BKL:大内核锁(早期,现在已经不用) 9 顺序锁-线程可以挂起的读写自旋锁,序列计数器(从0开始,写时+1,写完释放+1),读前发现单数,类似于(copyonwritelate),说明:有些写线程,等待,读前读后顺序一样,说明没有写进程打断 10 禁止抢占-preempt_disable() 11 内存屏障-volatile
用户态和内核态:cpu分不同的指令级别,linux内核跑在ring 0级,用户程序跑在ring3,对于系统关键访问,需要经过kernel同意,保证系统健壮性。内核执行的操作,200多个系统调用sendfile read write pthread fork。jvm对os来说就是个普通程序。
基本概念:临界区(critical area)–访问或操作共享数据的代码段,synchronized大括号中的部分(原子性);竞争条件(race conditions)两个线程同时拥有临界区的执行权;数据不一致:data unconsistency 由竞争条件引起的数据破坏;同步(synchronization)避免rece condition;锁–完成同步的手段(门锁,门后是临界区,只允许一个线程存在),上锁解锁必须具有原子性;原子性(像原子一样不可分割的操作);有序性(禁止指令重排);可见性(一个线程内的修改,另一个线程可见);互斥锁;排它锁;共享锁;分段锁。

你可能感兴趣的:(计算机底层,操作系统,网络,内核,linux,java)