进程初接触(进程概念)

本文深入探讨了进程的概念,从冯诺依曼体系结构出发,讲解了操作系统的角色,特别是进程如何由task_struct结构体描述。讨论了进程的创建、状态、内存管理和地址空间,以及僵尸进程和孤儿进程的问题。此外,还提到了环境变量及其作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

进程概念:
1.冯诺依曼体系结构
2.操作系统概念
3.进程概念
内核怎么描述进程(task_struct),创建子进程,写时拷贝,进程虚拟地址空间

冯诺依曼体系结构

在这里插入图片描述
第一个思想:
所有的数据在内存中存储的时候,采用2进制的方式进行存储
中央处理器的数据来源于存储器
《深入理解计算机系统》:(cpu <-- 寄存器 <— 缓存 <— 内存)
操作系统
1.操作系统本身就是一个软件,管理计算机的软硬件资源;
2.操作系统 = 操作系统内核 + 一组应用
在这里插入图片描述
用户调用库函数或者系统调用交给操作系统内核,操作系统内核操纵驱动程序或者硬件资源
管理 = 描述 + 组织
在这里插入图片描述
进程概念
操作系统是通过结构体(task_struct)来描述进程,通过双向链表来组织进程
1.进程和程序的区别
程序:程序就是一个文本文件,静态的
进程:程序运行起来的一个实例
从内核当中分析:
在操作系统内核当中,为一个进程创建了一个struct task_struct的结构体,或者称之为进程控制块(ProcessCtrlBlock)–>简称(PCB)
2.了解task_struct结构体的内容
struct task_struct
{
进程标识符(PID):在当前操作系统当中唯一标识当前进程
内存指针:指向程序的地址空间
}
在这里插入图片描述

拓展三个命令:
ps aux:查看当前操作系统当中进程的信息
ps aux | grep “xxx”:在ps aux的结果当中过滤字符串“xxx”
find:在操作系统中查找一个文件
find[path] -name [filename]
/usr/src/kernels/3.10.0-957.el7.x86_64/include/linux/sched.h
拓展:
在vim中查找一个字符串
/s
4核8C:4个物理cpu,8个逻辑cpu
struct task_struct:
进程标识符(PID):别名进程号,在当前操作系统当中不会重复
内存指针:指向程序的地址空间
进程状态:
运行状态:正在cpu上面进行运算
就绪状态:程序已经准备好,在就绪队列当中等待获取cpu资源
阻塞状态:等待IO就绪(可执行程序需要等待输入设备提供数据)
在这里插入图片描述
并发执行(可执行程序1和2):多个程序使用同一个cpu,每个进程都独占cpu一小会,然后让出cpu资源,供其他进程执行
并行执行(可执行程序1和3或者2和3):多个进程,在同一时刻,每个进程都占用一个cpu进行运算
具体的进程状态
R:运行状态
S:可中断睡眠状态
D:磁盘睡眠状态,不可以被打断
T:暂停状态
前台进程:“+”代表前台进程
后台进程:没有“+”代表后台进程
t:跟踪状态—>gdb调试程序的时候可以发现程序是t状态
X:死亡状态
Z:僵尸状态在这里插入图片描述
提示:fg可以将最后一次放到后台的程序恢复到前台
./[filename] &:直接将程序放到后台执行,但是占用终端
task_struct—>至关重要
程序计数器:保存进程即将要执行的下一条指令
上下文数据:保存上一次执行的时候,寄存器当中的值
1.进程在执行的时候,进程会进行切换,切换是操作系统调度的
2.在被切换出去的时候,该进程当中的程序计数器会保存程序要执行的下一条指令,上下文信息会保存寄存器当中的值
3.再次切换回来的时候,通过程序计数器和上下文信息来恢复之前的场景,进行运算
IO信息&记账信息
当前进程启动时间
当前进程占用cpu的时间
在这里插入图片描述
打开的文件信息
ll /proc/[PID]/fd
进程优先级:
PR(new) = PR(old) + NI(2)
PR越大优先级越低
top命令可以查看系统资源消耗情况
在这里插入图片描述

组织:内核使用双向链表组织task_struct(PCB)
创建子进程
在这里插入图片描述
创建子进程:让已经启动的程序调用函数,来创建新的进程
#include <unistd.h>
pid_t fork(void);
fork函数:
有返回值:
失败:返回小于0
成功:返回两次
父进程当中返回大于0的数字
子进程当中返回等于0
通过ps -ef可以查看进程的pid以及进程的父进程的pid,从而确定哪一个进程是子进程,哪一个进程是父进程
通过终端启动一个前台程序,其父进程是bash(命令行解释器)
1.父进程调用fork函数,创建子进程,子进程的PCB(task_struct)是拷贝父进程的
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200729222606321.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0FsaWNlX2xpaGFv,size_16,color_FFFFFF,t_70
一旦创建出来子进程,父进程和子进程就是抢占式执行
pid_t getpid(void);谁调用获取谁的进程pid
pid_t getppid(void);谁调用获取谁的父进程pid

