0207 软件是如何运行和崩溃的?

file

背景

程序员的任务是写代码【软件】,代码【软件】本身无价值,代码【软件】运行起来才能实现价值。

运行

以java程序为例:

首先把代码通过编译器编译成可执行代码。

运行过程:冯洛伊曼模型

  1. 操作系统从磁盘中加载 程序(代码)到内存,程序变成了进程;
  1. 操作系统调度cpu给到进程,完成计算任务;
  1. 操作系统协调io设备,输出计算结果;

内存模型:

  1. 程序代码

  2. 程序代码中的数据结构;

  3. 数组需要分配内存到堆上;

  4. 数据结构对应的内存地址分配到栈上;

程序执行过程:基于栈帧

进程的状态:

  1. 运行(获得cpu,正在执行计算)
  2. 就绪(差cpu资源)
  3. 堵塞(获得cpu也无法完成计算)

因为进程的切换代价太大,操作系统引入了线程。

一台计算机如何运行多个计算任务?
基于cpu的共享分时技术(时间片轮转)  + 多线程 ;

崩溃

以一个简单的tomcat+javaweb程序为例:

首先看运行模型:

image.png

当多个线程需要修改共享数据的时候,为了保证数据的一致性,引入了操作系统的锁;

一个请求对应一个线程,如果请求数不断增加,就会有很多的线程因为锁而进入等待状态,导致程序响应变慢;

当等待线程超过系统的极限,程序会崩溃;

如何解决并发问题引起的系统变慢和崩溃?
使用分布式集群的方式替代单台服务器,资源多了,等待的线程就变少了;
此外,限流是为了控制等待线程数量超过系统极限而程序崩溃;
降级是为了减少非核心计算,集中资源;

问题?

操作系统和cpu的锁是如何实现的?

cpu:?

操作系统:PV原语

java: 基于CAS,把线程编号写到对象头中;

小结

image.png

1 程序是如何运行和崩溃的?
以java程序为场景,

程序员的工作内容主要是写码,而代码本身没有价值,把代码运行起来应用到业务场景中才能带来价值。

实际编程过程:ide中写代码,编译打包得到jar包,配置好运行环境【购买物理服务器,安装操作系统,安装jdk,安装tomcat,配置tomcat,上传jar包,使用shell启动程序,配置好网关,交付用户】

程序怎么运行的?

计算机都是基于冯洛伊曼结构

操作系统把jar包加载到内存中,程序变成了一个jvm的进程,分配和协调好CPU,io,进程就跑起来了。

程序中含有各种数据结构,cpu会把内存分配在堆中,把内存地址记录在栈里。

代码的执行基于栈帧,把函数的入参,局部变量放在栈里,后进先出,CPU的跳转指令可以嵌套函数调用。

一台服务器如何处理多任务?

首先操作系统可以运行多进程,基于时间片轮转法共享CPU,因为进程切换代价高昂,所以每个进程内又可以产生多个线程,每个线程可以处理一个任务.

程序是如何崩溃的?

以一个tomcat+javaweb程序为场景

物理服务器提供CPU,内存,磁盘,网络;

操作系统进行进程调度,硬件资源管理;

jvm进程主要进行虚拟机管理;

tomcat进行应用包装,分配多个线程处理请求,一个请求对应一个线程;

应用程序,处理业务逻辑;

当多线程修改共享数据的时候,操作系统为了保证数据一致性,加锁;

锁会带来大量线程等待,程序响应会变慢;当等待线程数超过系统极限,耗费有限资源比如CPU,内存,磁盘,程序会崩溃。

通过本篇,可以学会:

  1. 程序是如何运行的?jvm的内存结构和运行过程;
  2. 程序是如何崩溃的?如何解决或者缓解程序变慢或者崩溃的问题;

原创不易,转载请注明出处。

posted @ 2020-02-07 12:23  李福春  阅读(313)  评论(0编辑  收藏  举报