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