01 程序运行原理
程序是如何运行起来的?
-
1 、程序员被开发出来,文本格式代码,不能直接运行,需要编译器或者虚拟机先编译成机器码(也叫可执行代码),存储在文件系统中(即磁盘)。
-
2 、操作系统将编译好的代码加载到内存中。
-
3、CPU去执行,运行,程序运行起来被称作进程。
运行起来的程序,在运行期使用内存堆空间,栈空间,等数据结构。
程序运行时需要创建数组等数据结构,这些由操作系统在进程中分配。
进程的堆,栈中分配相应的空间,比如堆,堆的地址又存在栈中。
栈:一种数据结构,遵循先进后出,后进先出的顺序。
比如函数
void f(){
int x = g(1); x++; //g函数返回,当前堆栈顶部为f函数栈帧,在当前栈帧继续执行f函数的代码。
}
int g(int x){
return x + 1;
}
每次函数调用,操作系统都会在栈中创建一个栈帧,方法程序(函数)通常被压栈进栈,函数中的变量,内存都在当前栈帧中,如下图。
计算机如何同时处理数以百计的任务
通常情况下我们个人的PC 可能会是一核心或两核,现在基本都4核或者更高核cpu了
我们个人通常是用电脑会同时打开很多程序软件,听歌的,看电影的,下载视频等等几十个任务。
而服务器可以同时处理成千上百个任务以及并发请求而且一点儿都不卡顿(这里也存在服务器配置高的因素)
为什么电脑可以同时处理这么多的任务呢?
这里主要依靠的是操作系统的 CPU 分时共享技术
很多个进程在执行,操作系统会将 CPU 的执行时间分成很多份,进程按照某种策略轮流在 CPU 上运行
每个进程都只被执行了很短一个时间,但是在外部看来却好像是所有的进程都在同时执行,每个进程似乎都独占一个 CPU 执行
为什么每个程序不单独使用进程呢?
原因是因为CPU每个进程在CPU上轮训使用,消耗资源以及时间很大!
通常我们在打开自己电脑时候开了很多软件(或者进程)后明显的感觉自己电脑变慢了,卡顿了。
一方面是因为自己电脑内存小,另一方面是因为进程数太多了,cpu切换需要花费时间。
那么如何解决进程多cpu切换代价大的情况呢?
计算机的先辈们引入了线程的概念,比如我们开发中容器tomcat 每次用户请求时候,tomcat分配给用户一个线程,在进程里可以启动很多的线程,线程可以理解为轻量级的进程,在进程内创建,拥有自己的线程栈,在 CPU 上进行线程切换的代价也更小。
线程在运行时,和进程一样,也有三种主要状态
运行:当一个进程在 CPU 上运行时,则称该进程处于运行状态。处于运行状态的进程的数目小于等于 CPU 的数目。
就绪:当一个进程获得了除 CPU 以外的一切所需资源,只要得到 CPU 即可运行,则称此进程处于就绪状态,就绪状态有时候也被称为等待运行状态。
阻塞:也称为等待或睡眠状态,当一个进程正在等待某一事件发生(例如等待 I/O 完成,等待锁……)而暂时停止运行,这时即使把 CPU 分配给进程也无法运行,故称该进程处于阻塞状态。
系统为什么会变慢,为什么会崩溃
主要大致可以分为一下几个步骤原因
- 1、线程锁,引起线程阻塞,多线程情况下可能会存在线程排队等锁,县城无法并行执行导致速度变慢。
- 2、此外I/O阻塞同理,比如数据库连接,并行数量超过数据库连接数量,线程就会出现阻塞
- 3、等待其他县城释放连接才能访问数据库,并发越大等待连接越多,响应时间越长,系统越慢。
- 4、被阻塞的线程越多,占据的系统资源也越多,这些被阻塞的线程既不能继续执行,也不能释放当前已经占据的资源,在系统中一边等待一边消耗资源,如果阻塞的线程数超过了某个系统资源的极限,就会导致系统宕机,应用崩溃。
如何解决
- 1、采用请求限流
- 2 、集群架构
- 3、分布式架构
原文 极客时间《后端技术基础原理》