【面经】Linux零碎系列
Linux,全称 GNU/Linux,是一种免费使用和自由传播的类 UNIX 操作系统,其内核由林纳斯・本纳第克特・托瓦兹于 1991 年 10 月 5 日首次发布,它主要受到 Minix 和 Unix 思想的启发,是一个基于 POSIX 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 Unix 工具软件、应用程序和网络协议。它支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。Linux 有上百种不同的发行版,如基于社区开发的 debian、archlinux,和基于商业开发的 [Red Hat Enterprise Linux](https://baike.baidu.com/item/Red Hat Enterprise Linux/10770503)、SUSE、[Oracle Linux](https://baike.baidu.com/item/Oracle Linux/6876458) 等。url
.1. linux操作系统启动过程
内核引导
当计算机打开电源后,首先是BIOS开机自检
,按照 BIOS 中设置的启动设备(通常是硬盘)来启动。操作系统接管硬件
以后,首先读入 /boot 目录下的内核文件
。运行init
:init 进程是系统所有进程的起点,init 程序首先是需要读取配置文件/etc/inittab
。运行级别
:ctrl+alt+F1–F6 切换到相应的终端运行级别 0:系统停机状态,系统默认运行级别不能设为 0,否则不能正常启动
运行级别 1:
单用户工作状态
,root权限
,用于系统维护,禁止远程登陆 `运行级别 2:
多用户状态(没有NFS)
运行级别 3:
完全的多用户状态(有NFS)
,登陆后进入控制台命令行模式
运行级别 4:系统未使用,保留
运行级别 5:
X11控制台
,登陆后进入图形GUI模式
运行级别 6:系统正常关闭并重启,默认运行级别不能设为 6,否则不能正常启动
.2. 软连接和硬链接
- 硬链接:A 是 B 的硬链接(A 和 B 都是文件名),则 A 的目录项中的 inode 节点号与 B 的目录项中的 inode 节点号相同,即
一个 inode 节点对应两个不同的文件名
,两个文件名指向同一个文件,A 和 B 对文件系统来说是完全平等的。如果删除了其中一个,对另外一个没有影响
。每增加一个文件名,inode 节点上的链接数增加一
,每删除一个对应的文件名,inode 节点上的链接数减一,直到为 0,inode 节点和对应的数据块被回收 - 软连接:没有任何文件系统的限制,任何用户可以创建指向目录的符号链接;看作是
Windows 中的快捷方式
,可以让你快速链接到目标档案或目录。
- 硬链接不可以
跨分区
,软件链可以跨分区。- 不能对目录创建硬链接;不能对不同的文件系统创建硬链接;不能对不存在的文件创建硬链接
- 可以对目录创建软连接;可以跨文件系统;可以对不存在的文件创建软连接
RAID 全称为独立磁盘冗余阵列
(Redundant Array of Independent Disks),基本思想就是把多个相对便宜的硬盘组合起来,成为一个硬盘阵列组,使性能达到甚至超过一个价格昂贵、 容量巨大的硬盘。
.3. Linux 一切皆文件
Linux 中所有内容都是以文件的形式保存和管理,包括一切软硬件。 这样做最明显的好处是,开发者仅需要一套 API 和开发工具即可调取 Linux 系统中绝大部分的资源。同时也带来不利之处,如使用任何硬件设备都必须与根目录下某一目录执行挂载操作,否则无法使用。
.4. Linux 负载过高
系统平均负载被定义为在特定时间间隔内运行队列中(在 CPU 上运行或者等待运行多少进程)的平均进程数。如果一个进程满足以下条件则其就会位于运行队列中:
- 它没有在等待 I/O 操作的结果
- 它没有主动进入等待状态(没有调用
wait
)- 没有被停止 (如等待终止)
在 Linux 中,进程分为三种状态,一种是
阻塞的进程
(blocked process),一种是可运行的进程
(runnable process),另外就是正在运行的进程
(running process)
- 通过命令
ps ux
排查哪些进程 cpu 占用率高; - 查看对应 java 进程的
每个线程的 CPU 占用率
。通过命令ps -Lp 15047 cu
; 追踪线程内部
,查看 load 过高原因。通过命令jstack 15047
, 查找到对应的 threadid,再反查代码。
.5. inode 节点表
Linux 通过 inode 节点表将文件的逻辑结构和物理结构
进行转换。
- inode 节点是一个 64 字节长的表,表中包含了文件的相关信息,其中有
文件的大小、文件所有者、文件的存取许可方式以及文件的类型等重要信息
。在 inode 节点表中最重要的内容是磁盘地址表
。在磁盘地址表中有 13 个块号,文件将以块号在磁盘地址表中出现的顺序依次读取相应的块。 - Linux 文件系统通过把
inode 节点和文件名进行连接
,当需要读取该文件时,文件系统在当前目录表中查找该文件名对应的项
,由此得到该文件相对应的 inode 节点号
,通过该 inode 节点的磁盘地址表把分散存放的文件物理块连接成文件的逻辑结构。
.6. 网站访问过慢
- 服务器出口带宽不够用
本身服务器购买的出口带宽比较小
。一旦并发量大的话,就会造成分给每个用户的出口带宽就小,访问速度自然就会慢。跨运营商网络导致带宽缩减
。例如,公司网站放在电信的网络上,那么客户这边对接是长城宽带或联通,这也可能导致带宽的缩减。
- 服务器负载过大,导致响应不过来
- 分析系统负载,使用 w 命令或者 uptime 命令查看系统负载。如果
负载很高,则使用 top 命令查看 CPU
,MEM 等占用情况
,要么是CPU 繁忙,要么是内存不够
- 如果这二者都正常,再去使用 sar 命令分析
网卡流量,分析是不是遭到了攻击
。一旦分析出问题的原因,采取对应的措施解决,如决定要不要杀死一些进程,或者禁止一些访问等。
- 分析系统负载,使用 w 命令或者 uptime 命令查看系统负载。如果
- 数据库瓶颈
- 如果
慢查询比较多
。那么就要开发人员或 DBA 协助进行 SQL 语句的优化。 - 如果
数据库响应慢,考虑可以加一个数据库缓存
,如 Redis 等。然后,也可以搭建 MySQL 主从,一台 MySQL 服务器负责写,其他几台从数据库负责读。
- 如果
- 网站开发代码没有优化好
- SQL 语句没有优化,导致数据库读写相当耗时。
.7. 网站访问慢,排查思路
1、首先要确定是用户端还是服务端
的问题。当接到用户反馈访问慢,那边自己立即访问网站看看,如果自己这边访问快,基本断定是用户端问题,就需要耐心跟客户解释,协助客户解决问题。
不要上来就看服务端的问题。一定要从源头开始,逐步逐步往下。
2、如果访问也慢,那么可以利用浏览器的调试功能,看看加载那一项数据消耗时间过多,是图片加载慢,还是某些数据加载慢。
3、针对服务器负载
情况。查看服务器硬件 (网络、CPU、内存) 的消耗情况
。如果是购买的云主机,比如阿里云,可以登录阿里云平台提供各方面的监控,比如 CPU、内存、带宽的使用情况。
4、如果发现硬件资源消耗都不
高,那么就需要通过查日志,比如看看 MySQL 慢查询的日志
,看看是不是某条 SQL 语句查询慢,导致网站访问慢。
.8. Linux 内核分类
tail +99 file1 | head -1 # tail 和head的用法, watch 命令监视,或者tail -f
.9. top 命令
PID:进程的 ID
USER:进程所有者
PR:进程的优先级别,越小越优先被执行
NInice:值
VIRT:进程占用的虚拟内存
RES:进程占用的物理内存
SHR:进程使用的共享内存
S:进程的状态。S 表示休眠,R 表示正在运行,Z 表示僵死状态,N 表示该进程优先值为负数
% CPU:进程占用 CPU 的使用率
% MEM:进程使用的物理内存和总内存的百分比
TIME+:该进程启动后占用的总的 CPU 时间,即占用 CPU 使用时间的累加值。
COMMAND:进程启动命令名称
.10. 通信手段
.11. 编译链接
.12. 编译过程
- 预编译(预编译器处理如
#include
、#define
等预编译指令,生成.i
或.ii
文件) - 编译(编译器进行
词法分析、语法分析、语义分析、中间代码生成、目标代码生成、优化
,生成.s
文件) - 汇编(汇编器把
汇编码翻译成机器码
,生成.o
文件) - 链接(
连接器进行地址和空间分配、符号决议、重定位
,生成.out
文件)
.13. Linux 共享库
- 路径:
/lib
:存放系统最关键和最基础的共享库
,如动态链接器、C 语言运行库、数学库等/usr/lib
:存放非系统运行时所需要的关键性的库,主要是开发库
/usr/local/lib
:存放跟操作系统本身并不十分相关的库,主要是一些第三方应用程序的库
- 动态链接器会在
/lib
、/usr/lib
和由/etc/ld.so.conf
配置文件指定的,目录中查找共享库
- 环境变量
LD_LIBRARY_PATH
:临时改变某个应用程序的共享库查找路径,而不会影响其他应用程序LD_PRELOAD
:指定预先装载的一些共享库甚至是目标文件LD_DEBUG
:打开动态链接器的调试功能
.14. find_package 原理
find_package 采用两种模式搜索库:
- Module 模式:搜索 CMAKE_MODULE_PATH 指定路径下的 FindXXX.cmake 文件,执行该文件从而找到 XXX 库。其中,具体查找库并给 XXX_INCLUDE_DIRS 和 XXX_LIBRARIES 两个变量赋值的操作由 FindXXX.cmake 模块完成。
- Config 模式:搜索 XXX_DIR 指定路径下的 XXXConfig.cmake 文件,执行该文件从而找到 XXX 库。其中具体查找库并给 XXX_INCLUDE_DIRS 和 XXX_LIBRARIES 两个变量赋值的操作由 XXXConfig.cmake 模块完成。
set(Caffe_DIR /home/wjg/projects/caffe/build) #添加CaffeConfig.cmake的搜索路径
find_package(Caffe REQUIRED) # 这个命令
if (NOT Caffe_FOUND)message(FATAL_ERROR "Caffe Not Found!")
endif (NOT Caffe_FOUND)
include_directories(${Caffe_INCLUDE_DIRS})
add_executable(useSSD ssd_detect.cpp) # 添加可执行文件
target_link_libraries(useSSD ${Caffe_LIBRARIES}) # 连接所需要的库文件# 创建共享库(把工程内的cpp文件都创建成共享库文件,方便通过头文件来调用)
add_library(${PROJECT_NAME} SHARED
src/cpp文件名
……
)
# 头文件
include_directories("路径")
# 把刚刚生成的${PROJECT_NAME}库和所需的其它库链接起来
target_link_libraries(${PROJECT_NAME}
/usr/lib/i386-linux-gnu/libboost_system.so
15. Linux 管道命令
管道是一种通信机制,通常用于进程间的通信(也可通过 socket 进行网络通信),它表现出来的形式将前面每一个进程的输出(stdout)直接作为下一个进程的输入(stdin)
16. Linux 常用命令
- which, find, whereis, cat
- sed, awk, head, tail 查看大文件
- free 查看内存
.1. top
第一行,
任务队列信息
,同 uptime 命令的执行结果,具体参数说明情况如下:00:12:54 — 当前系统时间
up ?days, 4:49 — 系统
已经运行了?天 4 小时 49 分钟
(在这期间系统没有重启过)21users —
当前有 1 个用户登录系统
load average: 0.06, 0.02, 0.00 — load average 后面的三个数分别是
1 分钟、5 分钟、15 分钟
的负载情况。load average 数据是每隔 5 秒钟检查一次活跃的进程数,然后按特定算法计算出的数值。如果这个数除以逻辑 CPU 的数量,结果高于 5 的时候就表明系统在超负荷运转了。第二行,
Tasks — 任务(进程)
,具体信息说明如下:系统现在共有
256 个进程
,其中处于运行中的有 1 个,177 个在休眠(sleep),stoped 状态的有 0 个,zombie 状态(僵尸)的有 0 个。第三行,
cpu 状态信息
,具体属性说明如下:0.2% us —
用户空间
占用 CPU 的百分比。0.2% sy —
内核空间
占用 CPU 的百分比。0.0% ni — 改变过优先级的进程占用 CPU 的百分比
99.5% id — 空闲 CPU 百分比
0.0% wa —
IO 等待
占用 CPU 的百分比0.0% hi —
硬中断(Hardware IRQ)
占用 CPU 的百分比0.0% si —
软中断(Software Interrupts)
占用 CPU 的百分比第四行,
内存状态
,具体信息如下:2017552 total — 物理内存总量
720188 used — 使用中的内存总量
197916 free — 空闲内存总量
1099448 cached —
缓存的总量
第五行,
swap 交换分区信息
,具体信息说明如下:998396 total — 交换区总量
989936 free — 空闲交换区总量
8460 used — 使用的交换区总量
1044136 cached — 缓冲的交换区总量
.2. 查看端口和进程
- 先查看进程
pid: ps -ef | grep 进程名
- 通过 pid 查看占用端口:
netstat -nap | grep 进程pid
- 直接通过端口查进程:
netstat -nap | grep 端口号
17. 查看已经打开的文件
lsof (list open files) 是一个
列出当前系统打开文件的工具
。在 linux 环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件
。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符fd为应用程序与基础操作系统之间的交互提供了通用接口
。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过 lsof 工具能够查看这个列表对系统监测以及排错将是很有帮助的。
18. 文件系统
- Windows:FCB 表 + FAT + 位图
- Unix:
inode + 混合索引 + 成组链接
19. 大端地址&小端地址
主机字节序又叫 CPU 字节序,其不是由操作系统决定的,而是由 CPU 指令集架构
决定的。主机字节序分为两种:
大端字节序
(Big Endian):高序字节存储在低位地址
,低序字节存储在高位地址小端字节序(
Little Endian):高序字节存储在高位
地址,低序字节存储在低位地址
- x86(Intel、AMD)、MOS Technology 6502、Z80、VAX、PDP-11 等处理器为小端序;
- Motorola 6800、Motorola 68000、PowerPC 970、System/370、SPARC(除 V9 外)等处理器为大端序;
- ARM(默认小端序)、PowerPC(除 PowerPC 970 外)、DEC Alpha、SPARC V9、MIPS、PA-RISC 及 IA64 的字节序是可配置的。
20. 通道
单向通道(单工通道)
:只有一个方向通信,没有反方向交互,如广播- 双向交替通信(半双工通信):通信双方都可发消息,但不能同时发送或接收
双向同时通信(全双工通信)
:通信双方可以同时发送和接收信息
20. 通道复用计数
频分复用
(FDM,Frequency Division Multiplexing):不同用户在不同频带,所用用户在同样时间占用不同带宽资源时分复用(
TDM,Time Division Multiplexing):不同用户在同一时间段的不同时间片,所有用户在不同时间占用同样的频带宽度波分复用
(WDM,Wavelength Division Multiplexing):光的频分复用码分复用
(CDM,Code Division Multiplexing):不同用户使用不同的码,可以在同样时间使用同样频带通信
21. 操作系统malloc的实现原理
当开辟的空间小于 128K 时,调用 brk()函数;当
开辟的空间大于 128K 时,调用 mmap()
。malloc 采用的是内存池的管理方式,以减少内存碎片
。先申请大块内存作为堆区,然后将堆区分为多个内存块。当用户申请内存时,直接从堆区分配一块合适的空闲快。采用隐式链表将所有空闲块
,每一个空闲块记录了一个未分配的、连续的内存地址。
22. Zore Copy 实现机制
“零拷贝”:在整个发送数据过程中,数据的复制是必不可少的,这里数据复制分两种类型,一种是
CPU 参与的一个字节一个字节处理的数据复制
,一个是CPU 不用参与,通过专有硬件 DMA 参与的,批量数据复制。
23. mmap 实现的零拷贝 I/O
原理:mmap 是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存,而系统会自动回写脏页面到对应的文件磁盘上,即完成了对文件的操作而不必再调用 read, write 等系统调用函数。相反,内核空间对这段区域的修改也直接反映用户空间,从而可以实现不同进程间的文件共享。
- mmap 系统调用,导致
用户空间到内核空间的上下文切换
(第一次上下文切换)。通过 DMA 引擎将磁盘文件
中的内容拷贝到内核空间缓冲区
中 (第一次拷贝: hard drive ——> kernel buffer)。 - mmap 系统
调用返回
,导致内核空间到用户空间的上下文切换
(第二次上下文切换)。接着用户空间和内核空间共享这个缓冲区
,而不需要将数据从内核空间拷贝到用户空间。因为用户空间和内核空间共享
了这个缓冲区数据,所以用户空间就可以像在操作自己缓冲区中数据一般操作这个由内核空间共享的缓冲区数据 - 发出 write 系统调用,
导致用户空间到内核空间的上下文切换
(第三次上下文切换)。将数据从内核空间缓冲区拷贝到内核空间 socket 相关联的缓冲区
(第二次拷贝: kernel buffer ——> socket buffer)。 - write 系统调用返回,导致
内核空间到用户空间的上下文切换
(第四次上下文切换)。通过DMA 引擎将内核空间 socket 缓冲区中的数据传递到协议引擎
(第三次拷贝: socket buffer ——> protocol engine - 通过 mmap 实现的零拷贝 I/O 进行了 4 次用户空间与内核空间的上下文切换,以及 3 次数据拷贝。其中 3 次数据拷贝中包括了 2 次 DMA 拷贝和 1 次 CPU 拷贝
23. Linux IO 流程
应用程序代码运行在
用户模式
下,当应用程序需要实现内核模式下的指令
时,先向操作系统发送调用请``求
。操作系统收到请求后,执行系统调用接口
,使处理器进入内核模式
。当处理器处理完系统调用操作后,操作系统会让处理器返回用户模式,继续执行用户代码。
进程的虚拟地址空间
可分为两部分,内核空间和用户空间
。内核空间中存放的是内核代码和数据
,而进程的用户空间中存放的是用户程序的代码和数据
。不管是内核空间还是用户空间,它们都处于虚拟空间中,都是对物理地址的映射
。
23. Linux 虚拟文件系统
一个操作系统可以支持多种底层不同的文件系统(比如
NTFS, FAT, ext3, ext4
),为了给内核和用户进程提供统一的文件系统视图
,Linux 在用户进程和底层文件系统之间加入了一个抽象层
,即虚拟文件系统 (Virtual File System, VFS),进程所有的文件操作都通过 VFS,由 VFS 来适配各种底层不同的文件系统,完成实际的文件操作。
24. 虚拟文件系统主要模块
超级块(super_block)
,用于保存一个文件系统的所有元数据
,相当于这个文件系统的信息库,为其他的模块提供信息。因此一个超级块可代表一个文件系统。文件系统的任意元数据修改都要修改超级块。超级块对象是常驻内存并被缓存的。目录项模块
,管理路径的目录项
。比如一个路径 /home/foo/hello.txt,那么目录项有 home, foo, hello.txt。目录项的块,存储的是这个目录下的所有的文件的 inode 号和文件名等信息
。其内部是树形结构,操作系统检索一个文件,都是从根目录开始,按层次解析路径中的所有目录,直到定位到文件。inode 模块
,管理一个具体的文件
,是文件的唯一标识
,一个文件对应一个 inode
。通过 inode 可以方便的找到文件在磁盘扇区的位置。同时inode 模块可链接到 address_space 模块
,方便查找自身文件数据是否已经缓存。打开文件列表模块
,包含所有内核已经打开的文件。已经打开的文件对象由open 系统调用在内核中创建,也叫文件句柄
。打开文件列表模块中包含一个列表,每个列表表项是一个结构体 struct file,结构体中的信息用来表示打开的一个文件的各种状态参数。- file_operations 模块。这个模块中维护一个数据结构,是一系列函数指针的集合,其中包含所有可以使用的系统调用函数,例如 open、read、write、mmap 等。每个打开文件(打开文件列表模块的一个表项)都可以连接到 file_operations 模块,从而对任何已打开的文件,通过系统调用函数,实现各种操作。
- address_space 模块,它表示一个文件在页缓存中已经缓存了的物理页。它是页缓存和外部设备中文件系统的桥梁。如果将文件系统可以理解成数据源,那么 address_space 可以说关联了内存系统和文件系统。
23. 新建空文件
新建一个空文件需要消耗掉一个
inode
,用来保存用户、创建时间等元数据
。新建一个空文件还需要消耗掉其所在
目录的 block 中一定的空间
,这些空间用来保存文件名,inode 号等信息。
24. 一个字节消耗多少
文件系统是按照
inode+block 来组织
的,所以不管你的文件多小,哪怕只有一个字节,在数据上都会消耗掉整整一个块 (当然还得算上 inode 等开销)。这个块大小可以通过dumpe2fs
等命令来查看。如果想改变这个块大小怎么办?对不起,只能重新格式化
。
24. 文件很多时ls变慢
这就是当你的文件夹下面文件特别多,尤其是文件名也比较长的时候,它会消耗掉非常多的 block。当你遍历文件夹的时候,如果
Page Cache 中没有命中你要访问的 block
,就会穿透到磁盘上进行实际的 IO。在你的角度来看,就是你执行完ls
后,卡住了。
24. rm 操作原理
硬盘就是一个扇区组成的大数组,是无法被我们使用的,需要经过
分区、格式化和挂载
三个步骤。分区是把所有的扇区按照柱面分割成不同的大块,格式化就把原始的扇区数组变成了可被 Linux 文件系统使用的 inode、block 等基本元素了。mkfs: 把我们的连续的磁盘空间进行划分和管理
23. 什么是Linux 内核
- 系统内存管理
- 应用程序管理
- 硬件设备管理
- 文件系统管理
24. 交换空间
- 交换空间是 Linux 使用的一定空间,用于临时保存一些并发运行的程序。
当 RAM 没有足够的内存来容纳正在执行的所有程序时
,就会发生这种情况。
23. 大文件为什么 cp 比mv 慢
- cp 命令要把
所有的文件地址变量都找到,然后读取内容
,然后再另外的文件夹地址下开辟一块内存去储存文件内容
。
26. 给你一个包含 100 亿个 url 的文件,请你找出使用频率最高的 10 个 url,应该怎么做?
- 用
哈希分成多个文件
,再把这些小文件一次性加到内存用 map,取前 10。最后从每个文件的前 10; MapReduce 工作
27. 网络中有上亿个 url,每个 url 都有一个 id 唯一标识,现在给你 100 台机器,你会怎么去设计他们的缓存系统?
- 用哈希对流量分组,每台机器承接一定的流量,再搞点负载均衡的策略
28. 本地机器只有 2.5G,但我想申请 4G 的内存空间,可以做到吗?
- 取决于你的系统总线数量,如果是
32 位的,则最大的可寻址内存空间为 4G
,而如linux 系统还要保留 1G
,则不能申请,如果是 64 位的则可以申请
29. Kill 某个进程不能被杀死
- SIGNKILL(9) 的效果是立即杀死进程。该信号不能被阻塞,处理和忽略。
- SIGNTERM(15) 的效果是正常退出进程,退出前可以被阻塞或回调处理。并且它是 Linux 缺省的程序中断信号 (默认是 15)。
kill - 9 表示强制杀死该进程
;与 SIGTERM 相比,这个信号不能被捕获或忽略,同时接收这个信号的进程在收到这个信号时不能执行任何清理- 处于
内核态的进程会屏蔽所有信号
僵死进程也不能被 kill
30. Debug 原理
- JPDA (Java Platform Debugger Architecture), Debuggge。
被调试者
。传输纽带
调试者
31. malloc 出 100M,1G 的内存还剩多少
- malloc 100M 内存成功时,其实并没有真实拿到。只有当 100M 内存中的任何一页,被写一次的时候,才成功。
- malloc 100M 内存成功时,Linux 把 100M 内存全部以只读的形式,映射到一个全部清 0 的页面
.32. 简述一下虚拟内存和物理内存,为什么要用虚拟内存,好处是什么?
物理内存:物理内存有四个层次,分别是寄存器、高速缓存、主存、磁盘。
寄存器:速度最快、量少、价格贵。
高速缓存:次之。
主存:再次之。
磁盘:速度最慢、量多、价格便宜。
操作系统会对物理内存进行管理,有一个部分称为内存管理器 (memory manager),它的主要工作是有效的管理内存,记录哪些内存是正在使用的,在进程需要时分配内存以及在进程完成时回收内存。
虚拟内存:操作系统
为每一个进程分配一个独立的地址空间
,虚拟内存。虚拟内存与物理内存存在映射关系,通过页表寻址完成虚拟地址和物理地址的转换。为什么要用虚拟内存:因为早期的内存分配方法存在以下问题:
(1)
进程地址空间不隔离
。会导致数据被随意修改。(2)
内存使用效率低
。(3)
程序运行的地址不确定
。操作系统随机为进程分配内存空间,所以程序运行的地址是不确定的。使用虚拟内存的好处:
(1)
扩大地址空间
。每个进程独占一个 4G 空间,虽然真实物理内存没那么多
。(2)
内存保护
:防止不同进程对物理内存的争夺和践踏,可以对特定内存地址提供写保护,防止恶意篡改。(3)可以实现
内存共享
,方便进程通信。(4)可以
避免内存碎片
,虽然物理内存可能不连续,但映射到虚拟内存上可以连续。使用虚拟内存的缺点:
(1)虚拟内存需要
额外构建数据结构,占用空间
。(2)虚拟地址到物理地址的转换,
增加了执行时间
。(3)
页面换入换出耗时
。(4)
一页如果只有一部分数据,浪费内存
。
.33. 缺页中断
- 缺页异常:malloc 和 mmap 函数在分配内存时只是建立了进程虚拟地址空间,并没有分配虚拟内存对应的物理内存。当进程访问这些
没有建立映射关系的虚拟内存时
,处理器自动触发一个缺页异常,引发缺页中断。 - 缺页中断:
缺页异常后将产生一个缺页中断
,此时操作系统会根据页表中的外存地址在外存中找到所缺的一页,将其调入内存。
.34. 孤儿进程,什么是僵尸进程,如何解决僵尸进程
- 孤儿进程:是指一个父进程退出后,而它的一个或多个子进程还在运行,那么这些子进程将成为孤儿进程。
孤儿进程将被 init 进程(进程号为 1)所收养
,并且由 init 进程对它们完整状态收集工作。 - 僵尸进程:是指
一个进程使用 fork 函数创建子进程
,如果子进程退出,而父进程并没有调用 wait () 或者 waitpid () 系统调用取得子进程的终止状态
,那么子进程的进程描述符仍然保存在系统中
,占用系统资源,这种进程称为僵尸进程。- fork 子进程之后我们都要及时使用 wait 系统调用
- 使用 kill 命令。
【面经】Linux零碎系列相关推荐
- linux怎么创建牡蛎_文件amp;目录小技巧 | Linux后门系列
0x01 Linux 目录技巧 我们都知道 Windows 下文件和文件夹命名是有很多规则和限制的,但是可以通过一些程序来绕过限制,今天我们来看看 Linux 有哪些有趣的规则 参考 https:// ...
- linux中的shell有printf吗,Linux Shell系列教程之(八)Shell printf命令详解
在上一篇:Linux Shell系列教程之(七)Shell输出这篇文章中,已经对Shell printf命令有了一个简略的介绍,本篇给大家详细介绍下Shell中的printf命令. 一.Shell p ...
- 深入理解 Linux Cgroup 系列(二):玩转 CPU
原文链接:深入理解 Linux Cgroup 系列(二):玩转 CPU 上篇文章主要介绍了 cgroup 的一些基本概念,包括其在 CentOS 系统中的默认设置和控制工具,并以 CPU 为例阐述 c ...
- linux使用shell函数扩充命令,Linux Shell系列教程之(十五) Shell函数简介 | Linux大学...
摘要 函数可以将一个复杂功能划分成若干模块,从而使程序结构更加清晰,代码重复利用率更高. 高级语言都支持函数,Shell也不例外.今天就为大家介绍下Shell中函数相关用法. 函数可以将一个复杂功能划 ...
- [基础知识]Linux新手系列之三
2019独角兽企业重金招聘Python工程师标准>>> [基础知识]Linux新手系列之三 给Linux新手 [系列之三] Linux相关资料由兄弟连分享 OK,从哪里得到Linux ...
- Linux视频教程系列汇总
Linux视频教程系列汇总 该系列视频涉及Linux学习的方方面面,入门的.高级的.编程的.安全的,都有了,每一套都很完整. 由于文件比较大,全部使用FTP发布的,建议使用能重复连接的下载工具(如迅雷 ...
- Linux Rootkit 系列三:实例详解 Rootkit 必备的基本功能
本文所需的完整代码位于笔者的代码仓库:https://github.com/NoviceLive/research-rootkit. 测试建议: 不要在物理机测试!不要在物理机测试! 不要在物理机测试 ...
- Linux学习系列之Mount
Linux学习系列之Mount 在Linux中,如果你要使用储存设备 (Mo.硬盘.光驱等) ,就得先将它挂上 (Mount),而当储存设备挂上了之后,就可以把它当成一个目录来进行访问.挂上一个设备使 ...
- linux用while循环输出1到10,Linux Shell系列教程之(十一)Shell while循环 | Linux大学...
摘要 在上一篇Linux Shell系列教程之(十)Shell for循环中,我们已经对Shell 循环语句的for循环进行了介绍,本篇给大家介绍下Shell 中另一种循环语句:Shell while ...
最新文章
- Enterprise Library Step By Step系列(十二):异常处理应用程序块——进阶篇
- 美团点评业务风控系统构建经验
- 18110 Koishi's travel, Satori's travel
- nodejs的PM2进程管理
- pandas dataframe对多列同时排序
- 获取当前时间的天、周、月、季度、半年度、年度开始和结束时间
- 解决Python print输出不换行没空格的问题
- pandas删除有空值的一行
- 数据挖掘:原理与实践(基础篇)(进阶篇)
- L2TP的LAC自动拨号实验
- 【网易云信】即时通讯SDK DEMO
- BSC(币安智能链)主网链部署
- 封装继承多态的关联性
- 环信php修改头像,集成环信3.0 处理UI上展示昵称 头像的方法
- There appears to be a gap in the edit log. We expected txid 2289, but got txid 2859.
- writeup wyu-ctf
- Red Hat Enterprise Linux 5.1 Server(正式版)各版本下载2011-04-17 22:21
- elliptic-curve签名验证verify signature in EdDSA
- 现代函数概念的“序偶”定义
- wxpython文档_wxPython常用的文件与文件夹操作