os总结
进程和线程的区别
进程
- 进程是OS的资源分配单位,它包含了程序执行所需要的资源,如内存空间、文件句柄等,是一个程序的运行的实例
- 进程是独立调度和运行的,每个进程都有自己的PCB,OS通过调度算法决定给每个进程的CPU时间
- 进程的创建和销毁开销很大,因为需要为进程分配和释放资源,包括内存空间、文件句柄等
- 进程间的通信(IPC)相对复杂,需要使用特定的机制(管道、消息队列、共享内存等来实现)
线程
- 线程是CPU的最小调度单位,线程是进程的一部分,共享进程的资源,包括代码段、数据段、打开的文件等,每个线程都有自己的栈空间和寄存器上下文
- 线程是由进程创建和控制的,线程共享进程的地址空间和其他子啊云,线程的调度更轻量级
- 创建和销毁的开销小
堆和栈的区别
栈(Stack)
- 内存分配方式:
- 栈内存是连续分配的。
- 每个函数调用都会在栈上分配一块内存,函数结束时这块内存会自动释放。
- 分配速度:
- 栈内存分配和释放非常快,因为它遵循LIFO(后进先出)的原则。
- 存储内容:
- 栈主要存储函数的局部变量、参数和返回地址。
- 大小限制:
- 栈的大小是有限的,通常由操作系统或运行时环境设置。如果栈空间用尽,会导致栈溢出(stack overflow)。
- 生命周期:
- 栈上分配的变量在函数调用结束后自动释放。
堆(Heap)
- 内存分配方式:
- 堆内存是动态分配的,内存块可以在程序运行时任意分配和释放。
- 分配速度:
- 堆内存分配比栈内存分配要慢,因为需要复杂的内存管理操作,如垃圾回收(Garbage Collection)。
- 存储内容:
- 堆主要用于存储那些需要在多个函数之间共享的数据,或者生命周期不局限于单个函数调用的变量。
- 大小限制:
- 堆的大小通常只受系统总内存的限制。
- 生命周期:
- 堆上分配的变量由程序员手动控制其生命周期,或者由垃圾回收器自动管理。
在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)来实现:
- 系统调用(System Call):
- 应用程序需要操作系统服务(如文件操作、网络通信等)时,会通过系统调用进入内核态。
- 例如,在Linux中,
read
、write
等函数会触发系统调用。
- 硬件中断(Hardware Interrupt):
- 硬件设备(如键盘、网卡)需要操作系统处理时,会触发中断请求,使CPU进入内核态。
- 操作系统内核中的中断处理程序会处理这些请求。
- 异常(Exception):
- 当应用程序发生异常(如除零错误、非法内存访问)时,CPU会切换到内核态,交由内核处理。
用户态到内核态的切换过程
以下是用户态切换到内核态的典型过程:
- 触发条件:应用程序执行系统调用或硬件中断发生。
- 保存上下文:CPU保存当前用户态的CPU寄存器状态到内核栈中。
- 切换模式:CPU切换到内核态,改变当前的模式标志。
- 执行内核代码:内核开始执行对应的系统调用处理程序或中断处理程序。
- 恢复上下文:内核处理完请求后,恢复保存的用户态CPU寄存器状态。
- 返回用户态:内核完成处理,CPU切换回用户态,继续执行用户程序。
上下文切换
os总结
http://example.com/2024/05/09/os总结/