当前位置: 首页 > ai >正文

Linux 进程概念补充 (自用)

进程概念

  • 内核
  • 进程
  • 进程状态
  • 内存泄漏
  • 进程调度。
  • Linux真实调度算法
  • 环境变量

内核

狭义上的操作系统指的是 内核就是进程管理进程调度,文件系统等等。
广义上的操作系统其实在外壳指令这些。封装了系统调用的东西。

进程

课本概念程序的一个基本实例
内核观点,承担分配资源的实体。
我们可以理解为所谓进程就是PCB+加载到内存的代码和数据。

管理就得先描述再组织。Linux下的PCB就是task_struct。

我们可以通过指令ps axj|head -1

ls /proc (内存级的文件系统)

在这里插入图片描述
cwd -> cwd 表示进程的 ​当前工作目录
exe -> 表示进程执行的 ​可执行文件路径,即进程是通过哪个二进制文件启动的

bash就是一个死循环的进程

fork()创建子进程,如何理解fork调用一次返回两次
一个函数通常在执行到return语句之前,函数的工作基本完成了。
我们认为在fork函数内部执行到return之前,我们已经创建了子进程。父子进程同时return

进程状态

进程状态实际就是task struct中的一个整数。
有运行阻塞挂起。
运行就是进程链入到运行队列
阻塞就是进程链入到阻塞队列中

理解Linux内核链表的话题,
Linux的PCB,封装一个双向链表的结构体。
封装了一个previous指针和一个next指针。
PCB中可以存在多个这样的结构体
第一个head我们放在这个调度队列中,第二个放在在等待队列中,第三个再放入其他。
这样就可以将一个进程链入到不同的数据结构当中。可能有的人会想,我们就可以用offset函数计算出偏移量

如何管理硬件?管理硬件先描述再组织,就是我们有个struct device的。结构体里面封装了这个。ID标识符,然后status表示状态,然后task struck wait_queen,

如果说进程所就绪的,所需要的资源未就绪,我们就把它列入到特定硬件的阻塞队列中,如果如果硬件那个硬件就去了,我们就在那再链回到运行队列中。

事实上我们察觉不了,其实是内存中的代码和数据挂回到磁盘中但是我们保留它PCB的结构体

挂起就是挂到外设或者说将他放到运行队列的末端。

运行在在unix,Linux下表现的就是偶尔加或者说r状态二加是前台,r是后台。
S就是阻塞状态,然后也就可中断睡眠,浅睡眠。就是然后操作系统可以自自主的杀死这个进程。

具体状态
R(后台)和R+(前台)运行

S(阻塞) 可中断休眠(操作系统可自主杀死该进程)
t(暂停) debug下
T(暂停) Ctrl+Z
这个是Linux下的特有的状态,这个只是一种操作系统止损的行为。这个进程是不是真要杀死?但操作系统只是怀疑这个进程有问题,所以就暂停住他。

D就是不可中断状态。因为如果说我们进行大量的这个写入,但是如果说进程被杀死,用户无法得知,那数据就会直接丢失,为此我们需要一个不可被击杀的状态,但其实这个状态是很少见的。只要做存储和IO的人才知道

Z状态就是僵尸状态,僵尸进程这个东西是非常重要的,如果我们不对僵尸进程进行处理的话,那就会造成这个内存泄露,父进程不管僵尸进程就会一直维护导致内存泄漏。

内存泄漏

常驻内存的进程(死循环)才会有内存泄漏

如果子进程退出之前,父进程先现在死亡了,那么子进程就会托管给父进程?

进程调度。

我们要理解到首先我们谈两个概念,优先级和权限。优先级是指先后顺序,权限是能否得到我们只有在具有访问的权限的情况下才能谈优先级的概念。

我来讲一下nice值,值越低,优先级越高。但其实nice值是有一定范围的即优先级有一定范围,否则会导致进程饥饿,

并发是多个进程。单哥CPU快速切换,也就是分时系统。
并行就是多个进程。多个CPU。

进程会调度。
哪怕该进程是死循环也会调度
保存:将寄存器中的内容保存到当前进程的PCB当中
恢复上下文:当前进程的PCB当中的内容恢复到寄存器当中

我要要意识到空间一份,内容多份!!!

Linux真实调度算法

在这里插入图片描述

nr_active表明多少个进程
bitmap[5],0到99实时优先级不考虑,100-139分时我们要考虑的优先级。通过位图我们就能O(1)地得出当前优先级下队列是否有进程
queue哈希桶,哈希函数X-60+(140-40)。
X是进程优先级,进程优先级范围是[60,99]

当前进程执行完之后,并不是直接列入到当前队列的最末端因为这样的话一个优先级高的死循环进程,我们永远无法到达到下一优先级队列当中。因此我们将它列入到过期队列当中。随着时间的发展活跃队列的进程越来越少,过期队列的进程越来越多。最后当活跃队列的进程为零时,我们将活跃队列和过期队列的指针交换(O(1))。又得到了一个充满进程的活跃队列和一个空的过期队列。

环境变量

命令行参数:实现不同程序子功能的方法
int main(int argc,char* argv[])

环境变量从哪来?
配置文件里来

.bash_profile
.bashrc(在这里面添加PATH)

su USER变
su - 重新登入

环境变量Key=Value的形式
PWD(当前路径)
OLDPWD(上次路径)

http://www.xdnf.cn/news/690.html

相关文章:

  • 【数据结构】红黑树
  • 2181、合并零之间的节点
  • 右起第2个LED灯的闪烁(STC89C52单片机)
  • HTTP 1.0 和 2.0 的区别
  • (done) 吴恩达版提示词工程 1. 引言 (Base LLM 和 Instruction Tuned LLM)
  • ESP32开发之任务创建
  • 用P0口实现流水灯效果(STC89C52单片机)
  • JavaScript解密实战指南:从基础到进阶技巧
  • 硬件电路(24)-NE555振荡电路
  • 六、小白如何用Pygame制作一款跑酷类游戏(静态障碍物和金币的添加)
  • c++通讯录管理系统
  • 运筹学之引力搜索
  • Mac上Cursor无法安装插件解决方法
  • 【KWDB 创作者计划】_上位机知识篇---ESP32-S3Arduino
  • Aerich实战指南:零基础掌握异步ORM数据库迁移工具
  • Linux `init 6` 相关命令的完整使用指南
  • Android Gradle多渠道打包
  • 【自然语言处理与大模型】Linux环境下Ollama下载太慢了该怎么处理?
  • AIStarter新版本发布:模型、插件与工作流的高效管理工具
  • 【C++初阶】第15课—模版进阶
  • 多模态大语言模型arxiv论文略读(三十)
  • 设计心得——函数参数的封装
  • Redis缓存降级的4种策略
  • QT实现串口透传的功能
  • OSPF综合实验——企业边界路由器、LSA收敛
  • 车载测试用例开发-如何平衡用例覆盖度和测试效率的方法论
  • VSCode 扩展离线下载方法
  • 如何编写JavaScript插件
  • 5、openfeign
  • 初识javascript