linux进程概念

冯诺依曼体系结构

在这里插入图片描述
计算机由一个个的硬件构成

输入设备:包括键盘,鼠标,磁盘,话筒等
输出设备:包括显示器,磁盘等
存储器:这里的存储器值得是内存
中央处理器(CPU):包括运算器和控制器等,进行算术运算和逻辑运算

同时,设备是连接的,设备之间要有数据流动,本质就是设备之间进行数据拷贝,所以拷贝的整体速度是决定计算机速度的重要指标

为什么要引入内存呢?CPU直接和输入输出设备打交道就可以,为什么中间要加一层内存呢?
首先,距离CPU越近的存储单元,效率越高,造价越贵,单体容量小;距离CPU越远的存储单元,效率越低,造价越低,单体容量大
如果CPU直接和输入输出设备打交道,而输入输出设备离CPU距离很远,所以即便CPU速度很快,但输入输出设备的速度非常慢,最终还是要以输入输出设备的效率为主
引入内存,相当于输入输出设备和CPU之间有了一个非常大的缓存,通过预先加载数据和缓存机制,把效率问题转换成了软件问题,计算机效率最终变成了以内存效率为主

通过冯诺依曼体系结构解释一下为什么程序在运行时,必须加载到内存

程序是一个磁盘上的文件,文件中的指令和数据要让CPU执行,而CPU只和内存打交道,所以文件要先加载到内存中

操作系统

操作系统是一个进行软硬件资源管理的软件
在这里插入图片描述

理解一下管理
管理的本质不是对人做管理,是对人的数据做管理,那要怎么管理呢?先描述再组织

同样地操作系统要管理硬件,要怎么管理呢?先描述,再组织
而Linux系统本身使用C语言写的,所以我们可以定义一个结构体,再把它用链表连接起来

struct device
{	
	硬件地各种属性数据
	struct device* next;
};

系统调用和库函数
操作系统要对软硬件资源做管理,从数据安全考虑,用户不能直接访问操作系统内地任何数据,而操作系统又要对上提供服务,所以必须提供一部分接口,叫做系统调用
访问软硬件资源必须经过操作系统,要访问操作系统必须使用系统调用
系统调用在使用上比较基础,对用户的要求相对比较高,所以有人对系统调用进行封装,从而形成了库

什么操作系统:操作系统是一个进行软硬件资源管理地软件
为什么要有操作系统:操作系统对下进行软硬件资源管理,从而对上提供良好地运行服务
操作系统怎么做的?先描述,再组织

进程

在Windows上我们可以同时启动多个程序,所以我们一定要将多个.exe文件加载到内存。操作系统要管理多个加载到内存中地地程序,怎么管理呢?先描述,在组织。我们可以定义一个结构体,再把各个节点用链表连接起来

struct task_struct
{
	//进程的属性数据
	标识符
	状态
	优先级
	等等
	struct task_struct* next;
};

进程信息被放在一个叫做进程控制块的数据结构(PCB process control block)中,Linux操作系统下的PCB是tack_struct,它会被装载到内存中并且包含着进程的信息,所以进程=内核数据结构+可执行程序的代码和数据
所有对进程的控制和操作都只和进程PCB有关,和可执行程序无关

task_struct内容分类:

  • 标识符:描述本进程的唯一标识符,用来区分其他进程
  • 状态: 任务状态,退出代码,退出信号等
  • 优先级:相对于其他进程的优先级
  • 程序计数器:程序中即将被执行的下一条程序的地址
  • 内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
  • I/O状态信息:包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表
  • 记账信息:包括处理器时间总和,使用的时钟数总和,时间限制,记账号等
  • 上下文数据:进程执行时处理器的寄存器中的数据
  • 其他信息

进程标识符

首先,进程标识符是task_struct的数据,也就是操作系统的内部数据,所以要获取进程标识符,必须调用系统调用

进程id(PID) process id
父进程id(PPID) parent process id
在这里插入图片描述

通过系统调用创建进程:
要创建进程,就要访问操作系统,就要调用系统调用
在这里插入图片描述
pid_t fork();
作用:创建一个子进程,子进程以父进程为模板进行创建,fork之后,代码共享,通常可以用if进行分流,让父子进程做不同的事情
返回值:如果成功,父进程返回子进程的pid,子进程返回0

父进程返回子进程的pid,子进程返回0,为什么?
一个孩子只有一个父亲,而一个父亲可以有多个孩子。子进程通过系统调用很容易找到父进程,但是父进程找子进程必须有标识符
fork函数为什么会返回两次?
当fork函数return的时候,核心逻辑已经执行完了,已经以父进程为模板创建了一个子进程,所以会返回两次
返回值,怎么会大于0,又等于0?
a.fork之后,父子进程代码共享,数据写时拷贝 b.返回的本质就是往这个变量中写入。所以子进程会发生写时拷贝,Linux下父子进程可以用同一个变量名表示不同的内存,所以父子进程的返回值在内存中的不同位置,也就有不同的值

