Linux进程概念


前言

系统编程阶段:进程概念/进程控制/基础IO/进程间通信/进程信号/多线程
进程概念:
冯诺依曼体系结构/操作系统/进程概念/创建进程初阶/进程状态/环境变量/程序地址空间

一、冯诺依曼体系结构是什么?

冯诺依曼体系结构:现代计算机的硬件体系结构
五大硬件单元:
输入设备:键盘
输出设备:显示器
存储器:内存8G
运算器:中央处理器-CPU
控制器:主要用来控制和指挥程序和数据的输入运行,以及处理运算结果
在这里插入图片描述

1.为什么不使用更大的硬盘作为存储器?

		内存吞吐量是硬盘的几十倍

2.存储数据为什么不用内存条?

		不能持续存储,断电会丢失数据						

二、操作系统

操作系统:内核+应用
内核:管理计算机上的软硬件资源
应用:为了使计算机更加好用
如何管理:理解先描述,再组织起来进行管理的思路

先描述:用struct结构体描述设备
再组织:用数据结构(链表等)组织在一起

在这里插入图片描述

库函数与系统调用接口的关系:库函数封装了系统调用接口
系统调用接口:操作系统向上提供的系统核心功能的接口

三、进程概念

进程:就是一个运行起来的程序

程序:一系列有序的指令集合—就是程序员编写的代码—存储在硬盘中
冯诺依曼–所有的数据指令想要被CPU处理,第一步就是将代码和数据加载到内存中
在这里插入图片描述

1.操作系统如何实现多个程序的调度运行:

将这个运行中的程序描述起来,然后将这些描述组织起来进行管理。
通过使用对pcb的调度管理实现对运行中程序的切换调度运行–对于操作系统来说这个描述信息-pcb就是进程

CPU分时机制:cpu以极快的速度切换调度运行所有的程序,造成大家都在同时运行的假象

2.cpu如何在内存中找到每个程序呢?cpu切换调度回来的时候,如何保证能够从上一次运行的位置继续运行呢?cpu切换调度回来的时候,如何保证能够继续处理上一次没有处理完的数据呢?

进程就是pcb,是操作系统对一个运行中程序的描述,通过这个描述,实现对程序的运行调度

这个pcb/这个描述在linux中是一个结构体–struct task_struct{…}
描述信息:内存指针,程序计数器,上下文数据,进程标识符PID,IO信息,进程状态,记账信息…
内存指针:用于指向程序指令数据在内存中的位置
程序计数器/上下文数据:用于保存当前的程序的运行
操作系统认为要运行哪个程序了,则找到对应的pcb.将pcb中保存的各种描述信息加载到cpu寄存器上
并发:轮询处理执行
并行:同时运行处理

四、进程创建的初步认识

进程就是pcb,意味着创建一个进程,就是创建一个pcb
pid _t fork(void) – 通过复制一个调用进程(父进程)创建一个新的进程(子进程)

1.创建了一个新的pcb,然后从父进程pcb中复制了很多数据过来

复制的信息:内存指针,程序计数器,上下文数据。。。。。
内存指针:子进程和父进程运行的代码其实是一样的–指向同一块物理内存中的数据以及指令
程序计数器/上下文数据:子进程被创建出来后,运行位置与父进程是完全一样的,下一步即将执行的指令都是从创建子进程成功之后开始的
创建一个子进程出来,跟父进程干的事情是一样的,因为他们的运行的代码和数据以及当前的运行位置都是一样的

2.这个函数的返回值对于父子进程是不一样的

在父进程中返回创建的子进程的pid,在子进程中返回的是0
通常根据fork的返回值进行代码的分流,让父子进程进入不同的判断执行体完成不同的功能
父子进程代码共享,数据独有

fork的基本使用与返回值认识
pid_t getpid(void) — 返回调用进程的pid–谁调用就返回谁的pid

五、进程状态

进程的查看:ps -ef /ps -aux

1.进程状态:就绪/运行/阻塞

linux下进程的状态:
运行状态R:就绪以及正在运行 运行状态的进程才会被操作系统调度在cpu上运行
可中断休眠态S:当前的阻塞能够被中断
不可中断休眠态D:当前的阻塞不会被中断唤醒,等待条件满足自己醒来
停止态T:停止运行,什么都不干 kill不掉
僵死态Z:进程已经退出了但是资源没有完全被释放的一种状态 这是一种等待后续处理的状态

命令:ps - aux /kill /kill -9 强制杀死进程

2.僵尸进程

处于僵死状态的进程,指的是进程已经退出不在运行,但是资源没有完全释放

1.僵尸进程是怎样产生的?

子进程先于父进程退出,但是父进程没有关注子进程的退出状态,因此子进程成为僵尸进程

2.资源没有完全被释放是什么意思?

因为子进程要保存退出原因

3.僵尸进程的危害:

资源泄露 一个用户所能创建的进程数量是有限的(查看可创建的进程操作:ulimit -a),并且资源没有完全回收会占据内存资源

4.处理方法:

进程等待(正规处理方法)
退出父进程(父进程退出,子进程保存退出原因就没有意义了因此也就释放了)

3.为什么要创建一个子进程—子进程干的事情跟父进程是一样的

创建子进程是为了分担父进程,提高效率

4.孤儿进程

父进程先于子进程退出,则子进程成为孤儿进程,这个孤儿进程的父进程成为了1号进程并且这孤儿进程运行在后台,孤儿进程是不会成为僵尸进程,因为1号进程随时关注子进程退出

守护进程:是一种特殊的孤儿进程,父进程是一号进程,运行在后台+++++与终端以及登录会话脱离关系,就是没有终端,不再受影响,守护进程通常是一种运行在系统后台的批处理程序(默默的做一些循环往复的事情)
精灵进程:就是守护进程

