Linux系统概念模型主要由:进程管理、内存管理、中断和异常、文件系统等几部分组成。
? 进程的定义:程序运行的一个实例
? 进程的特征:一方面竞争并占用系统资源(比如设备和内存),向系统提出各种请求服务;进程另一方面是基本的调度单位,任何时刻只有一个进程在CPU上运行。
? 进程实体的组成:① 进程描述符;② 进程专用的系统堆栈空间; ③ 供进程执行的程序段; ④进程专用的数据段和用户堆栈空间。
? 进程状态主要分为可运行状态、可中断的等待状态、不可中断的等待状态、暂停状态、跟踪状态、僵死状态和僵死撤销状态。
? 进程管理主要负责管理进程的创建、销毁以及状态变换。
? Linux通过保存和恢复进程/线程运行中的上下文,使进程/线程可以暂停,切换,恢复,从而实现了它们对CPU资源的共享,Linux目前默认使用CFS调度器。
? Linux 采用了“虚拟内存”的内存管理方式。Linux 将内存划分为的“内存页”。Linux 包括了管理可用内存的方式,以及物理和虚拟映射所使用的硬件机制:
task_struct
等都需要物理内存分配器来为其分配内存。物理内存分配器的优劣的重要评价维度是内存碎片和分配速度,对于大块内存,Linux使用伙伴系统;对于小内存,Linux使用SLAB分配器。? 中断:中断是指 CPU 对系统发生某事件时的这样一种响应。CPU 暂停正在执行的程序,在保留现场后自动地转去执行该事件的中断处理程序,执行完后,再返回到原程序的断点处继续执行。中断根据来源,可进一步分为外中断和内中断:
? 中断和异常的区别:
? Linux 系统下的各种事物都可看作是文件,比如说文档、目录、键盘、打印机以及 IPC 等输入/输出资源都是定义在文件系统空间下的字节流。Linux 以文件的形式对计算机中的数据和硬件资源进行管理,也就是彻底的一切皆文件,反映在Linux的文件类型上就是:普通文件、目录文件(也就是文件夹)、设备文件、链接文件、管道文件、套接字文件(数据通信的接口)等等。
? 这些种类繁多的文件被Linux使用目录树进行管理, 所谓的目录树就是以根目录(/)为主,向下呈现分支状的一种文件结构。一切皆文件和文件目录树的资源管理方式一起构成了Linux的文件体系,让Linux操作系统可以方便使用系统资源。
? Linux文件体系主要在于把操作系统相关的东西用文件这个载体实现:文件系统挂载在操作系统上,操作系统整个系统又放在文件系统里。
? Linux 的文件系统是两层结构,虚拟文件系统负责对多种文件系统进行管理和协调,允许它们在同一操作系统上共同工作;其下面是各种特异化的文件系统。
这里以读文件为例。
进程调用库函数向内核发起读文件请求;
内核通过检查进程的文件描述符定位到虚拟文件系统的已打开文件列表表项;
调用该文件可用的系统调用函数read();
read()函数通过文件表项链接到目录项模块,根据传入的文件路径,在目录项模块中检索,找到该文件的inode;
在inode中,通过文件内容偏移量计算出要读取的页;
通过inode找到文件对应的address_space;
在address_space中访问该文件的页缓存树,查找对应的页缓存结点:
如果页缓存命中,那么直接返回文件内容;
如果页缓存缺失,那么产生一个页缺失异常,创建一个页缓存页,同时通过inode找到文件该页的磁盘地址,读取相应的页填充该缓存页;重新进行第6步查找页缓存;
文件内容读取成功。
? 应用程序的性能很大程度上跟存储方式和系统中断有着密切的关系,不同的存储方式可能有着不同的性能开销,例如对于一个二维数组,有两种方式进行数据保存,一种是行优先存储,一种是列优先存储:
package main
import (
"fmt"
"time"
)
//第一种代码
func First() {
test := [1000][1000]int{}
for i := 0 ; i < 1000; i++{
for j := 0 ; j < 1000 ; j++{
test[i][j] = 1;
}
}
}
// 第二种代码
func Second() {
test := [1000][1000]int{}
for j := 0 ; j < 1000; j++{
for i := 0 ; i < 1000 ; i++ {
test[i][j] = 1;
}
}
}
// 测试
func test(a func()) {
start := time.Now()
a()
end := time.Now()
fmt.Println(time.Duration(end.Sub(start)) * time.Millisecond)
}
func main() {
test(First)
test(Second)
}
? 测试结果:
? 由以上结果可以发现:方法一比方法二快。
? 原因:由于数组是连续存储的,且根据Linux的内存管理机制,可以得到,第一种以行优先为主的存储方式相对第二种以列优先的存储方式拥有更少的缺页中断,从而拥有更少的开销,从而性能更好。
? CPU 的速度与性能很大一部分决定了系统整体的性能,因此 CPU 数量越多、主频越高,服务器性能也就相对越好。但事实也并非完全如此,目前大部分 CPU 在同一时间内只能运行一个线程,超线程的处理器可以在同一时间运行多个线程,因而可以利用处理器的超线程特性提髙系统性能。
? 内存的大小也是影响 Linux 性能的一个重要的因素。内存太小,系统进程将被阻塞,应用也将变得缓慢,甚至失去响应;内存太大,会导致资源浪费。
? 磁盘的 I/O 能力会直接影响应用程序的性能。比如说,在一个需要频繁读写的应用中,如果磁盘 I/O 性能得不到满足,就会导致应用的停滞。
? Linux 下的各种应用,一般都是基于网络的,因此网络带宽也是影响性能的一个重要因素,低速的、不稳定的网络将导致网络应用程序的访问阻塞;而稳定、高速的带宽,可以保证应用程序在网络上畅通无阻地运行。
? 软件因素重多,比如说:操作系统的进程调度算法、程序自身的算法以及所使用的数据结构、应用程序的链接方式等等都会对程序的运行效率造成影响。
? 本文总结了Linux操作系统的概念模型,并针对此概念模型的正确性、自洽性做了例子的分析。
? 通过一学期的学习,使我初步了解了Linux系统,激发了我对Linux系统学习的兴趣。今后会更加深入了解Linux系统。
原文:https://www.cnblogs.com/mazijie666/p/14772082.html