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系统的知识,我会将学习的知识写成博客分享给大家,希望大家多多支持!!