Linux内核学习---操作系统基础概念

Linux内核学习—操作系统基础概念

(本节记录一些操作系统的很基本的知识,比较琐碎,之后将详细对每一模块进行学习)

内核

内核是硬件和软件之间的一个中间层,主要作用是将应用程序的请求传给硬件,并充当底层驱动程序,对系统中的各种设备和组件进行寻址。当操作系统启动时,内核被装入到RAM中,内核中包含的是系统运行所必不可缺的核心过程。资源管理程序

内核的两个目标:(软硬件之间的媒介)

  • 与硬件交互,为包含在硬件平台上的所有低层可编程部件提供服务
  • 为运行在计算机系统上的应用程序提供执行环境

内核分为微内核和宏内核

  • 微内核:只将最基本的功能由*内核实现,其他功能都委托给独立的系统进程。

    微内核的优点:动态可扩展性强,可以在运行时切换重要组件,充分利用了RAM(暂时不需要执行的系统进程可以被暂时调出或撤销)

    缺点:各个组件之间通信需要额外的CPU时间

  • 宏内核:将内核所有代码打包在同一个文件中

Linux为了达到微内核的优点但不影响性能,提供了模块的方法。模块可以插入到内核代码,实现一些内核功能,也可以移出,这使得模块的动态装载得以实现。任何模块都可以在运行时被链接或解除链接,可以节省内存使用,且无性能损失。

内核组成部分

Linux内核学习---操作系统基础概念

进程

运行着的应用程序叫做进程,进程是系统进行资源分配和调度的基本单位。每个进程都在CPU的虚拟内存中分配地址空间,各个进程的地址空间是完全独立的,因此进程并不会意识到彼此的存在。

Linux是多任务系统,支持并发执行多个进程。实现这种方式主要采用的是 时分复用,也就是在很短的时间中完成切换,造成了同时处理多进程的假象。为了实现这种机制,需要进程切换:在撤销当前进程前保存所有与状态相关的要素,将该进程置于空闲状态。将需要调用的进程的状态进行**,进行执行。

进程之间的切换需要依赖于进程调度程序。

为了让系统管理进程,每个进程由一个进程描述符表示,这个描述符包含了相关进程当前的信息。

Linux进程采用的是层次系统,也就是进程树的结构,每个进程都依赖于一个父进程。内核启动init程序作为第一个进程,负责系统初始化操作。(在Linux系统中输出 pstree 可以看到进程树的结构)

Unix操作系统有两种创造新进程的机制:fork 和 exec

  • fork创建当前进程的一个副本,父进程和子进程只有PID不同。这里采用的是copy on write机制,核心思想是当一个用户父进程创建自己的子进程时,父进程会把其申请的用户空间设置为只读,子进程可共享父进程占用的用户内存空间中的页面(这就是一个共享的资源)。当其中任何一个进程修改此用户内存空间中的某页面时,操作系统通过page fault异常获知该操作,并完成拷贝内存页面。(将页的复制延迟到最后一刻)
  • exec将一个新程序加载到当前进程的内存中并执行
  • 系统调用 exit 终止一个进程,释放该进程的所有资源并向父进程发送信号实现。
线程

线程是进程的一部分,描述指令流的执行状态,是进程中指令执行流的最小单元,CPU调度的基本单位。一个程序至少一个进程,一个进程至少一个线程。属于一个进程的线程共享相同的数据和资源,但可以执行不同的代码。线程=进程-共享资源。引入线程的主要目的是同一个进程内的线程通信、切换开销较小,故对于实现高性能计算等具有很好的效果。

线程分为用户线程和内核线程,内核线程只运行在内核态,用户线程会在用户态和内核态交替执行。

特权级

类Unix操作系统把计算机物理组织相关的低层细节对用户程序隐藏,当需要使用硬件资源时,向操作系统发出请求,操作系统评估后决定是否可以交互。为了实现这种机制,硬件为CPU引入了至少两种不同的执行模式:用户程序的非特权模式和内核的特权模式,也就是 用户态和内核态
Linux内核学习---操作系统基础概念

用户态禁止访问内核空间,故用户进程不能操作和读取内核空间的数据,也无法执行内核空间的代码。通过这种机制,可以防止进程无意间修改彼此数据造成干扰。

通过系统调用和中断可以实现从用户态到内核态的转换。

Linux内核学习---操作系统基础概念

物理内存和虚拟内存

虚拟存储是一种内存管理技术指的是在非连续内存分配的基础上,将一部分内容放到外存里的做法,从而可以使在内存中保留更多进程并且可以允许进程比主存的全部空间还大。

采用分页机制实现,用页表来为物理地址分配虚拟地址。用页表将虚拟地址映射到物理地址。

Linux采用的是四级页表机制。

三级页表机制:

Linux内核学习---操作系统基础概念

两种方法加速内存访问:

  • CPU中有一个专门的部分MMU(内存管理单元),优化内存访问操作
  • 将地址转换中频繁出现的地址存储到TLB(地址转换后备缓冲器)的CPU高速缓存中,无需访问内存中的页表即可从高速缓存中直接获得地址数据,大大加速了地址转换

Linux的物理内存分配算法:伙伴系统和slab缓存

文件系统

UNIX提出了四个文件系统抽象概念:文件(file)、目录项(dentry)、索引节点(inode)和安装点(mount point)。

通过路径名标识文件,如果路径名第一个字符是斜杠,表示是绝对路径

文件的访问权限:读、写、执行

Linux内核学习---操作系统基础概念

虚拟文件系统:VFS,将低层文件系统的具体特性与应用层隔离开

同步机制

实现同步可以用 临界区、信号量、锁等多种机制。

临界区(critical section):每个进程中访问临界资源的那段程序(临界资源是一次仅允许一个进程使用的共享资源。)每次只准许一个进程进入临界区,进入后不允许其他进程进入。不论是硬件临界资源,还是软件临界资源,多个进程必须互斥地对它进行访问。

信号量:它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目。信号允许多个线程同时使用共享资源,这与操作系统中的P V操作相同。它指出了同时访问共享资源的线程最大数目。它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目。信号量的关键之处在于它们原子地执行。必须确保没有两个进程能够同时对同一信号量执行wait和signal操作

多用户系统

Linux是一个多用户系统,需要包含:

  • 核实用户身份的认证机制
  • 防止错误的用户进程阻碍其他应用进程的执行的保护机制
  • 防止恶意的用户干涉或窥视其他用户活动的保护机制
  • 限制分配给每个用户的资源数的记账机制

所有用户由一个唯一的数字表示–用户标识符。

类Unix系统有一个特殊的用户,叫做root,即超级用户,root用户几乎无所不能,可以访问系统中的所有文件。