操作系统(一) - 操作系统简介

如需了解进程相关的详细概念,可以移步到我的另一个博客。
操作系统之进程管理
在这里插入图片描述

1. 操作系统的概述

1.1 概念

  • 负责协调硬件软件等计算机资源的工作

  • 为上层用户,应用程序提供简单易用的服务

  • 是一种系统软件

1.2 功能和目标

1.2.1 资源的管理者

  • 处理机管理

    • 进程调度:决定哪个进程在何时运行,以优化处理器的利用率和系统的性能。
    • 处理器分配:在多个进程或线程个之间分配处理器时间,确保公平性和效率。
    • 多处理器管理:在多处理器系统中协调各个处理器的工作,优化整体性能。
    • 中断处理:管理处理器在处理中断时的行为,确保系统能快速响应外部事件。
    • 进程个线程的同步与通信:协调进程或线程之间的合作,确保贡献资源的安全使用。
    • 负载均衡:在多处理器系统中,将工作负载均匀分布到各个处理器上,避免处理器过载。
  • 存储器管理

    • 内存分配:为进程和系统组件分配内存空间
    • 内存回收:回收不再使用的内存空间。
    • 内存保护:防止进程非法访问其他进程的内存空间,确保系统稳定和安全。
    • 虚拟内存管理:通过进程地址空间扩展到硬盘,提供比实际物理内存更大的地址空间。
    • 内存分配策略:通过不同的策略给进程分配内存块。
      • 首次适应:从头开始寻找第一个足够大的内存空闲块进行分配。
      • 最佳适应:寻找所有空闲块中最适合的最小空闲块进行分配。
      • 最坏适应:寻找所有空闲块中最大的空闲块进行分配
    • 内存碎片管理:通过紧凑或内存重新分配减少碎片
    • 内存共享和通信:不同的进程可以共享一块内存空间,从而实现高效的数据交换与通信。
    • 内存映射:将文件内容直接映射到内存,从而实现高效的数据交换。将I/O设备的寄存器映射到内存,使对设备的访问像对内存的访问一样简单。
    • 缓冲区管理:通过缓存来提高数据访问的速度,包括页缓存和磁盘缓存等。预分配一组缓存区,用于频繁地内存分配和释放操作,以减少内存碎片。
  • 文件管理

    • 文件系统结构:用于组织和管理文件的结构,目录可以包含文件和子目录,形成层次树状结构。
    • 文件操作:创建、删除、打开、关闭、读取、写入、重命名、复制、移动文件或目录
    • 文件存储管理:分配策略(管理文件存储的分配,包括连续分配,链式分配)。空闲空间管理(跟踪和管理未使用的磁盘空间)。
    • 文件系统类型:FAT、NTFS、EXT、HFS、APFS。
    • 文件属性:文件名、类型、大小、创建时间、修改时间。
    • 文件权限:控制用户和进程对文件的访问权限,如读、写、执行权限。常见权限模型包括Unix的rwx权限模型。
    • 文件系统接口:提供一组接口供用户和应用程序访问文件系统。
    • 文件系统一致性和恢复:保证文件系统在异常情况下仍然保持一致性。提供文件备份金和恢复功能,防止数据丢失。
    • 文件系统性能优化:使用缓存、预取、碎片整理等策略优化文件的读取速度。
    • 分布式文件系统:允许通过网络访问远程文件系统。在多个服务器之间分布文件存储,提高可靠性和性能。
  • 设备管理

    • 设备分类:字符设备、块设备、网络设备。
    • 设备驱动程序:是操作系统与硬件设备之间的接口,负责具体的设备控制和数据传输。
    • 设备接口:提供给用户程序和系统服务程序访问硬件设备的标准接口。
    • 设备分配与调度:根据设备类型和请求方式,分配设别资源给不同的进程。管理设备访问请求的顺序,提高设备利用率和系统性能。
    • 缓冲区管理:使用内存缓冲区临时存储数据,以提高设备I/O操作的效率。
    • 设备保护:防止非法访问设备,去报设备操作的安全性。
    • 设备故障处理:处理设备故障,确保系统稳定运行。
    • 即插即用:自动检测和配置新插入的设备无需手动干预。

1.2.2 为上层提供服务

  1. GUI用户图形界面
  • 例如windows11、macos
  1. 联机命令接口(CLI, Command-Line Interface)