5.进程优先级:一个进程对于cpu资源获取的优先权 ---- 权级就是一个数字

为什么要有优先级:
交互式进程:直接与用户进行交互的进程—要求最好能够优先被cpu处理
批处理进程:在后台默默做循环工作的进程
优先级的作用:让操作系统运行的更加良好
在这里插入图片描述
在这里插入图片描述

六、环境变量

环境变量:配置系统运行环境参数的变量
环境变量的好处:使系统运行环境配置更加简单灵活;可以通过设置环境变量给一个进程传递参数信息
环境变量的操作:
查看环境变量:env(只查看环境变量) / set(查看所有变量,包含环境变量)/echo(查看单个的)
设置环境变量:export
删除环境变量:unset

环境变量是具有继承特性的:子进程也拥有父进程的环境变量
代码中环境变量的操作:
main函数的第三个参数
int main(int argc,char*argc[],char *env[])----env保存环境变量
通过一个全局变量 extern char **environ; —environ保存环境变量
char *getnev(const char *name);通过环境变量名称获取一个指定环境变量
特性:父子进程之间的传递,子进程默认会继承父进程所拥有的全局变量–环境变量也可以用于参数的传递。
典型:PATH-系统命令程序的默认搜索路径

七、程序地址空间:进程的虚拟地址空间

在这里插入图片描述

1.程序地址空间是什么?

地址:对内存单元的编号
程序是不占用内存的,运行起来的程序被加载到内存,才会占用内存

指针是什么?
指针就是一种变量类型,定义一个指针变量, 存放地址的变量

一个全局变量,在子进程中修改后,打印100,父进程中依然打印1
数据不同,表示肯定没有用同一块内存空间(一块内存空间不可能存储两个数据)
父子进程打印的数据不同但是地址却是相同的–矛盾

实际上进程中访问的地址都是虚拟地址,而我们所说的程序地址空间实际上是一个进程的虚拟地址空间;

2.如何虚拟一个内存空间?为什么要虚拟一个内存空间?

虚拟地址空间其实就是一个结构体 mm_struct;----是一个对内存空间的描述—通过这个描述向进程虚拟出一个完整的,连续的内存空间

size–表示内存大小
code_start/code_end :描述代码段的起始与结束–通过这两个信息就可以描述一块空间

虚拟地址空间–操作系统通过mm_struct结构体为一个进程描述的虚拟的,连续的,完整的,线性的地址空间
为什么要描述这么一个空间?
为了能够实现不让进程直接访问物理内存

3.进程直接访问物理内存的危害:

1.进程中代码数据的使用都是连续的地址,若直接使用连续的物理内存会造成内存的浪费
2.直接访问物理内存会因为缺乏内存访问控制导致进程的不安全
在这里插入图片描述

4.进程使用虚拟地址空间的好处

1.通过页表映射物理内存,可以实现进程中数据在物理内存上的离散式存储,通过这种方式提高了内存利用率
2.在页表中可以直接针对某个地址设置这个地址的访问权限–这个地址是只读的–通过这种方式实现内存访问控制

页表如何实现通过虚拟地址访问物理地址?—MMU
内存管理方式:分页式内存管理/分段式内存管理/段页式内存管理

5.分页式存储

分页式内存管理的虚拟地址组成:页号+页内偏移
页号:页表中页表项的编号
页内偏移:具体一个变量首地址相较于内存页起始位置的偏移量
物理内存块号*物理内存块大小+虚拟地址中的页内偏移=物理地址
在这里插入图片描述

分页式内存管理的优点:讲物理内存进行分块管理,通过页表映射实现数据在内存上的离散式存储,提高内存利用率。

6.分段式存储

分段式内存管理:
地址组成:段号+段内偏移 段表 段号-物理段起始位置
分段式内存管理:是程序员对内存的管理更加方便,将内存空间分为了代码段,初始化全局段…;什么变量就在什么段申请地址
在这里插入图片描述

7.段页式存储

段页式内存管理: 先分段,在每个段内采用分页
地址组成:段号+段内页号+页内偏移
段表:段内页表的地址(在每一个分段内,又采用分页式管理)
段表:段号-段内页表起始位置
页表:页号-物理块号

每种内存管理方式的优点,以及管理的原理
分页式:提高了内存利用率
分段式:便于程序员/编译器的内存管理
段页式:集合了分页式和分段式的优点

8.缺页中断

内存只有8G,运行的程序和代码都是在内存中,意味着运行的程序多了,有可能内存就不够用了
磁盘分区有两种:交换分区/文件系统分区
交换分区:作为交换内存使用
当内存不够用的时候,这时候,其实内存中并不是所有的数据都是活跃数据;这时候系统则会根据一定的算法,将某块内存中的数据保存到磁盘的交换分区。腾出这块内存加载新数据。
但是每个进程的页表中记录了每一个虚拟地址对应的物理地址–如果某个虚拟页面的物理内存中的数据被交换出去了,保存到交换分区,则将这个页表项位置位缺页中断
等待下次这个进程要访问这个被交换出去的数据的时候(注意:这个数据当前没有在内存中–保存在交换分区中),触发缺页中断,重新从交换分区将数据交换回来

重要:什么样的数据在内存不够用的时候应该被交换出去?
LRU算法:一种内存置换算法–最久未使用(内存不够用时会将内存中最久未使用的数据拷贝到交换分区上,腾出内存空间)

八、总结

程序地址空间是什么–mm_struct
虚拟地址空间的作用:提高内存利用率;内存访问控制;提高进程独立性
虚拟地址到物理地址的映射算法:分页式/分段式/段页式
内存置换算法:为什么要内存置换,置换算法的思想

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值