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

Linux——进程概念

前言: 

相信大家对进程这个词并不陌生,我们在学习Linux时,是离不开进程的,这篇就主要来谈谈进程的概念,相信大家看完对进程的概念有了更多的认识!

1.冯诺依曼体系

我们使用的常见的电脑,或者我们不常见的计算机比如服务器,大部分都会遵循冯诺依曼体系!

这里的运算器+控制器就是我们的CPU

存储器可以理解为内存

输入设备包括我们的键盘,鼠标           输出设备包括显示器,磁盘

我们通过图片可以发现,CPU获取数据都是通过内存,CPU无法读取外设,都是输入设备通过加载到内存然后CPU进行访问处理然后给输出设备。

CPU数据层面只和内存打交道,外设只和内存交流,可是为什么要这样呢?为什么中间要加内存呢???

原因:输入设备和输出设备的运行效率比较低,而CPU的运行效率非常高,如果说没有内存,这个时候就会出现一种情况,CPU已经处理完了输入设备给的数据,而输入设备还在慢悠悠的传数据,等输入设备传好了CPU已经等了很久了,这就会造成一种资源浪费的情况,

我们知道CPU里有寄存器,但是寄存器非常贵,所以拿寄存器来传数据也不现实,所以我们就加入了内存,其实核心就是为了让他们的速度进行适配!!

 2.操作系统

我们可以将操作系统理解为一个进行软硬件管理的软件

内核:进程管理 内存管理 文件管理 驱动管理

我们可以看到是层状的,他们有着高内聚,低耦合的属性

操作系统的核心:1.决策 2.执行

根据数据进行管理 先描述 再组织

我们来理解一下如何管理 就拿校长和学生

我们可以想一下校长是怎么管理学生的,是要见到学生管理吗?并不是,而是知道他们的学号,姓名等就可以,就是根据数据进行管理,一个学校人少的时候 校长可以创建一个Excel表格 来存放学生的相关信息,学号 姓名等等,但是如果学生有很多,一个表格可能就会很麻烦,所以校长可以创建一struct,来存放学生的属性,然后再用链表将他们连起来,这就是先描述,再组织

系统调用:

操作系统会暴露一些接口供我们开发者使用,这部分由操作系统提供的接口就叫系统调用

系统调用的功能比较基础 对用户的要求也比较高 有开发者对系统调用进行了封装,就有了库,更有利于用户的使用

3.进程概念

基本概念:程序的一个执行实例,正在执行的程序等

相信大家对这个概念听了可以也不会有太大的感觉 接下来给大家画个图理解一下!

操作系统必须对多个加载到内存的程序进行管理

3.1PCB

进程信息被放在一个叫进程控制块的数据结构中,里面存放的是进程的所有的属性,就叫做PCB

在Linux下的PCB是task_struct   

task_struct里的信息非常多,我们需要慢慢学习,我们现在只需要知道里面存放的是进程的所有信息即可,还需要知道里面有一个list_head  它的内核双链表非常巧妙!

历史上所有执行的命令,工具,包括我们自己写的程序,全部都是进程!!

4.查看进程

4.1getpid

gitpid可以查看当前进程

4.2ps axj 

4.3getppid

gitppid就是查看父进程 我们可以查看父进程的id

通过几次查询 我们发现我们的ppid是相同的

我们可以看到,这个进程是一个bash 

bash是一个命令行解释器    本质上就是一个进程

我们创建的进程都是bash的子进程

OS会给每一个用户分配一个bash

5.创建进程

5.1fork函数

fork函数就是一个创建进程的函数

我们来看一段代码

运行结果:我们会发现 第二个printf被打印了两次

 原理:

 开始启动 没有调用fork,pid30738,第二行输出pid是30738,30378的父进程就是bach

第三行输出 pid是30739,它的父进程是30378

我们可以看到父子执行了不同的代码块

为什么fork给父子返回不同的值

 父和子是一对多的关系 可以有多个孩子 但是父亲只有一个

返回给父进程pid是因为父进程要管理多个子进程 

返回给子进程0是因为 我们可以用ppid找到对应的父进程

为什么一个函数返回两次

调用fork函数,fork函数执行完进行返回id,父子各自返回一次

当父子进程任何一方被修改,OS就会把被修改的数据在底层拷贝一份,让目标进程进行修改

这个就是写时拷贝

结语:

后续会更新更多相关Linux系统的知识,我会将学习的知识写成博客分享给大家,希望大家多多支持!!

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

相关文章:

  • 网络开发基础(游戏)之 Socket API
  • [Java EE] Spring 配置 和 日志
  • 代码随想录训练营第35天 || 01背包问题 416. 分割等和子集
  • Vue基础(6)_键盘事件
  • 玛哈特整平机:工业制造中的关键设备
  • Java 动态代理实现
  • Python scikit-learn 机器学习算法实践
  • 【每天一个知识点】模式识别
  • MySQL进阶-存储过程-变量语法结构
  • C++用于保留浮点数的两位小数,使用宏定义方法(可兼容低版本Visual Studio)
  • JZ8P1533 充电型数字可编程控制器
  • 200+短剧出海平台:谁能成为“海外红果”?
  • 电脑端移植至手机平板:攻克难题,仙盟架构显神通——仙盟创梦IDE
  • 2025.04.19-阿里淘天春招算法岗笔试-第二题
  • 在RK3588上使用SRS流媒体服务器
  • kafka集群认证
  • NumPy 核心指南:零基础入门与实践
  • 商标起名换了暗示词,通过初审!
  • 边生成边训练:构建合成数据驱动的在线训练系统设计实战
  • XMind 下载指南
  • 基于autoware.1.14与gazebo联合仿真进行全局规划高精地图版
  • 可穿戴经颅多通道直流电刺激产品测试总结
  • 16、堆基础知识点和priority_queue的模拟实现
  • 为什么 waitress 不支持 WebSocket?
  • PyTorch源码编译报错“fatal error: numpy/arrayobject.h: No such file or directory”
  • SEO长尾关键词优化实战
  • velocity模板引擎
  • 【一起学Rust】使用Thunk工具链实现Rust应用对Windows XP/7的兼容性适配实战
  • RoBoflow数据集的介绍
  • JVM笔记【一】java和Tomcat类加载机制