僵尸状态&僵尸进程
在这里插入图片描述

1.创建子进程代码,pstack命令可以查看程序的调用堆栈
2.原理:子进程先于父进程退出,父进程来不及回收子进程的资源,导致子进程变成僵尸进程,而子进程所对应的task_struct还在内核当中,双向链表管理着。对于子进程而言,程序是已经退出了,并不能执行用户写的代码了;子进程的状态就会变成Z状态,刀枪不入!!!
3.产生僵尸进程之后,僵尸进程对应的进程状态是Z,并且使用kill命令或者强杀命令kill -9,都结束不了僵尸进程
4.僵尸进程的危害
产生僵尸进程之后,僵尸进程是不能被强杀杀死的(僵尸进程已经死了),意味着在操作系统内核双向链表还维护着僵尸进程的task_struct。内核维护这样的结构体,是需要耗费内存的,程序员还结束不掉僵尸进程,操作系统就内存泄漏了。
5.如何预防僵尸进程的产生
5.1子进程不要先于父进程退出,—不可取
5.2进程等待 — 可取
5.3可以将父进程kill掉,然后让僵尸进程被1号进程所领养,1号进程回收僵尸进程的资源—可杀死但是也不太可取(杀死了父进程)
孤儿进程
1.原理:父进程先于子进程退出,子进程会被1号进程所领养,1号进程被称为init进程。1号进程会在子进程退出的时候,回收子进程的退出信息,防止子进程变成僵尸进程
2.注意:
孤儿进程不是一种进程状态!!而是一种进程种类的名称

环境变量
1.环境变量是用来定义操作系统运行环境的一些参数
问题:为什么ls程序可以在任意程序下运行,而我们编译出来的代码,只能在当前编译出来的目录下运行
2.常见的环境变量
HOME:保存用户家目录的环境变量
SHELL:保存当前使用的命令行解释器
PATH:保存可执行程序路径的环境变量
/usr/lib64/qt3.3/bin
/usr/local/bin
/usr/bin
/usr/local/sbin
/usr/sbin
/home/lihao/.local/bin
/home/lihao/bin
LD_LIBRARY_PATH:程序运行时依赖的库文件的搜索路径的环境变量
LD_LIBRARY_PATH环境变量:会让操作系统搜索可执行程序依赖的动态库的路径,但是,并不是在编译阶段就起效果。在编译阶段,是需要使用-L选项,指定依赖库的路径;
3.查看环境变量
echo [ 环 境 变 量 名 称 ] 4. 新 增 环 境 变 量 的 值 e x p o r t : 可 以 更 改 或 者 增 加 环 境 变 量 的 值 万 能 公 式 : e x p o r t [ 环 境 变 量 名 称 ] = [环境变量名称] 4.新增环境变量的值 export:可以更改或者增加环境变量的值 万能公式:export [环境变量名称]= []4.exportexport[]=[环境变量名称]:[新增加的环境变量的值]
eg:
export PATH=$PATH:/home/zhangsan
注意:在命令行当中使用export是临时生效的做法,只在当前终端有效,当前终端关闭之后,重新打开也没有之前设置的值了;
永久生效:将环境变量的值写道下面的文件当中
普通用户
~/.bashrc 或者 ~/bash_profile
系统环境变量 —强调普通用户的环境变量不要往/etc/bashrc这个文件下添加
/etc/bashrc
source:告诉操作系统内核重新加载某一个文件
source[环境变量文件]:使新增加的环境变量生效

进程的虚拟地址空间
在这里插入图片描述
分页式:
计算虚拟地址通过页表映射到那一块物理内存的地址上
1.进程虚拟地址空间被分成了一页一页的大小物理内存被分成了一块一块的大小,一页的大小=一块的大小=4096k
2.页表维护了页和块的关系在这里插入图片描述
虚拟地址 = 页号+页内偏移
页号对应块号+页内偏移找到物理内存空间
页号=虚拟地址/块的大小(4096)
页内偏移 = 虚拟地址%块的大小
块的起始位置 = 块号*块大小
物理地址 = 块的起始位置+页内偏移
分段式:
虚拟地址的构成 = 段号 + 段内偏移
在这里插入图片描述
段页式:
虚拟地址构成 = 段号 + 页号 +页内偏移
在这里插入图片描述
1.通过段号找到页的起始位置
2.通过页的起始位置,找到对应的页表结构
3.通过页号,找到对应的块号,通过块号,计算出块的起始地址
4.块的起始地址加上页内偏移计算出物理地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值