​ 联机命令接口(CLI, Command-Line Interface)是操作系统与用户之间的一种交互方式。用户通过在命令行输入文本命令,操作系统解析并执行这些命令。CLI是早期计算机系统中常用的接口类型,尽管图形用户界面(GUI)已经广泛应用,但CLI仍在许多情况下被广泛使用,尤其是在服务器管理、开发环境、脚本编程等领域。CLI的主要内容和功能包括:

  • 命令解释器:是CLI的核心组件,用于解析用户输入的命令,并调用相应的程序或者系统功能。linux常见的命令解释器有:sh、bash、csh、zsh、fish等。windows常见的命令解释器有:cmd.exe,PowerShell。

  • 基本命令操作:

    • 文件和目录操作(ls、cd、mkdir、rmdir、cp、mv、rm)
    • 查看和编辑文件
      • cat(unix):显示文件内容。
      • more(unix):分页显示文件内容。
      • nano/vi/vim(unix):文本编辑器。
      • type(windows):显示文件内容。
      • notepad(windows):启动记事本编辑文件。
    • 系统信息和管理
      • ps(unix)/tasklist(windows):显示进程信息。
      • top(unix)/htop(windows):动态显示系统资源使用情况。
      • df(unix)/chkdsk(windows):显示磁盘使用情况。
      • free(unix):显式内存使用情况。
      • uname(unix)/systeminfo(windows):显示系统信息。
    • 网络操作
      • ping:测试网络连接。
      • ifconfig(unix)/ipconfig(windows):显示网络接口信息。
      • netstat:显示网络连接和端口使用情况。
      • ssh(unix):通过SSH协议连接远程主机。
      • ftp:文件传输协议客户端。
  • 脚本编写:脚本是由一系列命令组成的文本文件,可以自动化执行多步操作。

    • shell脚本(unix):使用sh、bash、zsh等编写。
    • 批处理脚本(windows):使用.bat或者.cmd文件编写。
    • PowerShell(windows):使用.ps1文件编写。
  • 环境变量:环境变量是操作系统用来存储影响命令行或者程序运行的动态值。

    • PATH:指定可执行文件的搜索路径。
    • HOME(Unix)/USERPROFILE(windows):用户主目录路径。
    • SHELL(Unix):当前使用的命令解释器。
    • TEMP/TMP:临时文件存储路径。
  • 管道:将一个命令的输出直接作为另一个命令的输入。

    • 使用|符号

      • ps aux|grep java ,查看java进程。

      • ls | grep txt ,查看名称包含txt的文件和目录

  • 重定向:将一个命令的输入作为另一个命令的输入

    • 输入重定向:使用>覆盖,或使用>>追加,如ls > filelist.txt,将当前目录下的文件以及文件夹输入到filelist.txt。
  • 命令历史和自动补全:

    • 命令历史:记录用户输入过的命令,可以通过上下箭头键浏览历史命令。
    • 自动补全:通过按下tab键自动补全命令或文件名,提高效率。
  • 权限管理:

    • 切换用户
      • su(unix):切换用户
      • sudo(unix):以其他用户(通常是root)权限执行命令。
      • runas(windows):以其他用户权限运行程序。
    • 权限修改
      • chmod(unix):修改文件权限
      • chown(unix):修改文件所有者
      • Icacls(windows):修改文件和目录的访问控制列表。
  1. 脱机命令接口(Offline Command Interface)

