软件基础原理——程序运行原理
极客时间——后端面试38讲——李智慧老师——听课笔记
程序是如何运行起来的
我们平常写的是文本格式的代码,比如:
public class{public static void main(String[] args){System.out.println("hello_word");}
}
文本格式的代码有三种执行方式:
- 解释执行。比如javaScript,python语言。
- 编译执行。文本格式的代码需要经过编译器编译成机器代码。比如c/c++.
- 虚拟机执行。文本格式的代码先被编译成一种中间代码,然后由计算机中的虚拟机解释执行。比如java。
其中,可以被操作系统或虚拟机运行的代码被称为可执行代码。
文本格式的代码和可执行代码统称为程序。
文本格式的代码执行的流程是:
- 把程序从外部存储设备中加载到内存中,处理成机器代码,生成相应的数据结构和内存空间,并在操作系统的管理下交给CPU去执行,。
- 操作系统从可执行代码的起始位置读取指令交给CPU顺序执行。指令执行过程中,可能遇到跳转指令,即CPU要执行的下一条指令不是内存中可执行代码的下一条指令。编程中使用的循环
for() while(){} if(){}else{}
都被编译为跳转指令。 - 程序运行期间如果需要创造数组等数据结构,操作系统就会在进程的堆空间中申请一块相应的内存空间,并把这块内存的首地址信息记录在进程的栈中。
进程包含可执行代码,在运行期使用的内存堆空间,栈空间,供操作系统管理用的数据结构。其中,堆是一块无序的内存空间,由操作系统维护,任何时候进程需要申请内存,都会从堆内存中分配。栈是一个严格的先进后出的数据结构,同样有操作系统维护,主要用来记录函数内部的局部变量、堆空间分配的内存地址等。
每次调用函数,操作系统都会在栈中创建一个栈帧,正在执行的函数的参数、局部变量、申请的内存地址等都在当前栈帧,也就是当前堆栈的顶部栈帧中。栈帧是隔离的,所以不同的函数可以定义相同的变量而不会发生胡乱。
void f(){int x = g(1);x++;
}
int g(int x){return x+1;
}
上述的函数调用过程中,栈的操作:
当f函数被调用还没执行函数体时,f函数的栈帧就在栈顶。执行到创建变量时,局部变量x被存储在栈帧中。当f函数调用g函数时,当前的执行函数变为g函数,操作系统会为g函数创建一个栈帧并防止在栈顶。当函数g()调用结束,程序返回f函数,g函数对应的栈帧出栈,顶部栈帧又变为f函数的栈帧,继续执行f函数的代码。
一台计算机如何处理数以百计的任务
CPU分时共享技术:如果有多个进程在执行,操作系统会将CPU的执行时间分成很多份,进程按照某种策略在CPU上轮流执行。
进程的生命周期:
- 运行。
- 就绪。当一个进程获得了除CPU以外的 一切所需资源,只需要得到CPU即可运行,则称此进程就处于就绪状态。
- 阻塞。当一个进程等待某一事件发生(比如等待I/O完成,等待锁)而暂时停止运行,这时即使把CPU而分配给进程也无法运行。
线程可以理解为轻量级的线程,在进程内创建,拥有自己的线程栈。也有三种主要状态。
进程间进行CPU切换的代价大于线程间进行CPU切换的代价。
CPU以线程为单位进行分时共享执行,代码被加载到内存空间后,有多个线程在这些代码上执行。这些线程从逻辑上看,是同时运行的,每个线程都拥有自己的线程栈,所有的线程栈是完全隔离的,也就是每个方法的参数和方法内的局部变量都是隔离的,一个线程无法访问到其他线程的栈内数据。
我们开发的应用程序通常以一个进程的方式在操作系统中启动,然后在进程中创建很多线程,每个线程处理一个用户请求(可以是同一个用户的不同请求,也可以是不同用户的同样的请求)。
Tomcat启动多个线程,为每个用户请求分配一个线程,调用和请求URL路径相对应的Servlet(或者Controller)代码,完成用户请求处理。而Tomcat则在JVM虚拟机进程中,JVM虚拟机则被操作系统当成一个独立进程管理。真正完成最终计算的,是CPU、内存等服务器硬件,操作系统将硬件进行分时化(CPU),分片化(内存)管理,虚拟化成一个独享资源让JVM进程在其上运行。
Tomcat会对不同应用做一些隔离。如果某个用用导致JVM crash,则所有的应用都会crash。
系统变慢,崩溃
很多线程排队等待锁、I/O操作、对数据库连接的获取会引起线程的阻塞,从WEB请求者的角度看,响应时间边长,系统变慢。
被阻塞的线程越多,占据的系统资源也越来越多,这些被阻碍的线程即不能继续执行,也不能释放当前已经占据的资源,在系统中一边等待一边小号资源,如果阻塞的线程数超过了某个系统资源的极限,就会导致应用崩溃。
解决系统因高并发而导致的响应变慢、应用崩溃的主要手段是使用分布式系统架构,用更多的服务器构成一个集群,以便共同处理用户的并发请求,保证每台服务器的并发负载不会太高。此外,必要时还需要在请求 入口处进行限流,减小系统的并发请求数;在应用内进行业务降级,减小线程的资源的消耗。
软件基础原理——程序运行原理相关推荐
- python解析器原理_Python程序运行原理图文解析
本文研究的主要是Python程序运行原理,具体介绍如下. 编译型语言(C语言为例) 动态型语言 一个程序是如何运行起来的?比如下面的代码 #othermodule.py def add(a, b): ...
- BC之SC:区块链之智能合约——与传统合约的比较以及智能合约模型部署原理、运行原理相关配图
BC之SC:区块链之智能合约--与传统合约的比较以及智能合约模型部署原理.运行原理相关配图 目录 SC与传统合约的比较 SC模型部署原理.运行原理 SC与传统合约的比较 1.传统合约VS智能合约 特 ...
- python程序运行原理_谈谈 Python 程序的运行原理
因为我的个人网站 restran.net 已经启用,博客园的内容已经不再更新.请访问我的个人网站获取这篇文章的最新内容,谈谈 Python 程序的运行原理 这篇文章准确说是『Python 源码剖析』的 ...
- 【计算机视觉】计算机视觉入门大全:基础概念、运行原理、应用案例详解
来源:图灵人工智能 「机器能够模拟人类视觉系统」的幻想已经过时了.自 1960 年代第一批学术论文出现以来,计算机视觉已经走了很远,现代系统已经出现,且它们可以集成到移动应用中. 今天,由于其广泛应 ...
- java能够运行的原理_JAVA程序运行原理分析(一)
作为JAVA的开发人员,需要知道JAVA是如何运行的,这个需要好好思考下. (一)class文件内容 class文件包含JAVA程序执行的字节码,也就是说程序的执行是通过class里面的内容进行执行的 ...
- 重新认识linux应用程序运行原理
文章目录 总述 裸程序 存储布局 DEMO 裸程序的缺点 ELF程序 存储布局 hello world分析 elf可执行程序的适用场景 新的需求 共享库 进程地址空间 进程的内存管理 内核工作原理 L ...
- 1.1 Windows 程序运行原理(消息循环和响应)
************************************************* * 本文由小鸟飞飞整理发表 <samboy@sohu.com> * * 首发网站 ...
- html网页原理,html运行原理
HTML(Hypertext Markup Language)即超文本标记语言.它是用于创建可从一个平台移植到另一平台的超文本文档的一种简单标记语言,经常用来创建Web页面.HTML文件是带有格式标识 ...
- 运行原理_JMeter运行原理
前几篇我们讲解了JMeter的组成部分, 下面我们来了解JMeter的运行原理. 接触过LoadRunner的读者应该知道, LoadRunner可以选择是以进程方式还是以线程方式来运行, 在JMet ...
最新文章
- Nuaa Q1090
- msicuu.exe (msizap.exe),程序的作用
- 华为云大数据存储的冗余方式是三副本_阿里云大数据产品 | 大数据计算
- java lambda表达式详解_Java8新特性Lambda表达式详解
- (116)System Verilog类合成(类包含关系)详解
- Transformations on DStreams之transform的使用 实现黑名单操作/指定过滤
- 所闻所获3:下拉刷新控件1
- 吴昂雄回应Arm中国控制权争夺:Arm罢免我无效
- IO编程(对IO是什么的详解)
- sql查询按周查询出现的跨年问题
- b类 蚂蚁金服_蚂蚁金服开放平台 - 文档中心
- 【2020】win10java(jdk安装)环境变量配置和相关问题解决
- 基于java的网上鲜花销售系统,基于JAVA的鲜花销售管理系统MVC开发,免费分享
- NOIP2016 天天爱跑步
- 视频监控系统由哪几部分组成?(视频监控入门基础-附思维导图)
- Ti 官方文档阅读笔记
- windows更改密码脚本_如何更改您的Windows密码
- 【自学Python】Python IDLE使用
- charles抓包提示unknow
- python和vb的区别 程序语句_python与VB的区别?