程序运行原理

程序是如何运行又是如何崩溃的?

文本格式的代码、编译器编译成操作系统或虚拟机可运行的代码,即可执行代码。不管是文本格式代码还是可执行代码,都成为程序。

程序是静态的,存储在磁盘上,需要从外部存储设备加载到内存,在操作系统调度下交给CPU执行,运行起来,成为进程

进程包括:

  • 可执行的程序代码
  • 运行期使用的内存堆空间、栈空间
  • 供操作系统管理用的数据结构

操作系统加载可执行代码到内存,生成相应数据结构和内存空间,从可执行代码的起始位置d刦指令交给CPU执行。
栈:记录局部变量和堆空间分配的内存地址(对象的内存地址)

系统为什么会变慢,崩溃

锁引起阻塞,线程排队执行,响应速度就会变慢。
I/O操作,数据库连接等资源也会引起阻塞而变慢。
阻塞等待线程过多,占用资源超过系统极限就会引起崩溃

思考题

线程安全的临界区需要依靠锁,而锁的获取必须也要保证自己是线程安全的,也就是说,不能出现两个线程同时得到锁的情况,那么锁是如何保证自己是线程安全的呢?或者说,在操作系统以及 CPU 层面,锁是如何实现的?

在java里 锁是通过cas把当前线程id刷新到对象的头信息里 在获取锁时会去头信息里拿这个信息 如果没有 则会cas刷新进去 刷新成功就获取到锁 刷新失败就表明有别的线程也在尝试刷新这个信息 在操作系统层面 有pv操作保证原子性 而pv操作也是利用cpu中原语指令 在获取锁时保证不会被别的指令打断(或被重排序)