从系统的角度分析影响程序执行性能的因素
1. 精简的 Linux 系统概念模型
一个 Linux 系统主要可以划分为以下三部分:
-
用户空间
-
Shell
shell 顾名思义,就是外壳的意思。好像把内核包裹起来的外壳。它是一种特殊的应用程序,俗称命令行。为了方便用户和系统交互。
-
库函数
库函数就是屏蔽这些复杂的底层实现细节,减轻程序员的负担,从而更加关注上层的逻辑实现。它对系统调用进行封装,提供简单的基本接口给用户,这样增强了程序的灵活性。
-
-
内核空间
-
系统调用将 Linux 整个体系分为用户态和内核态(或者说内核空间和用户空间)。
-
内核实现了操作系统的三大功能,即进程管理、内存管理和文件系统;
对应操作系统原理课程中最重要的 3 个抽象概念是进程、虚拟地址和文件。
-
驱动程序是应用软件和硬件的桥梁。
-
-
硬件空间
|---------------------------------------|
| |
| Application |------------|------------|
| | Library | Shell |
|---------------------------------------|
| System call |
|---------------------------------------|
| Kernel |
|---------------------------------------|
| Device Driver |
|---------------------------------------|
| Hardware |
----------------------------------------|
例如当我们想在shell里打印出 "Hello World" 时,流程如下:
- 调用 printf() 函数
- 跟踪发现调用 write() 函数
- 继续跟踪,发现 write() 的声明再 user.h 中,但找不到具体实现,说明是一个系统调用
- write() 系统调用号存放在 eax 寄存器中,通过 int 进行系统调用
- 接下来就是中断的处理过程,进入内核态。
- 执行结束后恢复现场,回到用户态,"Hello World" 出现在 shell 中。
2. 影响应用程序性能表现的因素
以 Redis 数据库为例。
-
Redis 使用操作系统提供的虚拟内存来存储数据,如果操作系统使用交换空间,数据可能被实际保存在硬盘上。
-
Redis 支持持久化,可以把数据保存在硬盘上,但持久化也会占用一部分资源。
-
Redis 大多数时候时单线程运行,就不会受到线程同步带来的开销。
-
虽然 Redis 是单线程的,但通过多路 I/O 复用机制 epoll ,处理客户端请求时,不会阻塞主线程。
但 epoll 在监控的描述符状态变化很多的情况下,由于 epoll 中所有的描述符都存储在内核中,描述符的状态改变可能频繁触发系统调用,降低效率。
-
Redis 单纯执行(大多数指令)一个指令不到 1 微秒,但是,单核 CPU 一秒就能处理一百万个指令(大概对应着几十万个请求),用不着实现多线程,网络才是瓶颈。

浙公网安备 33010602011771号