目录 概述 用户态和内核态 用户态(User Mode) : 用户态的进程拥有较低的权限,可以读取用户程序的数据。 内核态(Kernel Mode):内核态的进程拥有更高的权限,几乎可以访问计算机的任何资源(包括内存、设备、驱动程序等),能够执行更底层、更敏感的操作。当应用程序需要执行某些需要特殊权限的操作(如读写磁盘、网络通信等),就需要向操作系统发起系统调用请求,进入内核态。进入内核态的开销较高(上下文切换和权限检查),因此应尽量减少进入内核态的次数,以提高系统性能。 如果只有内核态会怎么样? 恶意程序可能会覆盖操作系统的关键代码或数据,或终止其他进程,导致系统崩溃。 所有进程都可以无限占用内存、CPU、磁盘等资源,导致资源枯竭。 用户态切换到内核态的 3 种方式 系统调用:用户态进程主动要求切换到内核态。 中断:当外围设备完成用户请求的操作后(如硬盘读写操作完成),会向 CPU 发送中断信号,CPU 立即保存当前执行上下文并转入内核态执行中断处理程序。如果中断发生时 CPU 运行的是用户态代码,则会发生用户态到内核态的切换。 异常:当 CPU 在执行用户态进程时发生异常(如缺页异常、除零错误),会触发 CPU 进入内核态,执行相应的异常处理程序,以恢复或终止进程。 系统调用 程序基本都是运行在用户态,当我们要调用操作系统提供的内核态级别的子功能(设备管理、文件管理、进程控制、内存管理等)时,就需要系统调用,由操作系统代为完成。 系统调用的过程 用户态程序通过 glibc(与系统调用一一对应的函数库)调用 syscall ,触发 Trap 进入内核态。 CPU 保存用户态上下文,并根据系统调用号查找相应的系统调用处理函数。 内核执行完系统调用后,使用 sysret 等恢复用户态上下文,CPU 切换回用户态。 中断 为了避免中断处理程序执行时间过长,Linux 将中断处理程序分为上半部和下半部: 上半部:硬中断,由硬件触发,用来快速处理中断。 下半部:软中断,由内核触发,用来异步处理上半部未完成的工作,通常都是耗时比较长的事情,特点是延迟执行。 进程和线程 进程(Process) 指正在运行的一个程序实例。举例:你打开的微信就是一个进程。 线程(Thread) 也称轻量级进程。多个线程可以在同一个进程中同时执行,并且共享进程的资源(如内存空间、文件句柄、网络连接等)。举例:你打开的微信里就有一个线程专门用来拉取别人发你的最新的消息。 进程和线程的区别 线程是进程划分成的更小的运行单位,一个进程在其执行的过程中可以产生多个线程。 进程拥有一个完整的资源平台,而线程只独享必不可少的资源,如寄存器和栈。 各进程是独立的,而各线程则不一定,因为同一进程中的线程极有可能会相互影响。 线程执行开销小,但不利于资源的管理和保护;而进程正相反。 有了进程为什么还需要线程? 线程切换和调度的成本远低于进程(共享虚拟内存无需切换页表)。 多个线程可以并发处理不同的任务,更有效地利用了多核计算机资源。而进程只能在一个时间干一件事,如果在执行过程中阻塞,就会挂起直到结果返回。 同一进程内的线程共享内存和文件,相互通信无须调用内核。 进程状态 创建状态:进程正在被创建,尚未到就绪状态。 就绪状态:进程已处于准备运行状态,即进程获得了除了处理器之外的一切所需资源,一旦得到处理器资源(处理器分配的时间片)即可运行。 运行状态:进程正在 CPU 上运行(单核 CPU 任意时刻只有一个进程在运行状态)。 阻塞状态:又称为等待状态,进程正在等待某一事件而暂停运行如等待某资源为可用或等待 IO 操作完成。即使处理器空闲,该进程也不能运行。 结束状态:进程正在从系统中消失。可能是进程正常结束或其他原因中断退出运行。 进程控制块 PCB PCB(Process Control Block)数据结构是进程存在的唯一标识,每个进程都对应着一个独立的 PCB。当进程执行时,PCB 中的信息会不断变化,相同状态进程的 PCB 通过链表链在一起(形成就绪队列、阻塞队列等),操作系统会根据这些信息来管理和调度进程: 进程描述信息,进程名称、进程标识符、用户标识符等 进程调度信息,进程状态、阻塞原因、进程优先级等。 资源需求情况,CPU 时间、内存空间、I/O 设备等。 打开的文件信息,文件描述符、文件类型、打开模式等。 处理机状态信息,通用寄存器、指令计数器、程序状态字 PSW、用户栈指针。 进程间通信方式 管道/匿名管道(Pipes) :用于具有亲缘关系的父子进程间或者兄弟进程间的通信,只存在于内存中。 有名管道(Named Pipes) : 可以实现本机上任意两个进程间通信。有名管道遵循 FIFO,以磁盘文件的方式存在。 消息队列(Message Queuing) :无需等待消息被读出再返回;并且每个消息体都是固定大小的存储块,发送方和接收方能够约定好其数据类型;此外