Linux 【进程概念】

 💓博主CSDN主页:麻辣韭菜💓

⏩专栏分类:Linux初窥门径

🚚代码仓库:Linux代码练习🚚

🌹关注我🫵带你学习更多Linux知识
  🔝 

目录

1.前言

• 什么是操作系统 如何理解操作系统

•相信大家都听说过进程这个概念

•那进程又是什么?

2.冯诺依曼体系结构

3.操作系统(Operator System)

概念

设计OS的目的

定位

如何理解 "管理"

总结

系统调用和库函数概念

4.进程

基本概念

描述进程

查看进程

通过系统调用创建进程-fork初识

进程状态


1.冯诺依曼体系结构

什么是输入设备?

说人话就是键盘 网卡 磁盘 等。

存储器就是内存

输出设备?

显示器 网卡 磁盘 音响等。

那运算器和控制器又是什么?

cpu

那它们之间运转的流程又是怎么的?

输入设备的数据加载到内存 然后内存的数据给到cpu进行计算,计算完成后又返回给内存,内存里面的数据再输入到输出设备。

2.操作系统(Operator System)

概念

任何计算机系统都包含一个基本的程序集合,称为操作系统 (OS) 。笼统的理解,操作系统包括:
内核(进程管理,内存管理,文件管理,驱动管理)
其他程序(例如函数库, shell 程序等等)

设计OS的目的

与硬件交互,管理所有的软硬件资源
为用户程序(应用程序)提供一个良好的执行环境

定位

在整个计算机软硬件架构中,操作系统的定位是: 一款纯正的 搞管理 的软件

如何理解 "管理"

管理的例子
工作人员相互之间也是需要协同配合,要协同配合那就一种管理的方法,这个方法我们可以抽象成一种他们的内部管理系统。按照系统的流程各自干各自的事。
看懂了上面的图后我们就可以看操作的系统的抽象图
在C语言中,世界的万物一切皆对象
上面的硬件和内核还有系统程序等等,我们都可以用C语言的struck(结构体)描述成对象。
这些描述出来的结构体,我们就可以用数据结构(链表)组织起来,进行管理。

总结

六个字
先描述再组织。

系统调用和库函数概念

站在银行的角度来说银行是对所有人都是不信任的,只提供一个窗口来确保自己的安全。

所以在开发角度,操作系统对外会表现为一个整体,但是会暴露自己的部分接口,供上层开发使用,这部分

由操作系统提供的接口,叫做系统调用。
系统调用在使用上,功能比较基础,对用户的要求相对也比较高,所以,有心的开发者可以对部分系统
调用进行适度封装,从而形成库,有了库,就很有利于更上层用户或者开发者进行二次开发。

进程

基本概念

程序的一个执行实例,正在执行的程序等
内核观点:担当分配系统资源( CPU 时间,内存)的实体
说人话:那就是你写的代码程序已经加载到内存中,就叫做进程。
如果你还是不理解可以看下面这个图

用windows操作系统图形化界面可以一目了然。

描述进程

进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。
process control block)简称PCB,Linux 操作系统下的 PCB : task_struct
task_struct-PCB 的一种
Linux 中描述进程的结构体叫做 task_struct
task_struct Linux 内核的一种数据结构,它会被装载到 RAM( 内存 ) 里并且包含着进程的信息。
task_ struct 内容分类
标示符 : 描述本进程的唯一标示符,用来区别其他进程。
状态 : 任务状态,退出代码,退出信号等。
优先级 : 相对于其他进程的优先级。
程序计数器 : 程序中即将被执行的下一条指令的地址。
内存指针 : 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
上下文数据 : 进程执行时处理器的寄存器中的数据 [ 休学例子,要加图 CPU ,寄存器 ]
I O 状态信息 : 包括显示的 I/O 请求 , 分配给进程的 I O 设备和被进程使用的文件列表。
记账信息 : 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
其他信息

针对这个专门管理进程的结构体 那么操作系统是怎么管理它的?

操作系统(os)内对进程的控制十分复杂,一个PCB可能链接到多个数据结构上。

这个PCB本身自己管理是链表 在OS进程中又是队列这种结构。

