os总结

进程和线程的区别

进程

  • 进程是OS的资源分配单位,它包含了程序执行所需要的资源,如内存空间、文件句柄等,是一个程序的运行的实例
  • 进程是独立调度和运行的,每个进程都有自己的PCB,OS通过调度算法决定给每个进程的CPU时间
  • 进程的创建和销毁开销很大,因为需要为进程分配和释放资源,包括内存空间、文件句柄等
  • 进程间的通信(IPC)相对复杂,需要使用特定的机制(管道、消息队列、共享内存等来实现)

线程

  • 线程是CPU的最小调度单位,线程是进程的一部分,共享进程的资源,包括代码段、数据段、打开的文件等,每个线程都有自己的栈空间和寄存器上下文
  • 线程是由进程创建和控制的,线程共享进程的地址空间和其他子啊云,线程的调度更轻量级
  • 创建和销毁的开销小

堆和栈的区别

栈(Stack)

  1. 内存分配方式
    • 栈内存是连续分配的。
    • 每个函数调用都会在栈上分配一块内存,函数结束时这块内存会自动释放。
  2. 分配速度
    • 栈内存分配和释放非常快,因为它遵循LIFO(后进先出)的原则。
  3. 存储内容
    • 栈主要存储函数的局部变量、参数和返回地址。
  4. 大小限制
    • 栈的大小是有限的,通常由操作系统或运行时环境设置。如果栈空间用尽,会导致栈溢出(stack overflow)。
  5. 生命周期
    • 栈上分配的变量在函数调用结束后自动释放。

堆(Heap)

  1. 内存分配方式
    • 堆内存是动态分配的,内存块可以在程序运行时任意分配和释放。
  2. 分配速度
    • 堆内存分配比栈内存分配要慢,因为需要复杂的内存管理操作,如垃圾回收(Garbage Collection)。
  3. 存储内容
    • 堆主要用于存储那些需要在多个函数之间共享的数据,或者生命周期不局限于单个函数调用的变量。
  4. 大小限制
    • 堆的大小通常只受系统总内存的限制。
  5. 生命周期
    • 堆上分配的变量由程序员手动控制其生命周期,或者由垃圾回收器自动管理。

在Go语言中,内存的分配方式取决于变量的生命周期和作用域。编译器会决定变量是分配在栈上还是堆上。以下是一些具体情况:

  • 短生命周期的局部变量通常分配在栈上。
  • 跨函数调用的变量或需要在函数返回后仍然存活的变量,通常会被分配在堆上。

内存使用场景

  • :适合存储生命周期短、占用内存小的变量,如函数参数、局部变量。
  • :适合存储生命周期长、占用内存大的数据结构,如动态数组、链表、树等。

常用的CPU调度算法

  • 先来先服务 first-come-first-in
  • 最短作业优先 shortest-job-first
  • 最短剩余时间优先 shortest-remaining-time-first
  • 优先级调度 priority-scheduling
  • 时间片轮转 round-robin–scheduling
  • 多级反馈队列调度 multi-feedback-queue-scheduling

什么是中断

用户态和内核态

用户态和内核态有什么区别

主要体现在对系统资源的访问权限和功能上

  • 用户态
    • 在用户态下,程序运行在受限的环境中,只能访问有限的系统资源,如内存、CPU等。
    • 用户态下的程序不能直接访问操作系统的核心功能和敏感资源,如IO设备、内核数据结构等,而是通过系统调用(System Call)来请求内核提供服务。
    • 大多数用户应用程序都运行在用户态,例如浏览器、文本编辑器、游戏等。
  • 内核态:
    • 内核态是操作系统的特权级别,拥有对系统所有资源和功能的完全访问权限。
    • 内核态下的程序可以直接访问和控制系统的硬件资源和核心功能,如对内存管理、进程管理、设备驱动等进行操作。
    • 内核态下运行的代码通常是操作系统内核的一部分,如调度器、设备驱动程序等。

用户态和内核态之间的切换是通过系统调用来实现的。当用户程序需要执行特权操作时,如请求文件IO、申请内存等,会触发系统调用,将控制权从用户态切换到内核态,内核执行相应的系统服务,然后将结果返回给用户程序,并将控制权切换回用户态。

用户态到内核态的切换方式

用户态到内核态的切换通常通过系统调用(System Call)、硬件中断(Hardware Interrupt)和异常(Exception)来实现:

  1. 系统调用(System Call)
    • 应用程序需要操作系统服务(如文件操作、网络通信等)时,会通过系统调用进入内核态。
    • 例如,在Linux中,readwrite等函数会触发系统调用。
  2. 硬件中断(Hardware Interrupt)
    • 硬件设备(如键盘、网卡)需要操作系统处理时,会触发中断请求,使CPU进入内核态。
    • 操作系统内核中的中断处理程序会处理这些请求。
  3. 异常(Exception)
    • 当应用程序发生异常(如除零错误、非法内存访问)时,CPU会切换到内核态,交由内核处理。

用户态到内核态的切换过程

以下是用户态切换到内核态的典型过程:

  1. 触发条件:应用程序执行系统调用或硬件中断发生。
  2. 保存上下文:CPU保存当前用户态的CPU寄存器状态到内核栈中。
  3. 切换模式:CPU切换到内核态,改变当前的模式标志。
  4. 执行内核代码:内核开始执行对应的系统调用处理程序或中断处理程序。
  5. 恢复上下文:内核处理完请求后,恢复保存的用户态CPU寄存器状态。
  6. 返回用户态:内核完成处理,CPU切换回用户态,继续执行用户程序。

上下文切换


os总结
http://example.com/2024/05/09/os总结/
作者
Forrest
发布于
2024年5月9日
许可协议