背景
程序员的任务是写代码【软件】,代码【软件】本身无价值,代码【软件】运行起来才能实现价值。
运行
以java程序为例:
首先把代码通过编译器编译成可执行代码。
运行过程:冯洛伊曼模型
- 操作系统从磁盘中加载 程序(代码)到内存,程序变成了进程;
- 操作系统调度cpu给到进程,完成计算任务;
- 操作系统协调io设备,输出计算结果;
内存模型:
- 程序代码
- 程序代码中的数据结构;
- 数组需要分配内存到堆上;
- 数据结构对应的内存地址分配到栈上;
程序执行过程:基于栈帧
进程的状态:
- 运行(获得cpu,正在执行计算)
- 就绪(差cpu资源)
- 堵塞(获得cpu也无法完成计算)
因为进程的切换代价太大,操作系统引入了线程。
一台计算机如何运行多个计算任务?
基于cpu的共享分时技术(时间片轮转) + 多线程 ;
崩溃
以一个简单的tomcat+javaweb程序为例:
首先看运行模型:
当多个线程需要修改共享数据的时候,为了保证数据的一致性,引入了操作系统的锁;
一个请求对应一个线程,如果请求数不断增加,就会有很多的线程因为锁而进入等待状态,导致程序响应变慢;
当等待线程超过系统的极限,程序会崩溃;
如何解决并发问题引起的系统变慢和崩溃?
使用分布式集群的方式替代单台服务器,资源多了,等待的线程就变少了;
此外,限流是为了控制等待线程数量超过系统极限而程序崩溃;
降级是为了减少非核心计算,集中资源;
问题?
操作系统和cpu的锁是如何实现的?
cpu:?
操作系统:PV原语
java: 基于CAS,把线程编号写到对象头中;
小结
1 程序是如何运行和崩溃的?
以java程序为场景,程序员的工作内容主要是写码,而代码本身没有价值,把代码运行起来应用到业务场景中才能带来价值。
实际编程过程:ide中写代码,编译打包得到jar包,配置好运行环境【购买物理服务器,安装操作系统,安装jdk,安装tomcat,配置tomcat,上传jar包,使用shell启动程序,配置好网关,交付用户】
程序怎么运行的?
计算机都是基于冯洛伊曼结构
操作系统把jar包加载到内存中,程序变成了一个jvm的进程,分配和协调好CPU,io,进程就跑起来了。
程序中含有各种数据结构,cpu会把内存分配在堆中,把内存地址记录在栈里。
代码的执行基于栈帧,把函数的入参,局部变量放在栈里,后进先出,CPU的跳转指令可以嵌套函数调用。
一台服务器如何处理多任务?
首先操作系统可以运行多进程,基于时间片轮转法共享CPU,因为进程切换代价高昂,所以每个进程内又可以产生多个线程,每个线程可以处理一个任务.
程序是如何崩溃的?
以一个tomcat+javaweb程序为场景
物理服务器提供CPU,内存,磁盘,网络;
操作系统进行进程调度,硬件资源管理;
jvm进程主要进行虚拟机管理;
tomcat进行应用包装,分配多个线程处理请求,一个请求对应一个线程;
应用程序,处理业务逻辑;
当多线程修改共享数据的时候,操作系统为了保证数据一致性,加锁;
锁会带来大量线程等待,程序响应会变慢;当等待线程数超过系统极限,耗费有限资源比如CPU,内存,磁盘,程序会崩溃。
通过本篇,可以学会:
- 程序是如何运行的?jvm的内存结构和运行过程;
- 程序是如何崩溃的?如何解决或者缓解程序变慢或者崩溃的问题;
原创不易,转载请注明出处。