常见的用户态空间程序:数据库、web服务器、shell脚本、Java程序或者其他常见语言的程序……我们一起看下Linux整体架构图:

文章插图
top命令查看CPU资源在linux系统使用
top
命令查看cpu时,能看到用户态和内核态占用的cpu资源
文章插图
其中各项数据表示内容:
us用户空间占用CPU百分比sy内核空间占用CPU百分比ni用户进程空间内改变过优先级的进程占用CPU百分比id空闲CPU百分比wa等待输入输出的CPU时间百分比hi硬件中断si软件中断st实时系统调用对于一个进程来说 , 比如web服务的进程,一般是运行在用户态的 , 但是当需要访问内存、磁盘等硬件设备的时候需要先进入到内核态中,也就是从用户态到内核态的转变,而这种转变需要借助系统调用来实现 。系统调用是内核向用户进程提供服务的唯一方法 。比如查看文件时,需要执行多次系统调用:open()打开文件,read()读取文件内容,write()将文件内容输出到控制台,最后close()关闭文件等 。系统调用的过程如下:
- 把 CPU 寄存器里原来用户态的指令位置保存起来;
- 为了执行内核代码,CPU 寄存器需要更新为内核态指令的新位置 , 最后跳转到内核态运行内核任务;
- 系统调用结束后,CPU 寄存器需要恢复原来保存的用户态,然后再切换到用户空间 , 继续运行进程;
一次系统调用的过程,其实是发生了两次 CPU 上下文切换
(用户态-内核态-用户态) 。需要注意的是:系统调用过程中,不涉及虚拟内存等进程用户态的资源 , 也不会切换进程,也就是系统调用过程中一直是同一个进程在运行 。系统调用过程也通常称为特权模式切换 。进程上下文切换 和 系统调用的区别?
- 进程上下文切换是指,从一个进程切换到另一个进程;系统调用过程一直是同一个进程在运行,属于进程之内的上下文切换
需要注意的是:进程是由内核来管理和调度的,进程的切换只能发生在内核态,保存上下文和恢复上下文的过程并不免费,需要消耗一定资源

文章插图
- 进程的上下文不仅包括了虚拟内存、栈、全局变量等用户空间的资源,还包括了内核堆栈、寄存器等内核空间的状态 。而系统调用这里没有涉及到虚拟内存等这些进程用户态的资源
- 因此进程的上下文切换就比系统调用时多了一步:在保存当前进程的内核状态和 CPU 寄存器之前 , 需要先把该进程的虚拟内存、栈等保存下来;而加载了下一进程的内核态后,还需要刷新进程的虚拟内存和用户栈 。
- 进程时间片耗?。?为了保证所有进程可以得到公平调度,CPU 时间被划分为一段段的时间片,这些时间片再被轮流分配给各个进程 。当某个进程的时间片耗尽了,就会被系统挂起 , 切换到其它正在等待 CPU 的进程运行 。
- 进程在系统资源不足(比如内存不足)时,要等到资源满足后才可以运行,这个时候进程也会被挂起,并由系统调度其他进程运行 。
- 进程通过睡眠函数 sleep 主动把自己挂起,CPU会重新调度;
- 当有CPU发现优先级更高的进程运行时,为了去运行高优先级进程 , 当前进程会被挂起;
- 发生硬中断,CPU 上的进程会被挂起,然后去执行内核中的中断服务进程 。
推荐阅读
- docker搭建yapi接口文档系统、Idea中上传接口、在线调用
- 在Tomcat中启用虚拟线程特性
- CentOS部署MySQL
- 在PE文件中简单注入代码,实现在启动前弹窗
- Linux命令系列之ls——原来最简单的ls这么复杂
- 邮政投诉-中国邮政投诉网站
- 从 C# 崩溃异常 中研究页堆布局
- .Net WebApi 中的 FromBody FromForm FromQuery FromHeader FromRoute
- oracle中的行转列,列转行
- 锅炉排污率一般为多少 蒸汽锅炉排污率%