💓博主优快云主页:麻辣韭菜💓
⏩专栏分类:Linux初窥门径⏪
🚚代码仓库:Linux代码练习🚚
🌹关注我🫵带你学习更多Linux知识
🔝
目录
1.前言
• 什么是操作系统 如何理解操作系统
•相信大家都听说过进程这个概念
•那进程又是什么?
4.进程
1.冯诺依曼体系结构
什么是输入设备?
说人话就是键盘 网卡 磁盘 等。
存储器就是内存
输出设备?
显示器 网卡 磁盘 音响等。
那运算器和控制器又是什么?
cpu
那它们之间运转的流程又是怎么的?
输入设备的数据加载到内存 然后内存的数据给到cpu进行计算,计算完成后又返回给内存,内存里面的数据再输入到输出设备。
2.操作系统(Operator System)
概念
任何计算机系统都包含一个基本的程序集合,称为操作系统 (OS) 。笼统的理解,操作系统包括:内核(进程管理,内存管理,文件管理,驱动管理)其他程序(例如函数库, shell 程序等等)
设计OS的目的
与硬件交互,管理所有的软硬件资源为用户程序(应用程序)提供一个良好的执行环境
定位
在整个计算机软硬件架构中,操作系统的定位是: 一款纯正的 “ 搞管理 ” 的软件
如何理解 "管理"

工作人员相互之间也是需要协同配合,要协同配合那就一种管理的方法,这个方法我们可以抽象成一种他们的内部管理系统。按照系统的流程各自干各自的事。看懂了上面的图后我们就可以看操作的系统的抽象图

在C语言中,世界的万物一切皆对象上面的硬件和内核还有系统程序等等,我们都可以用C语言的struck(结构体)描述成对象。这些描述出来的结构体,我们就可以用数据结构(链表)组织起来,进行管理。
总结
六个字先描述再组织。
系统调用和库函数概念
站在银行的角度来说银行是对所有人都是不信任的,只提供一个窗口来确保自己的安全。
所以在开发角度,操作系统对外会表现为一个整体,但是会暴露自己的部分接口,供上层开发使用,这部分
由操作系统提供的接口,叫做系统调用。系统调用在使用上,功能比较基础,对用户的要求相对也比较高,所以,有心的开发者可以对部分系统调用进行适度封装,从而形成库,有了库,就很有利于更上层用户或者开发者进行二次开发。
进程
基本概念
程序的一个执行实例,正在执行的程序等内核观点:担当分配系统资源( CPU 时间,内存)的实体说人话:那就是你写的代码程序已经加载到内存中,就叫做进程。如果你还是不理解可以看下面这个图
用windows操作系统图形化界面可以一目了然。
描述进程
进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。( process control block)简称PCB,Linux 操作系统下的 PCB 是 : task_structtask_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就会出现一堆的你看不懂的 我们重点看 cwd 和 exe


上图的 cwd 为什么叫当前进程工作目录 ?一个代码在执行时 首先是要编译的(bin)编译完成后 运行 ->每个进程都会有一个属性,来保存自己所在的工作路径。
看懂上面的你就明白了 为什么在Linux下运行一个我们自己写的代码前面为什么要加 ./ ./不就是当前路径吗?
杀死进程
kill -9 你的进程的PID
我的进程是13976
命令:kill -9 13976
可以在内核源代码里找到它。所有运行在系统里的进程都以 task_struct 链表的形式存在内核里。 感兴趣的家人们可以去Linux官网下载源代码看看
通过系统调用创建进程-fork初识

我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知识