Linux进程概念

一 .冯诺依曼体系结构

CPU:中央处理器

在这里插入图片描述

input + output = IO , IO分为本地IO和网络IO
①输入设备:键盘,磁盘,网卡,显卡,话筒,摄像头等
②输出设备:显示器,磁盘,网卡,显卡,音响等
③存储器(内存),离CPU越近,效率越高,单价越贵
④运算器&&控制器(CPU)

输入输出设备可以叫做外设,任何外设,基本优先和内存打交道!CPU,在数据层面上,也直接和内存打交道
在这里插入图片描述

二 .操作系统

启动(软件数据与代码加载到内存中)的操作系统,才有意义
①是什么?
一款专门针对软硬件进行管理工作的软件

②为什么要用OS?
对下:管理好软硬件资源
对上:给用户提供稳定,高效,安全的运行环境
通过对下的方式,完成对上的目的

③OS怎么办到的?
管理! (本质:先描述再组织!)
为什么要有pcb?先描述再组织
在这里插入图片描述
OS不信任任何用户 , OS禁止直接访问,用户通过 系统调用接口 进行对OS的操作
接口:说白了就是函数(C语言写的函数)-> C函数
在这里插入图片描述

三 .进程

1.进程和程序

在任何进程形成之时,操作系统要为该进程创建PCB,进程控制块
-> 先描述,在组织

OS上面,PCB,进程控制块,就是一个结构体类型
在Linux系统中 ,PCB -> struct task_struct{ //进程的所有属性 }
查看进程

在这里插入图片描述

曾经我们所有的启动程序的过程,本质都是在系统上面创建进程!
1 . 在这里插入图片描述
有了进程控制块,所有的进程管理任务与进程对应的程序毫无关系!!!与进程对应的内核创建的该进程的PCB强相关
test_struct
在这里插入图片描述
结论:
进程和程序的区别是,进程 = 程序 + 操作系统维护进程的相关数据结构!

2 .PCB的内部构成

① 标示符
在这里插入图片描述
在这里插入图片描述
杀掉进程
在这里插入图片描述
ppid 是父进程
在这里插入图片描述
②小tip(拿到程序的退出码):
echo $? :输出最近执行命令的退出码
在这里插入图片描述
在这里插入图片描述
③优先级
先后顺序的问题

④内存指针
可以帮我们找到代码和数据

⑤记账信息:
可能包括处理器时间总和等

⑥理解上下文
进程执行时处理器中寄存器里的数据
通过上下文,我们能感受到进程是切换的
在这里插入图片描述

3 .查看进程的方式二

ls /proc
ls -d /proc -l
cwd(current work directory )
在这里插入图片描述
创建进程
在这里插入图片描述
测试结果是两个竟然都跑了
在这里插入图片描述

4 .如何理解fork创建子进程

1 .fork的本质是创建进程,也就是说系统里会多一个进程 - > 与进程相关的内核数据结构(linux中是task_struct) + 进程代码和数据 系统里会多一份

默认情况下,创建出的子进程的代码和数据会“继承”父进程的代码和数据
内核数据结构task_struct也会以父进程的作为模板,初始化子进程的task_struct

fork之后,子父进程的代码是共享的 ->不可以修改的
数据在默认状态下也是共享的,不过需要考虑修改的情况!(通过写时拷贝来完成进程数据的独立性)
总结:进程都是由独立性的
在这里插入图片描述
2 .我们创建子进程,为的就是和父进程进行一样的操作吗?
当然不是,我们可以通过if else 使得子父进程进行不同的操作

fork的返回值如果小于0时,那么就是失败的,成功的状态下,子进程返回的 id值是0 , 父进程返回的是子进程的pid

return的时候,会发生写入操作,发生了写时拷贝

fork之后,子父进程谁先运行?不确定,要按照调度器来决定
在这里插入图片描述

5 .进程的状态

针对linux这一款特定的OS, 内部由七种状态
进程的状态放在哪里?linux中放再task_struct(PCB)中
进程状态的意义是什么:方便OS快速判断进程,完成特定的功能,比如说调度,本质是一种分类

static const char * const task_state_array[] = {
"R (running)", /* 0 */
"S (sleeping)", /* 1 */
"D (disk sleep)", /* 2 */
"T (stopped)", /* 4 */
"t (tracing stop)", /* 8 */
"X (dead)", /* 16 */
"Z (zombie)", /* 32 */
};

所谓的进程,在运行状态需要的条件下,有可能处在不同的队列中
调度的本质是一种分类,在不同的队列中,所处的状态是不一样的

①R状态(运行状态)
运行状态就是一定在占用cpu吗,不一定!!!
在这里插入图片描述

②S状态(sleeping)浅睡状态
D状态(disk sleep)不可打断睡眠 或 深度睡眠

我们把运行状态中的task_struct(run_queue),放到等待队列中,叫做挂起等待
把等待队列放到运行状态中,叫做唤醒工程!

S状态和D状态的区别:S可以被OS随时被杀掉,D状态不可以被OS状态杀掉

在这里插入图片描述
③ T状态(stopped)
t(tracing stopped) 在debug的时候

④X(dead)死亡状态
回收进程资源 = 进程相关的代码和数据结构 + 你的代码和数据

Z(zombie)僵尸状态
为什么要有僵尸状态?
辨别退出死亡的原因!!
系统会将进程退出的信息和数据写在task_struct这个pcb中,供系统和父进程来进行读取, 这种test_struct就叫做Z状态

如果父进程没有检测或回收进程,该进程就进入Z
如何来看一个Z状态的进程
在这里插入图片描述
在这里插入图片描述

学习kill命令
在这里插入图片描述
在这里插入图片描述
S+的状态就是在前台运行
前台运行状态下在程序中输入指令(whoami,pwd等)都是不起作用的

./myproc & 在程序后面加一个&就是后台程序
S状态是在后台运行,用ctrl c 是杀不掉的, 必须要用kill -9 命令来进行杀掉
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

GracefulBlack

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

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值