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

程序是如何运行的

  • 代码在磁盘上,必须加载到内存里,并交给cpu去执行,才算真正运行了。此时称为进程
  • 每个进程都有自己内存空间。空间里除了有可执行代码,还有堆空间、栈空间以及供os管理用的进程数据结构
  • 堆是一块无序的内存空间,进程任何时候申请内存都会从堆空间分配。比如创建一个数组,在堆里分配好空间,然后把对应的内存空间的地址记录在栈里。
  • 栈主要用来记录函数内部的局部变量,堆空间地址等
  • 每个函数都自己的函数栈,当前函数一定在栈顶(所以栈空间里有很多栈)
    在这里插入图片描述

一台计算机如何处理数以百计的任务

通过cpu"分时"技术,虽然cpu只有一个或多个,通过分时却可以同时运行成百上千个程序。
进程运行也不总是需要cpu的,比如IO操作的时候就不需要。
进程在生命周期中,有3种主要状态:运行、就绪、阻塞

系统为什么会变慢,为什么会崩溃

现在的服务器软件系统都是通过多线程技术实现多任务处理。完成很多用户的并发请求处理。我们写的程序以进程的方式在os上运行,然后再进程中创建很多线程,每个线程处理一个用户请求。
以 java web开发为例,这些多线程并不是我们自己创建的,而是外层的是web容易帮我们创建的。
在这里插入图片描述
不管你是否有意识,web程序都是被多线程执行的,web开发天然就是多线程开发。
多线程会遇到临界区资源的问题,这时候一般通过锁来解决。

但是排队等锁、IO操作、对数据库连接的获取 都会引发线程阻塞。并发的线程越多,阻塞的时间也就越长,从web请求者的角度看,就是响应时间变长,系统变慢
被阻塞线程越多,占用的资源也就越多,也不释放。如果阻塞的线程数超过了某个系统资源的极限,就会导致系统宕机,应用崩溃

问题:比如内存不够用了会抛出oom对吧,应该也不至于直接崩溃吧。

解决高并发导致的系统变慢、应用崩溃

主要手段是使用分布式系统架构。
用更多的服务器构成一个集群,以便共同处理用户的并发请求,保证每台服务器的并发负载不会太高。
必要时还可以 :
在请求入口处进行限流,减少系统的并发请求数;
在应用内进行业务降级,减少线程的资源消耗。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值