欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 创投人物 > Linux——进程概念

Linux——进程概念

2025/5/22 8:06:56 来源:https://blog.csdn.net/unlockjy/article/details/147217070  浏览:    关键词: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函数就是一个创建进程的函数 

它有两个返回值 给子进程返回0,给父进程返回pid,失败返回-1

进程调用fork函数 内核会做:

  • 分配新的内存块和数据结构给子进程
  • 将父进程的部分数据拷贝给子进程 task_struct 子进程也会修改部分数据 比如说pid
  • 将子进程添加到进程列表

我们来看一段代码

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

 原理:

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

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

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

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

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

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

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

为什么一个函数返回两次

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

为什么id既可以等于0又可以等于1 

这个我们需要了解虚拟地址空间的知识,但是也能理解一部分,

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

结语:

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词