结论:进程 = 可执行程序 + 内核数据结构(PCB)

查看进程

绿色方框的13976就是myproc这个进程的pid
在之前的命令加上它的pid就会出现一堆的你看不懂的 我们重点看 cwdexe
上图的 cwd 为什么叫当前进程工作目录 ?
一个代码在执行时 首先是要编译的(bin)编译完成后 运行 ->每个进程都会有一个属性,来保存自己所在的工作路径。
看懂上面的你就明白了 为什么在Linux下运行一个我们自己写的代码前面为什么要加 ./  ./不就是当前路径吗?

杀死进程

kill -9 你的进程的PID

我的进程是13976

命令:kill -9 13976

组织进程
可以在内核源代码里找到它。所有运行在系统里的进程都以 task_struct 链表的形式存在内核里。 感兴趣的家人们可以去Linux官网下载源代码看看

通过系统调用创建进程-fork初识

       

用vim编写上面这段代码 然后运行就会发现一个诡异事情。
我cout打印为什么会有两次?
按照以前的认知来说 只会执行一次。为什么会有两次?
调用fork这个函数创建一个子进程 ,那既然有了子进程那么就会有两个执行流,父子共享fork函数之后的代码,数据各自开辟一块空间
父子各执行一次所以就会打印两次。
调用fork一般都是用if else语句

进程状态

用一张图来看看进程的状态

看完上面的图是不是有点懵? 下面我给大家化繁为简。

新建:字面意思 一个进程被创建 但是没有执行

运行:task_struct PCB 结构体在运行队列中排队,就叫做运行态。
阻塞:进程因为等待某种条件就绪,而导致的一种不推进的状态 -- 进程卡住了
挂起:当内存不足的时候,OS通过适当的置换进程的代码和数据到磁盘,此时进程的状态就做挂起
阻塞挂起:进程正在等待某种资源 恰好内存不足了
就绪:其实和新建一样的 
就绪挂起:刚好被创建好 内存不足了
终止:进程退出(死亡)
为什么会有阻塞这个状态?
想想我们的世界的资源是不是有限的?所以在OS中资源也是有限的(不仅仅是cpu)。
上图只是调度队列的一种,操作系统不止一种队列  还其他硬件设备的调度队列所以会有阻塞  
这时cpu发现1这个pcb读取时间太长 cpu就会把它放在磁盘的等待队列里
下面我们来看看
(Linux 内核里,进程有时候也叫做任务)。
下面的状态在 kernel 源代码里定义:‘
看下图

脚本命令 while :; do ps axj | grep 你的可执行程序名字| grep -v grep; sleep 1; echo "************************" ; done

或者 while :; do ps axj | head -1 && ps axj | grep 你的可执行程序名字 | grep -v grep; sleep1;done
 

上面红色方块是S可是我的程序是运行的啊?为什么不是R?

那是因为我的程序有打印这段代码 显示器是外设设备 不要用你的感受去想象cpu的速度

当打印的字符要在显示器上显示时 是需要等待显示器的资源的 虽然这个速度很快 但是和cpu相比还是很慢 所以在等待队列里 我们执行代码查看这个状态时就是S+ 把查看进程这个命令停下来你去翻 肯定会有一个R

我现在要把它变成T状态。 命令 kill -19 + pid

kill -18 +pid //继续

问题 暂停和休眠 有什么区别?

暂停 就是单纯的暂停 没有资源的等待 休眠 等待资源 

暂停的例子:调式代码

总结:
R 运行状态( running : 并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列
里。
S 睡眠状态( sleeping): 意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠
D 磁盘休眠状态( Disk sleep )有时候也叫不可中断睡眠状态( uninterruptible sleep ),在这个状态的
进程通常会等待 IO 的结束。
T 停止状态( stopped ): 可以通过发送 SIGSTOP 信号给进程来停止( T )进程。这个被暂停的进程可
以通过发送 SIGCONT 信号让进程继续运行。
X 死亡状态( dead ):这个状态只是一个返回状态,你不会在任务列表里看到这个状态。
还有一个状态是僵尸状态 这个状态下次环境变量在细说 关注我 带你学习更多Linux知识

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值