进程状态

首先,状态的本质是一个整形变量,用不同的值表示不同的状态
状态又决定了后续动作,在Linux中可能存在多个进程都要根据他的状态执行后续动作,所以进程需要通过排队等待某种资源,而只要是排队一定是进程PCB排队
每一个CPU都有一个运行队列,每一个底层设备都要有一个等待队列
状态的变迁,引起的是PCB被操作系统变迁到不同的队列中
运行状态:并不意味着进程一定在运行中,它表明进程要么在运行要么在运行队列中
阻塞状态:等待软硬件资源
当我们的进程在等待软硬件资源时,如果资源没有就绪,我们进程PCB只能把自己设置为阻塞状态,把自己的PCB链入等待资源提供的等待队列中

Linux下的进程状态:
R运行状态:并不意味着进程一定在运行中,它表明进程要么在运行要么在运行队列中
S睡眠状态:进程在等待软硬件资源,又叫做可中断睡眠,浅度睡眠
D磁盘休眠模式:不可中断睡眠,深度睡眠
T停止状态:可以发送信号停止进程
X死亡状态

僵尸状态—Z
僵尸状态是一个比较特殊的状态,当进程退出且父进程没有读取子进程退出的返回代码时就会产生僵尸进程。僵尸进程会以终止状态保持在进程表中,并且一直等待父进程读取退出状态代码
为什么要有Z状态?
创建进程是希望进程完成工作的,子进程必须有结果数据放在PCB中
什么是Z状态?
进程已经退出,但是当前进程的状态需要自己维持住,供上层读取,当子进程退出时,代码和数据可以释放,但进程PCB必须等待父进程读取退出状态信息
如果不读取呢?
如果父进程一直不读取,僵尸状态一直存在,进程PCB也要一直存在,就会早成内存泄露
在这里插入图片描述

孤儿进程
父进程先退出,子进程就叫做孤儿进程
孤儿进程会被1号init进程领养,由init进程回收
当前台进程变成孤儿进程时,会变后台进程
在这里插入图片描述

进程优先级

是什么?
进程访问某种资源,通过一定的方式(排队),确定享受资源的先后顺序
为什么?
资源过少
怎么办?
在进程PCB中用两个整形表示
PRI:代表进程的优先级
NI:代表进程的nice值

默认优先级是80
优先级可以被修改,范围是[60, 99]
优先级的本质是数字,数字越小,优先级越高
Linux系统允许用户调整优先级,但是不能直接修改PRI,而是修改NI
PRI = PRI(old) + NI
PRI(old)每次都是80
因为优先级的范围是[60, 99],所以NI的取值范围是[-20, 19],一共40个级别
NI不是优先级,而是优先级的修正数据

进程调度与切换

现代操作系统都是基于时间片轮转执行的
进程在运行中要产生大量临时数据,放在CPU的寄存器中
CPU内部的所有临时数据,叫做进程的硬件上下文
所有的保存都是为了恢复,所有的恢复都是为了继续上次的执行
进程保存硬件上下文,当进程被二次调度时,进程被放到CPU上开始运行,将曾经保存的硬件上下文进行恢复

竞争性:系统资源过少,进程数目众多,所以每个进程之间具有竞争属性的,为了高效完成任务,更合理竞争相关资源,便有了优先级
独立性:多进程运行,需要独享各种资源,多进程运行期间互不干扰
并行:多个进程在多个CPU下分别,同时进行运行
并发:多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进

环境变量

命令行参数时Linux指令选项的基础
环境变量一般时系统内置的具有特殊用途的变量
bash会维护命令行参数表和环境变量表
环境变量具有全局属性,会被所有的子进程包括孙子进程继承
命令:
echo:显示某个环境变量值
export:设置一个新的环境变量 export key=value
env:显示所有环境变量
unset:清除环境变量/本地变量
set:显示本地定义的shell变量和环境变量
本地变量只在bash中有效,不属于环境变量

进程地址空间

在这里插入图片描述
在这里插入图片描述

父子进程输出的地址相同,但变量的值不同
所以父子进程绝不是同一个变量
地址相同,说明该地址绝对不是物理地址
在Linux地址下,这种地址叫做虚拟地址/线性地址
我们所用到的所有地址,都不是物理地址

每一个进程都存在一个进程地址空间,操作系统要对进程地址空间做管理->先描述,再组织,所以进程地址空间就是数据结构,具体到进程中,就是特定数据结构对象,其中必有各种区域的划分
我们的进程地址空间,补具备对代码和数据的保存能力,需要再物理内中存放,所以需要将进程地址空间上的地址转化到物理内存中,系统给我们进程提供了一张引射表—页表
为什么要有进程地址空间+页表
a.将物理内存从无序变成有序(页表),让进程以统一视角看待内存
b.将进程管理和内存管理解耦合
c.地址空间+页表时保护内存安全的重要手段

  • 24
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LRBORRR

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值