Derby
包括:PC(Program Counter),程序计数器,记录当前指令地址;Redister,暂时存储计算机计算用到的数据;ALU,运算单元;CU,控制单元;MMU,内存管理单元;cache。
缓存一致性,缓存锁。
对于有些特别敏感的数字,会存在线程高竞争访问,为了保证不发生伪共享,可以使用缓存行对齐的编程方式;JDK中很多采用long padding提高效率;jdk8加了@Contended’注解,需要加上jvm参数-XX:-RestrictContended;long p1…p7;cursor;long p8…p14。
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。
指向L2;一般是四个字节。
非统一内存访问,访问自己内存要比别的内存快得多。
微内核;宏内核;外核。
进程就是一个程序运行起来的状态;进程是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.
按优先级分配时间片的比例,记录每个进程的执行时间,如果有一个进程执行时间不到他应该分配的比例,优先执行。
硬件跟操作系统内核打交道的一种机制;硬中断:键盘,打印,网络,硬盘,时钟;软中断:和内核打交道,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,位于
用户态和内核态:cpu分不同的指令级别,linux内核跑在ring 0级,用户程序跑在ring3,对于系统关键访问,需要经过kernel同意,保证系统健壮性。内核执行的操作,200多个系统调用sendfile read write pthread fork。jvm对os来说就是个普通程序。
基本概念:临界区(critical area)–访问或操作共享数据的代码段,synchronized大括号中的部分(原子性);竞争条件(race conditions)两个线程同时拥有临界区的执行权;数据不一致:data unconsistency 由竞争条件引起的数据破坏;同步(synchronization)避免rece condition;锁–完成同步的手段(门锁,门后是临界区,只允许一个线程存在),上锁解锁必须具有原子性;原子性(像原子一样不可分割的操作);有序性(禁止指令重排);可见性(一个线程内的修改,另一个线程可见);互斥锁;排它锁;共享锁;分段锁。