内核态线程,进程和CPU

用户态和内核态是操作系统中两种不同的运行级别,内核态具有更高的权限,允许访问所有资源,而用户态受到限制。用户态进程需要通过系统调用、异常和中断切换到内核态执行特定操作。用户态到内核态的切换涉及到特权级变化和堆栈切换,以保证安全性。内核和用户进程分别有自己的缓存区,减少系统调用的开销。多核CPU和多线程可以并行处理任务,提高系统效率。
摘要由CSDN通过智能技术生成

用户态和内核态的概念

—>内核态: CPU可以访问内存所有数据, 包括外围设备, 例如硬盘, 网卡. CPU也可以将自己从一个程序切换到另一个程序
—>用户态: 只能受限的访问内存, 且不允许访问外围设备. 线程占用CPU的能力被剥夺, CPU资源可以被其他程序获取

为什么需要用户态和内核态?
—>由于需要限制不同的程序之间的访问能力, 防止他们获取别的程序的内存数据, 或者获取外围设备的数据, 并发送到网络, CPU划分出两个权限等级 :用户态 和 内核态

进程的堆栈

每个进程都有自己的堆栈,内核在创建一个新的进程时,在创建进程控制块task_struct的同时(在创建一个新进程时,系统在内存中申请一个空的task_struct区,即空闲PCB块,并填入所需信息。同时将指向该结构的指针填入到task[]数组中。当前处于运行状态进程的PCB用指针数组current_set[]来指出。这是因为Linux支持多处理机系统,系统内可能存在多个同时运行的进程,故current_set定义成指针数组),也为进程创建自己堆栈。一个进程有2个堆栈,用户堆栈和内核堆栈;用户堆栈的空间指向用户地址空间,内核堆栈的空间指向内核地址空间。当进程在用户态运行时,CPU堆栈指针寄存器指向的用户堆栈地址,使用用户堆栈,当进程运行在内核态时,CPU堆栈指针寄存器指向的是内核栈空间地址,使用的是内核栈;每当进程调用一次函数,都会在用户栈中为该函数分配一个栈帧(stack frame),也称为调用栈(call stack),当该函数返回时又会释放该栈帧。释放的栈帧不会从虚拟内存中移除,它可以被之后调用的函数重新使用,所以栈空间的大小是不会减小的。从用户态到内核态首先是将用户堆栈地址保存到内核堆栈中,然后将CPU堆栈指针寄存器指向内核堆栈。当由内核态转向用户态,步骤首先是将内核堆栈中得用户堆栈地址恢复到CPU堆栈指针寄存器中。

为何要设置两个不同的栈?

共享原因:

内核的代码和数据是为所有的进程共享的,如果不为每一个进程设置对应的内核栈,那么就不能实现不同的进程执行不同的代码。

安全原因:

如果只有一个栈,那么用户就可以修改栈内容来突破内核安全保护。

用户态与内核态的切换

所有用户程序都是运行在用户态的, 但是有时候程序确实需要做一些内核态的事情, 例如从硬盘读取数据, 或者从键盘获取输入等. 而唯一可以做这些事情的就是操作系统, 所以此时程序就需要先操作系统请求以程序的名义来执行这些操作.

这时需要一个这样的机制: 用户态程序切换到内核态, 但是不能控制在内核态中执行的指令

这种机制叫系统调用, 在CPU中的实现称之为陷阱指令(Trap Instruction)

他们的工作流程如下:

用户态程序将一些数据值放在寄存器中, 或者使用参数创建一个堆栈(stack frame), 以此表明需要操作系统提供的服务.
用户态程序执行陷阱指令
CPU切换到内核态, 并跳到位于内存指定位置的指令, 这些指令是操作系统的一部分, 他们具有内存保护, 不可被用户态程序访问
这些指令称之为陷阱(trap)或者系统调用处理器(system call handler). 他们会读取程序放入内存的数据参数, 并执行程序请求的服务
系统调用完成后, 操作系统会重置CPU为用户态并返回系统调用的结果

二:用户态和内核态的详细介绍?
当一个任务(进程)执行系统调用而陷入内核代码中执行时,我们就称进程处于内核运行态(或简称为内核态)。此时处理器处于特权级最高的(0级)内核 代码中执行。当进程处于内核态时,执行的内核代码会使用当前进程的内核栈。每个进程都有自己的内核栈。当进程在执行用户自己的代码时,则称其处于用户运行 态(用户态)。即此时处理器在特权级最低的(3级)用户代码中运行。当正在执行用户程序而突然被中断程序中断时&

用户级线程(User-Level Threads, ULTs)和内核线程(Kernel-Level Threads, KLTs)都是操作系统中用于并发执行任务的技术。它们与进程CPU内存的关系如下: 1. **进程**:进程是系统的基本运行单元,每个进程都有独立的地址空间、资源管理和生命周期。它是操作系统分配CPU时间的基本单位。 2. **内核线程**:由操作系统内核直接管理的线程,也称为轻量级线程(Lightweight Thread, LWP)。它们共享相同的进程上下文,切换开销小,可以并发执行,并通过调度机制轮转到不同的CPU核心上运行。 3. **用户级线程**:存在于应用程序层面的线程,不是操作系统直接管理的,而是由编程语言库(如Java的Thread或.NET的Task)提供的。虽然看起来像是单独的执行实体,实际上需要借助内核线程的调度来完成。当应用启动用户线程时,会生成对应的内核线程支持其运行。 4. **CPU内存**:当CPU需要执行线程的任务时,它从内存中加载该线程的数据和指令。无论是内核线程还是用户级线程,都会占用一定内存,包括栈空间和程序数据区。 关系: - 用户级线程通常比内核线程消耗更少的系统资源,因为它们不需要频繁地引起内核模式的上下文切换。 - 内核线程对系统的硬件资源控制更直接,所以性能更好,而用户级线程则依赖于操作系统的调度策略。 - 进程包含多个线程线程之间共享进程的资源,同时通过多线程提高计算效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值