zoukankan      html  css  js  c++  java
  • 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. 程序是如何崩溃的?如何解决或者缓解程序变慢或者崩溃的问题;

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

  • 相关阅读:
    【转】shell中的内建命令, 函数和外部命令
    clear out all variables without closing terminal
    linux中shell命令test用法和举例
    解决vim粘贴时格式混乱的问题
    scp的两种方式
    source 命令的用法,是在当前bash环境下执行脚本文件
    angularjs中下拉框select option默认值
    redux 及 相关插件 项目实战
    JavaScript 获取当前时间戳
    v-if v-else-if v-else
  • 原文地址:https://www.cnblogs.com/snidget/p/12272592.html
Copyright © 2011-2022 走看看