​ 指的是不依赖实时用户交互的命令处理方式,通常用于批处理任务、自动化脚本和后台作业。脱机命令接口与联机命令接口的主要区别在于,脱机命令接口不需要用户实时输入和响应,适用于计划任务、定时任务和无人值守的系统操作。脱机命令接口的主要内容和功能包括:

  • 批处理脚本:批处理脚本是包含一系列预定义命令的文本文件,这些命令将在特定时刻按顺序执行。
    • Windows批处理文件:使用 .bat.cmd 扩展名。
    • Unix/Linux Shell脚本:使用 .sh 扩展名,包含一系列 Shell 命令。
  • 计划任务:计划任务是预先定义的任务,系统会在设定的时间自动执行这些任务。
    • Windows计划任务:
      • Task Scheduler:通过图形界面或命令行工具 schtasks 创建和管理计划任务。
    • Unix/Linux计划任务:
      • cron:通过编辑 crontab 文件定义定时任务。
      • at:用于一次性任务调度。
  • 守护进程和服务:守护进程(Unix/Linux)或服务(Windows)是在后台运行的进程,通常在系统启动时启动,并在后台运行,不需要用户干预。
    • systemd:现代Linux发行版中广泛使用的系统和服务管理器。
    • service 和 init.d:传统的Unix/Linux服务管理工具。
    • Windows Services:通过 services.msc 图形界面或命令行工具 sc 管理。
  • 作业控制:作业控制是管理和调度多个作业(任务)在后台或前台执行的功能。
    • Unix/Linux作业控制:
      • &:在命令后添加 & 符号将命令放入后台运行。
      • bg 和 fg:将暂停的作业在后台或前台继续运行。
      • jobs:显示当前的作业列表。
    • Windows作业控制:
      • start /b:在后台启动一个新的命令窗口运行任务。
  • 任务自动化工具
    • 脚本语言:用于编写复杂的自动化任务脚本。
      • Python:广泛使用的高级编程语言,适合编写自动化脚本。
      • Perl:强大的文本处理和系统管理语言。
      • PowerShell:适用于Windows系统的任务自动化和配置管理框架。
    • 自动化框架
      • Ansible:开源IT自动化工具,使用YAML编写自动化剧本。
      • Puppet:自动化配置管理工具,用于管理基础设施和应用程序的配置。
      • Chef:自动化平台,使用Ruby编写自动化脚本。
  • 日志和报告:记录任务执行的日志信息,用于监控和调试。
    • syslog(Unix/Linux):系统日志记录工具,集中管理日志信息。
    • Event Viewer(Windows):查看系统和应用程序事件日志。
    • 日志文件:自定义日志文件,记录脚本执行的详细信息。
  • 错误处理和恢复:处理脚本执行中的错误,并进行相应的恢复操作。
  • 数据传输和同步:在不同系统之间传输和同步数据,常用于备份和分发。
    • 工具和协议:
      • rsync(Unix/Linux):高效的数据同步工具。
      • scp:安全的文件传输工具,基于SSH协议。
      • FTP/SFTP:文件传输协议及其安全版本。
      • Rclone:用于同步和管理云存储的命令行工具。
  1. 程序接口(即系统调用

    操作系统程序接口(API, Application Programming Interface)是操作系统提供给应用程序和其他软件组件的接口,使它们能够与操作系统进行交互,执行各种系统功能。操作系统API通常包括一系列系统调用(system calls)和库函数(library functions),这些API是应用程序访问操作系统服务的桥梁。以下是操作系统API的主要内容和功能:

    系统调用(System Calls):

    • 定义:系统调用是操作系统内核提供的一组函数,用于完成特定的系统级操作,如文件操作、进程管理、内存管理等。
    • 分类
      • 进程控制:创建和终止进程,设置进程属性,如 fork()exec()exit()wait() 等。
      • 文件操作:打开、关闭、读写文件,获取和设置文件属性,如 open()read()write()close()stat() 等。
      • 设备管理:访问和控制设备,如 ioctl()read()write() 等。
      • 信息维护:获取和设置系统信息,如 getpid()gettimeofday()settimeofday() 等。
      • 通信:进程间通信(IPC),如 pipe()shmget()mmap()msgsnd()msgrcv() 等。

    库函数(Library Functions):

    • 定义:库函数是操作系统提供的一组高层次的函数,封装了系统调用,简化了应用程序开发。
    • 常见库
      • C标准库(libc):提供文件I/O、字符串处理、内存管理等常用功能。
      • POSIX库:提供兼容POSIX标准的函数,如线程管理、信号处理等。
      • 系统特定库:如Windows的WinAPI,提供GUI、网络、进程管理等功能。

    文件系统API:

    • 文件操作
      • 打开和关闭文件:open()close()
      • 读写文件:read()write()
      • 定位文件指针:lseek()
    • 目录操作
      • 创建和删除目录:mkdir()rmdir()
      • 读取目录内容:opendir()readdir()closedir()
    • 文件属性
      • 获取和设置文件属性:stat()chmod()chown()

    进程管理API:

    • 进程创建和终止:fork()exec()exit()
    • 进程同步和通信:wait()signal()pipe()
    • 进程属性
      • 获取进程ID:getpid()getppid()
      • 设置进程优先级:nice()

    内存管理API:

    • 动态内存分配:malloc()free()calloc()realloc()
    • 内存映射:mmap()munmap()
    • 共享内存:shmget()shmat()shmdt()

    设备管理API:

    • 设备控制:ioctl()
    • 读写设备:read()write()

    网络通信API:

    • 套接字接口
      • 创建套接字:socket()
      • 连接和监听:connect()bind()listen()
      • 数据传输:send()recv()sendto()recvfrom()
      • 关闭套接字:close()

    线程管理API:

    • 线程创建和终止:pthread_create()pthread_exit()
    • 线程同步:pthread_join()pthread_mutex_lock()pthread_mutex_unlock()
    • 线程属性
      • 设置线程属性:pthread_attr_init()pthread_attr_setdetachstate()

    安全和权限管理API:

    • 用户和组管理:getuid()getgid()setuid()setgid()
    • 文件权限管理:chmod()chown()

    信号处理API:

    • 发送和接收信号:kill()raise()
    • 信号处理函数:signal()sigaction()

对硬件机器的扩展

​ 操作系统通过一系列的抽象和管理机制,对硬件机器进行扩展,使得硬件资源能够被更高效和更方便地使用。这种扩展不仅提高了硬件的利用率,还增加了系统的灵活性和稳定性。以下是操作系统扩充机器的主要方法:

  1. 虚拟内存:
    • 定义:虚拟内存通过将物理内存与磁盘存储结合,使系统能够运行超出实际物理内存容量的程序。
    • 方法
      • 分页(Paging):将内存分成固定大小的页,并将部分页存储在磁盘上。
      • 分段(Segmentation):将内存分成不同大小的段,每个段对应程序的逻辑部分,如代码段、数据段等。
  2. 虚拟化:
    • 定义:虚拟化技术允许在一台物理机器上运行多个虚拟机,每个虚拟机都运行一个独立的操作系统。
    • 方法
      • 硬件虚拟化:通过硬件支持(如Intel VT-x, AMD-V)实现高效的虚拟机管理。
      • 全虚拟化(Full Virtualization):虚拟机完全模拟底层硬件,操作系统无需修改。
      • 半虚拟化(Paravirtualization):虚拟机与底层硬件共享部分资源,需要对操作系统进行修改。
  3. 多任务处理:
    • 定义:多任务处理使多个任务可以同时运行,提高系统资源利用率。
    • 方法
      • 时间片轮转(Round-Robin Scheduling):将CPU时间片分配给各个任务,按顺序执行。
      • 优先级调度(Priority Scheduling):根据任务优先级分配CPU时间片,高优先级任务优先执行。
  4. 多处理器支持:
    • 定义:多处理器支持使得操作系统可以在多核或多处理器系统上运行,利用多个处理器并行执行任务。
    • 方法
      • 对称多处理(SMP, Symmetric Multiprocessing):所有处理器共享内存和I/O设备,操作系统对所有处理器进行统一管理。
      • 非对称多处理(AMP, Asymmetric Multiprocessing):不同处理器分配不同任务,一个主处理器负责调度和管理。
  5. 文件系统:
    • 定义:文件系统通过组织和管理存储设备上的文件和目录,使用户能够方便地存储和访问数据。
    • 方法:
      • 层次结构:将文件和目录组织成层次结构,提供逻辑上的数据组织。
      • 分区和卷管理:通过分区和卷管理,扩展存储容量和灵活性。
      • 日志文件系统(Journaling File System):通过日志记录文件系统操作,增强数据的可靠性和恢复能力。
  6. 网络文件系统:
    • 定义:网络文件系统使得文件存储在远程服务器上,并通过网络访问这些文件。
    • 方法:
      • NFS(Network File System):一种分布式文件系统协议,允许客户端通过网络访问远程服务器上的文件。
      • SMB/CIFS(Server Message Block/Common Internet File System):用于共享文件、打印机和串行端口的网络协议。
  7. 内存管理:
    • 定义:内存管理通过分配和回收内存,提高内存利用率和系统性能。
    • 方法:
      • 动态内存分配:使用堆和栈进行内存分配和回收,如 malloc()free()
      • 垃圾回收(Garbage Collection):自动回收不再使用的内存,防止内存泄漏。
  8. I/O管理:
    • 定义:I/O管理通过优化I/O操作,提高设备的使用效率和系统性能。
    • 方法:
      • 缓冲区管理:通过使用缓冲区临时存储数据,减少I/O操作的次数,提高效率。
      • I/O调度:优化I/O请求处理顺序,如电梯算法(Elevator Algorithm),减少磁盘寻道时间。
  9. 安全和权限管理:
    • 定义:安全和权限管理通过控制对系统资源的访问,保护系统和数据的安全。
    • 方法:
      • 用户认证:验证用户身份,控制系统访问。
      • 访问控制:通过权限和访问控制列表(ACL)管理文件和资源的访问权限。
      • 数据加密:通过加密技术保护数据的机密性和完整性。
  10. 分布式系统:
    • 定义:分布式系统通过将任务分配到多个计算机节点上,提高系统的扩展性和容错能力。
    • 方法:
      • 分布式计算:将计算任务分解并分配到多个节点并行处理,如MapReduce。
      • 分布式存储:将数据分散存储在多个节点上,提高数据的可用性和访问速度,如HDFS(Hadoop Distributed File System)。
      • 分布式数据库:通过分布式数据库技术,实现跨多个节点的数据管理和查询,如Cassandra, MongoDB。

2. 操作系统的特征

并发和共享互为存在条件,没有并发和共享,就谈不上虚拟和异步,因此并发和共享是操作系统的两个最基本的特征。

2.1 并发和并行

2.1.1 并发(Concurrency)

并发指的是在同一时间段内处理多个任务。这并不一定意味着这些任务是同时执行的,而是通过任务切换,使多个任务在看起来像是同时进行。

  • 多线程编程:在一个进程内创建多个线程,每个线程执行不同的任务。通过上下文切换,操作系统让多个线程看起来像是同时运行。
  • 异步编程:使用异步函数和事件循环,在等待 I/O 操作完成的同时执行其他任务,以提高效率和响应性。

2.1.2 并行(Parallelism)

并行是指在同一时刻实际执行多个任务。这通常需要多处理器或多核心系统,以真正实现任务的同时执行。

  • 多进程编程:在多处理器系统中,多个进程可以在不同的处理器上同时运行,每个进程独立执行。
  • 并行计算:任务被分解为多个子任务,这些子任务可以在多个处理器上同时执行,从而加速计算过程。

2.1.3 区别与联系

  • 资源使用:并发主要通过时间切片(time slicing)来模拟同时执行,而并行则真正需要多处理器或多核心。
  • 编程模型:并发编程更关注任务间的协调与通信,避免资源竞争和死锁。而并行编程更多关注任务的分解与同步,确保计算任务能够高效地分布在多个处理器上。
  • 应用场景:并发常用于需要处理大量 I/O 操作的系统,如服务器和用户界面应用程序。并行则常用于计算密集型任务,如科学计算和数据处理。

2.2 共享

2.2.1 互斥共享方式

​ 指在多线程或多进程环境中,多个线程或进程在同一时间内不能同时访问共享资源,以避免数据不一致或竞争条件(race conditions)。互斥(Mutual Exclusion,简称Mutex)机制保证了在任何时刻,只有一个线程或进程可以访问共享资源。

  1. 互斥锁(Mutex Lock)
    • 互斥锁是一种同步原语,用于保护共享资源。在访问共享资源之前,线程或进程必须首先获得互斥锁;完成访问后,它们必须释放锁。
    • 互斥锁确保同一时间只有一个线程或进程可以进入临界区(访问共享资源的代码区域)。
  2. 临界区(Critical Section)
    • 临界区是访问共享资源的代码段。为了防止数据冲突,临界区内的代码在同一时间只能被一个线程或进程执行。
  3. 锁的获取和释放
    • 线程或进程在进入临界区之前需要获得互斥锁,如果锁已被其他线程或进程持有,它必须等待。
    • 在离开临界区时,必须释放互斥锁,以便其他等待的线程或进程可以获取锁并进入临界区。

2.2.2 同时共享方式

​ 通常指多个线程或进程可以同时访问和操作共享资源,而不必相互排斥。这种方式通常需要依赖特定的技术和设计模式来确保数据的一致性和系统的稳定性。

  1. 读写锁(Read-Write Lock)

    读写锁允许多个线程同时读取共享资源,但在写操作时,只有一个线程可以访问资源,并且此时不允许其他读线程访问。

  2. 乐观并发控制(Optimistic Concurrency Control)

    乐观并发控制假设资源争用很少发生,因此线程或进程在访问资源时不加锁,而是在写入时检查数据是否被修改过。如果发生冲突,则重试操作。

  3. 无锁编程(Lock-Free Programming)

    无锁编程通过使用原子操作(如Compare-And-Swap, CAS)来确保共享数据的安全访问,避免使用锁,从而减少锁的开销和潜在的死锁问题。

  4. 软件事务内存(Software Transactional Memory, STM)

    STM 允许线程或进程以事务的方式访问共享资源。事务在执行时会记录对共享资源的所有读写操作,只有当事务成功完成时才会应用更改,否则会回滚。

2.3 虚拟化

2.3.1 空分复用

严格来说是类似空分复用

  1. 内存虚拟化

    内存虚拟化使得每个进程拥有独立的虚拟地址空间,从而实现内存的高效利用和隔离。

    分页(Paging)

    • 实现方式:将物理内存分成固定大小的块(页框),将虚拟地址空间分成相同大小的块(页)。通过页表将虚拟页映射到物理页框。
    • 优点:实现内存的非连续分配,提高内存利用率,简化内存管理。

    分段(Segmentation)

    • 实现方式:将内存分成不同大小的段,每个段表示一个逻辑单元(如代码段、数据段),通过分段表管理段的映射。
    • 优点:支持逻辑单元的独立管理和保护,便于实现共享和保护机制。
  2. 文件系统虚拟化

    文件系统虚拟化通过抽象文件和目录,提供统一的接口,隐藏底层物理存储的复杂性。

    虚拟文件系统(VFS)

    • 实现方式:VFS是一个抽象层,支持不同类型的文件系统(如ext4、NTFS、FAT),提供统一的文件操作接口。
    • 优点:实现文件系统的透明访问,支持多种文件系统并存。
  3. 存储虚拟化

    存储虚拟化通过抽象物理存储设备,实现存储资源的聚合和灵活管理。

    逻辑卷管理(LVM)

    • 实现方式:LVM将多个物理存储设备抽象为一个或多个逻辑卷,支持动态调整卷的大小和迁移数据。
    • 优点:提高存储利用率,简化存储管理,实现动态扩展和迁移。
  4. 网络虚拟化

    网络虚拟化通过抽象网络资源,实现网络设备和连接的逻辑分隔,支持多租户环境和灵活的网络配置。

    虚拟局域网(VLAN)

    • 实现方式:VLAN将物理网络划分为多个逻辑子网,实现不同子网之间的隔离和独立管理。
    • 优点:提高网络安全性和灵活性,支持多租户环境。

    虚拟专用网络(VPN)

    • 实现方式:VPN通过加密隧道在公共网络上建立安全的专用连接,支持远程访问和数据传输。
    • 优点:提高数据传输的安全性和隐私性,支持远程办公和访问。
  5. 容器化和虚拟机

    容器和虚拟机技术通过创建隔离的执行环境,实现计算资源的高效复用。

    虚拟机(Virtual Machine)

    • 实现方式:虚拟机通过虚拟化技术,将物理服务器划分为多个独立的虚拟机,每个虚拟机运行一个完整的操作系统和应用程序。
    • 优点:实现资源隔离,提高资源利用率,支持多操作系统并存。

    容器(Container)

    • 实现方式:容器通过操作系统级虚拟化,在同一个操作系统内核上运行多个隔离的应用实例,支持快速部署和高效资源利用。
    • 优点:轻量级,高效的资源利用,支持微服务架构。

2.3.2 时空复用

​ 操作系统中的时分复用技术是指通过时间分片的方式,将处理器时间划分成若干小的时间片,依次分配给多个进程或线程,从而实现多任务并发执行。时分复用技术是现代操作系统的核心特性之一,使得多个应用程序可以在一个处理器上“同时”运行,提高了系统的响应速度和资源利用率。

  1. 时间片轮转调度(Round Robin Scheduling)

    时间片轮转调度是时分复用的基本实现方式之一。每个进程在其时间片内独占CPU,时间片结束后,操作系统将CPU分配给下一个进程。

    实现方式:将所有准备好的进程按顺序排成一个队列,操作系统将CPU分配给队列前端的进程,进程用完时间片后,移到队列末尾,轮到下一个进程。

  2. 优先级调度(Priority Scheduling)

    优先级调度是另一种时分复用技术,根据进程的优先级分配CPU时间。优先级高的进程先获得CPU时间。

    实现方式:为每个进程分配一个优先级,操作系统根据优先级调度进程运行。若有多个进程具有相同优先级,则按时间片轮转方式调度。

  3. 多级反馈队列调度(Multilevel Feedback Queue Scheduling)

    多级反馈队列调度是较为复杂的一种时分复用技术,结合了时间片轮转和优先级调度的特点。

    实现方式:操作系统维护多个队列,每个队列有不同的优先级和时间片长度。新进程首先进入高优先级短时间片的队列,若未完成则逐渐降级到低优先级长时间片的队列。

  4. 多处理器调度(Multiprocessor Scheduling)

    多处理器调度是指在多核处理器系统中,通过时分复用和负载均衡技术,将任务分配到多个处理器上运行。

    实现方式:操作系统维护一个全局任务队列或每个处理器一个本地任务队列,通过负载均衡算法将任务分配给处理器。

2.4 异步

​ 操作系统中的异步(Asynchronous)机制允许系统在等待某些事件(如I/O操作)时,不阻塞进程的执行,从而提高系统效率和响应速度。异步机制在操作系统中应用广泛,特别是在I/O操作、进程间通信、事件处理等方面。

3. 操作系统的体系结构

在这里插入图片描述

3.1 架构方式

3.1.1 分层结构

内核分为多层,每层可以单向调用更第一层的接口。

3.2.2 模块化

将内核划分为多个模块,各模块之问相互协作。

3.2 大内核

包含操作系统的所有基本功能,包括进程管理、内存管理、文件管理、设备驱动、网络对栈等,都是作为内核的一部分在内核态运行。
在这里插入图片描述

优点

  1. 性能高:由于所有内核服务都在内核态运行,减少了上下文切换和用户态与内核态之间的通信开销,因此大内核通常具有较高的性能。
  2. 开发效率高:所有内核模块运行在同一个地址空间,使得开发和调试变得更容易。
  3. 模块之间的高效通信:内核模块之间可以直接调用函数,通信开销较低。

缺点

  1. 稳定性和安全性差:内核模块之间的紧密集成意味着一个模块的错误可能会导致整个系统崩溃,这降低了系统的稳定性和安全性。
  2. 扩展性差:大内核由于其高度集成性,增加新功能或修改现有功能相对困难。
  3. 代码复杂度高:内核代码通常非常庞大且复杂,维护难度较大。

3.3 微内核

核心理念是将操作系统基本功能最小化,只保留最基本和最必要的部分在内核态运行,至于内核态包含哪些功能我看都有不同的说法,下图仅供参考,我们了解其中的设计思想就行。用户态会运行文件系统、设备驱动、网络协议栈等。并通过消息和内核进行交互通信。

优点

  1. 稳定性和安全性:由于大部分服务运行在用户态,即使某个服务崩溃也不会导致整个系统崩溃,从而提高了系统的稳定性和安全性。
  2. 扩展性好:新功能可以作为独立的用户态服务器模块添加,不需要修改内核,这使得系统更容易扩展和维护。
  3. 简化的内核:内核代码少且简单,减少了bug的可能性,便于调试和维护。

缺点

  1. 性能开销:由于大量的系统服务在用户态运行,并且内核和用户态服务器之间需要频繁的消息传递,可能会导致性能开销,特别是在处理大量I/O操作时。
  2. 复杂的设计和实现:微内核的消息传递机制和用户态服务的管理需要精心设计和实现,增加了系统开发的复杂度。
    在这里插入图片描述

4. 操作系统的运行机制

4.1 程序的运行原理

在这里插入图片描述

4.2 内核态和用户态

内核态和用户态是操作系统中两个重要的运行模式,主要用于区分操作系统和用户应用程序的权限和作用。

  • 内核态

    • 权限高:操作系统具有最高权限,可以直接访问CPU,内存,磁盘等硬件资源,也可以访问系统中所有的数据结构。
    • 操作系统核心运行:操作系统的核心组件(内存管理、进程调度、文件系统等)都在内核态运行。
    • 特权指令:只有在内核态下才能执行特权指令,用于硬件资源调用、管理,和执行系统关键的任务。
    • 稳定性:内核态的代码应该是最稳定的,如果发生错误就会造成无法预料的灾难。
  • 用户态

    用户态(User Mode)是计算机操作系统中运行应用程序的执行模式。它是与内核态(Kernel Mode)相对的一种操作模式。在用户态下,程序运行在受限的环境中,不能直接访问硬件资源和内核数据结构,必须通过系统调用接口与操作系统内核交互,以获取所需的资源和服务。

4.3 如何变态

变态是指操作系统在不同的的环境下模式和状态的改变。在保证操作系统的安全性、稳定性、高效性前提下,合理管理系统任务和分配系统资源。

  • 用户态到内核态的转变

    • 系统调用:系统应用需要执行特权操作的时候,会通过系统调用接口请求内核服务。系统调用通过陷入指令(trap)将控制权交给内核。比如:内存分配,文件操作。
    • 软中断:软件生成的中断信号也可以实现状态的转变。如某些设备驱动程序需要响应特定的信号。
  • 内核态到用户态的转变:内核程序完成特定操作后需要将控制权返回给用户程序。

    • 系统调用返回:完成系统调用后,内核会将结果返回给应用程序,并转换成用户态。
    • 中断返回:内核处理完硬件中断后,会恢复被中断的用户态程序继续执行。
  • 进程切换:操作系统在多任务环境下,通过进程切换来实现多进程并发执行。其中会涉及到内存资源,CPU资源使用权的切换。

    • 保存上下文:保存当前进程的CPU寄存器状态、程序计数器等信息到进程控制块(PCB)。
    • 加载上下文:从要执行的进程的PCB中恢复CPU寄存器状态,程序计数器的状态等。
    • 切换内存空间:更新内存管理单元(MMU)以映射新的内存空间。
  • 线程切换:线程是进程的执行单元,一个进程其中的线程的内存空间是共享的,所以进程中的线程切换的时候是不涉及内存空间的切换的,但是会涉及到CPU资源的切换。

    • 保存和恢复寄存器的状态:保存当前线程的寄存器状态,加载要执行的线程的寄存器状态。
    • 调度:操作系统调度器来决定哪一个线程获得CPU执行权。
  • 中断处理:操作系统必须能够快速响应硬件和应用程序的中断请求,以保证操作系统的实时性和响应性

    • 中断请求:当硬件需要操作系统服务时,会发出中断信号。
    • 中断向量:操作系统根据中断向量表找到对应的中断服务例程(ISR)。
    • ISR执行:ISR处理完中断后,可能需要进行进程或线程的调度切换。

4.4 内核程序和应用程序

  • 内核是操作系统的核心部分,负责管理系统资源并提供基础服务。内核位于硬件和应用程序之间,作为中介来协调他们之间的交互,内核的主要功能包括:
    • 进程管理:创建、调度和终止进程,负责多任务处理。
    • 内存管理:分配和释放内存,管理虚拟内存
    • 文件系统管理:管理文件和目录的存储和访问。
    • 设备管理:控制和协调硬件设备的操作。
    • 系统调用接口:为应用程序提供与操作系统交互的接口。
  • 应用程序是用户用来执行特定任务的软件。应用程序运行在操作系统之上,利用内核提供的服务来完成工作。应用程序可以是各种各样的,例如:办公软件、娱乐软件、生产力工具、互联网应用。
  • 内核程序和应用程序之间的关系:内核和应用程序之间的关系是非常紧密的。内核为应用程序提供了一个安全和稳定的运行环境,应用程序通过系统调用与内核交互,从而利用操作系统的各种资源。例如,当应用程序需要读写文件时,它会通过系统调用请求内核执行相应的操作。

4.5 特权指令和非特权指令

  • 特权指令:特权指令是只有由操作系统或者特定特权级别的代码执行的,这些指令直接与硬件交互,并且能改变系统的设置。
    • 直接控制硬件资源。
    • 能修改内存管理单元(MMU)中的设置。
    • 能进行I/O操作。
    • 能设置中断处理机制。
    • 只能在操作系统的内核态下运行。
  • 非特权指令:是在用户态下执行的代码,不会对系统的核心功能产生影响。主要用于执行普通的应用程序代码。
    • 无法直接访问硬件资源
    • 只能在用户态下执行
    • 安全,即使有被无用也不会破坏系统的整体稳定性
    • 可以由任何在用户态下的软件执行。

5. 中断和异常

  • 中断的作用

    • 让操作系统内核强行夺回CPU的执行权。
    • 使CPU从用户态变为内核态。
  • 中断的分类

    • 内部中断(也称为异常、例外):由CPU内部发生的事件或者指令引发的中断。
      • 陷阱、陷入(trap):由陷入指令引发,是应用程序故意引发的。
      • 故障(fault):由错误条件引起的,可能被内核程序修复,内核程序修复故障后会把CPU使用权还给应用程序,让他继续执行下去。
      • 终止(abort):由致命错误引起,内核程序无法修复该错误,因此一般不再将CPU使用权还给引发终止的应用程序,而是终止此程序。比如:整数除以0,非法使用特权指令。
    • 外部中断:由外部设备(如键盘,鼠标,网络接口,硬件等)引发的中断,与当前执行的指令无关。比如:时钟中断,I/O设备中断等。
  • 中断机制的基本实现原理

    • 检查中断信号:
      • 内中断,cpu在执行指令时会检查是否有异常发生。
      • 外中断,每个指令周期末尾CPU都会检查外部是否有中断信号需要处理。
    • 找到相应的中断处理程序:通过中断向量表实现。

6. 系统调用

  • 概念:操作系统的应用程序提供的接口。

  • 系统调用和库函数的区别就在于,库函数是对系统调用的进一步封装,有的库函数是没有使用系统调用的。

  • 使用系统调用的场景:

    • 设备管理
    • 文件管理
    • 进程管理
    • 进程通信
    • 内存管理
  • 系统调用的过程:

    1. 传参
    2. 陷入指令(trap)
    3. 由操作系统内核程序处理系统调用请求
    4. 返回应用程序

7. 虚拟机

使用虚拟化技术,将一条物理机器划分为多台虚拟机器,每台虚拟机都可以独立运行一个操作系统。

7.1 两类虚拟机管理程序

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

7.2 两类虚拟机管理程序的对比

在这里插入图片描述

  • 12
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值