【Linux】进程轻松入门

news2024/11/18 23:28:25

目录

一, 冯* 诺依曼体系结构

1,存储结构

​编辑

二, 操作系统 

1,概念

2,设计OS的目的

3,定位

4,如何理解 "管理"

5, 总结 

三,进程

1. 概念

 那么如何区分进程  & 程序?

2. PCB —— 描述进程

3. 组织进程

补充: cwd

 4.  task_struct ——PCB

 (1) PID——标识符

5.父子进程 

补充: fork()函数

fork函数——if分流

父子进程——各自优先级

6. 进程状态【Linux操作系统】

1. 新建:

2. 运行状态:

3. 阻塞:

4. 挂起:

6. liunx内核中的进程状态 

(1) S睡眠状态(sleeping):

 (2) R运行状态(running):

(3) D磁盘休眠状态(Disk sleep):

(4) T停止状态(stopped):

T 区别于 S:

(5) X死亡状态(dead):

(6) Z僵尸状态:

僵尸进程的危害

(7) 孤儿进程

 7. 进程优先级

修改优先级


 

 

一, 冯* 诺依曼体系结构

1,存储结构

         我们知道一个程序的执行速度,需要数据的输入输出。那么如果CPU直接与输入设备进行交互,那么会是这样的情况,输入设备输入10s的数据,CPU处理花了1ms,然后输出又花了10s,这样会导致机器性能很差;

而冯洛依曼想到了用内存与CPU打交道,这样就变成了4秒的数据输入,1ms的处理,4秒的输出变相的提高了计算机效率

 

举一个例子:我与一个老表进行微信交流。他们之间的数据流动流程图,如下:

二, 操作系统 

1,概念

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

2,设计OS的目的

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

3,定位

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

4,如何理解 "管理"

管理步骤:
(1.) 描述被管理对象
(2.) 组织被管理对象

关于操作系统,银行例子:

5, 总结 

  操作系统就是给用户提供一个安全,稳定,简单的执行环境

1. 操作系统管理:先描述,再组织

2. 操作系统对外服务,是通过提供:系统调用接口 

三,进程

1. 概念

课本概念:程序的一个执行实例,正在执行的程序等
内核观点:担当分配系统资源(CPU时间,内存)的实体。

(其实,我们启动一个软件,本质上是创建一个进程; 并且在linux中输入一个命令,在系统层面创建了一个进程)  

 那么如何区分进程  & 程序?

问: 一个系统中能存在大量进程吗? 答案是:可以的 ;

当大量进程进入内存,CPU需要对进程优先级进行排序,而它做不到 ,它只能读数据,那么这个时候就需要对进程进行管理,那么我们如何创建进程?

1. 先描述   (通过结构体(PCB),描述进程属性块)
2. 再组织     (通过数据结构,如链表,顺序表,红黑树等,将进程组织起来)

那么我们开始来管理进程:

2. PCB —— 描述进程

         进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。课本上称之为PCB(process control block),Linux操作系统下的PCB是: task_struct

在windows中,PCB就是一个表示进程模块的结构体

在Linux中,PCB的具体是 struct  task_struct{......// 进程的所有属性}

task_struct 是 PCB的一种 ,在Linux中描述进程的结构体叫做task_struct。task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息。

3. 组织进程

可以在内核源代码里找到它。所有运行在系统里的进程都以task_struct链表的形式存在内核里。 

那我们如何查看一个进程? 

(1). 我们制作一个死循环程序,然后执行程序。

 

(2)再打开另一个窗口查看进程。

指令:ps  axj  |  grep  "需要查看的程序" 

 回到死循环程序,我们通过ctrl +  c退出死循环程序,再次检测可以发现,死循环进程消失。

同样的我们可以通过输入top命令,而这就是Linux下的任务管理器 

补充: cwd

输入   ls   /proc    // 功能是:通过文件形式来展示进程

 我们随便进入一个进程,查看里面文件属性,这里就有我们要找的cwd文件:

 转成详细页:ls /proc/13712     // 13712是Test进程的PID

那这些PPID,PID是什么玩意儿,下面我们会进行分析。

 4.  task_struct ——PCB

 前面我们可以看到有这些类

  • 标示符 (PID):  描述本进程的唯一标示符,用来区别其他进程
  • 状态:  任务状态,退出代码,退出信号等。
  • 优先级:  相对于其他进程的优先级。(权限决定能与不能,优先级是能后的顺序)
  • 程序计数器:  程序中即将被执行的下一条指令的地址。(所以程序计数器是不断被修改的)
  • 内存指针:  包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针。(可以通过PCB找到进程中的数据
  • 上下文数据:   进程执行时处理器的寄存器中的数据。   [休学例子,要加图CPU,寄存器]
  • IO状态信息: 包括显示的I/O请求,分配给进程的IO设备和被进程使用的文件列表。
  • 记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
  • 其他信息

 (1) PID——标识符

功能: 标示符 (PID):  描述本进程的唯一标示符,用来区别其他进程

 那么我们怎么在main函数获取特定的进程的PID呢?

getpid()  // 获取本进程PID

getppid()   // 获取父进程PID

 需要包含系统函数头文件: #include <sys/types.h>  

我们在源码中,运用getpid()函数,获取本程序的PID 

结果如图:

这里除了 在程序运行时ctrl + c可以终止进程;也可以通过 输入命令  kill -9  PID  结束进程。 这里不对kill进行讲解。

5.父子进程 

补充: fork()函数

功能:在fork函数调用处,创建一个子进程独立于父进程,fork之后代码父子共享

返回值:1. 在父进程中返回子进程的PID; 2. 在子进程返回 0 ;  3. 失败返回 -1

问:为啥会有两个返回值呢?

答:fork()函数中,父子进程各自执行自己的return语句

 

fork函数——if分流

 我们知道父子进程公用,fork函数之后的代码。可父子进程大多都是运行不同的代码,那我们如何进行分开呢?

利用fork的返回值进行if  分流:

id 在父进程里面是 子进程的PID; 在子进程里面是 0 。

关于fork函数内部逻辑:

创建一个进程,内部属性以父进程内部属性为模板。

父子进程——各自优先级

问: 父子进程中,先执行父进程,再执行子进程吗?

不一定

原因:CPU可能运行一个父进程10ms后,先不执行了,再次入运行队列,而这时子进程就在执行。关于谁先运行,不一定,这个取决于操作系统的调度器决定

6. 进程状态【Linux操作系统】

1. 新建

字面意思。 就是给一个程序创建有一个进程。

2. 运行状态

task_struct在运行队列中开始排队时,就是运行状态。

3. 阻塞

等待非CPU资源,叫做阻塞状态。

比如:我们进行scanf / cin 进行键盘输入时,在等待键盘数据录入,这就是一个阻塞状态。

4. 挂起

当内存不足时,OS适当地置换进程的代码和数据到磁盘,此时进程叫做挂起状态。

6. liunx内核中的进程状态 

为了弄明白正在运行的进程是什么意思,我们需要知道进程的不同状态。一个进程可以有几个状态(在Linux内核里,进程有时候也叫做任务。)

(1) S睡眠状态(sleeping):

意味着进程在等待事件完成  (这里的睡眠有时候也叫做可中断睡眠——可以通过kill -2 指令,中断S,为T状态

对应阻塞状态 

输入: while :; do  ps   axj |  head -1 && ps axj  | grep  运行文件名  |  grep -v grep ;  sleep 1;  done    // 可查看最新的进程运行状况,周期为1秒

 (2) R运行状态(running):

并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里。

 以上面代码为例,将cout代码注释掉,这样就不在占用输出设备资源了,则一直都在R状态。

 细节:我们发现状态栏中有S+,R+ 其中"+"又是什么意思呢?     “+”这里的含义是一个前台进程,其结果会占用我们与bush的聊天界面,我们无法输入指令,可以ctrl +  c 退出;同理,没有“+”的状态为后台进程,不会占用聊天框,我们可以继续输入指令。 但启动程序时要 ./程序    &,它会返回其PID,不用时kill -9  PID 杀死即可。

(3) D磁盘休眠状态(Disk sleep):

有时候也叫不可中断睡眠状态(uninterruptible sleep)——深度睡眠,在这个状态的进程通常会等待IO的结束。(不可被被动中断,kill都不能杀掉,除非拔电源

(4) T停止状态(stopped):

可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行。(比如:gdb调试

 

kill -19   // 暂停进程

kill -18   // 继续进程

T 区别于 S:

 睡眠进程是等待非CPU资源, 对应的是阻塞状态。暂停状态,原先是运行状态,没有等待资源,仅仅是暂停了。

(5) X死亡状态(dead):

这个状态只是一个返回状态,你不会在任务列表里看到这个状态.(当大量进程结束时,操作系统忙不过来,那这时进程就会标记为X进程,随时准备被回收)

(6) Z僵尸状态:

一个进程已经退出,但还不能被OS回收,处于一个等待被检测的状态,叫做僵尸状态。

那为啥要有这种状态?  为了状态保持,让父进程或者OS来检测。 (所谓的保持:指代码和数据被回收了,进程的PCB还保留着。

僵尸进程的危害

  1. 进程的退出状态必须被维持下去,因为他要告诉关心它的进程(父进程),你交给我的任务,我办的怎么样了。可父进程如果一直不读取,那子进程就一直处于Z状态?是的!
  2. 维护退出状态本身就是要用数据维护,也属于进程基本信息,所以保存在task_struct(PCB)中,换句话说,Z状态一直不退出,PCB一直都要维护?是的!
  3. 那一个父进程创建了很多子进程,就是不回收,是不是就会造成内存资源的浪费?是的!   因为数据结构对象本身就要占用内存,想想C中定义一个结构体变量(对象),是要在内存的某个位置进行开辟空间!
  4. 内存泄漏?是的

 

(7) 孤儿进程

概念:

父进程如果提前退出,那么子进程后退出,进入Z之后,那该如何处理呢? 父进程先退出,子进程就称之为“孤儿进程”孤儿进程被1号init进程领养,当然要有init进程回收喽

我们简单创建一个父进程先退出,子进程后退出的场景。发现:

 

 

 7. 进程优先级

 概念:

cpu资源分配的先后顺序,就是指进程的优先权(priority)。优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用,可以改善系统性能。
还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整体性能。

查看优先级,输入:

ps   -al     // 会显示机器所以进程 

我们很容易注意到其中的几个重要信息,有下:
UID : 代表执行者的身份
PID : 代表这个进程的代号
PPID :代表这个进程是由哪个进程发展衍生而来的,亦即父进程的代号
PRI :代表这个进程可被执行的优先级,其值 越小越早被CPU执行
NI :代表这个进程的nice值, 优先级的修正值,范围是-20到19,共40个级别。 (每次设置nice值时,PRI都是默认值一般80)

Linux优先级具体做法:

优先级 =  老的优先级(PRI)   +  nice值(NI

修改优先级

输入: top   指令; 进入top后按“r”–>输入进程PID–>输入nice 

 有时需要提高权限,sudo一下即可(前提是:设置过信任用户)

结语

本小节就到这里了,感谢小伙伴的浏览,如果有什么建议,欢迎在评论区评论;如果给小伙伴带来一些收获请留下你的小赞,你的点赞和关注将会成为博主创作的动力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/813556.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C语言所有操作符详解2】

目录 条件操作符 逗号表达式 下标引用、函数调用和结构成员 [ ] 下标引用操作符 ( ) 函数调用操作符 访问一个结构的成员 表达式求值 隐式类型转换 隐式类型转换 整型提升 整型提升的意义: 如何进行整型提升呢? 算术转换 操作符的属性 操作符优先级 …

Redis系列一:介绍

介绍 The open source, in-memory data store used by millions of developers as a database, cache, streaming engine, and message broker. 相关资源 Redis 官网&#xff1a;https://redis.io/ 源码地址&#xff1a;https://github.com/redis/redis Redis 在线测试&#…

RS232转ETHERCAT连接ethercat通讯过程描述

我们将为大家介绍一款强大的设备——捷米JM-ECT-RS485/232通讯网关。这是一款自主研发的ETHERCAT从站功能的网关&#xff0c;它能够将ETHERCAT网络和RS485或RS232设备无缝连接。 这款网关在ETHERCAT总线和RS485或RS232总线中均能发挥主站或从站的作用。它的最大特点就是解决了…

企业情报管理系统

软件简介 基于 SpringBoot 的权限管理系统&#xff0c;易读易懂、界面简洁美观。 核心技术采用 Spring、MyBatis、Shiro 没有任何其它重度依赖。直接运行即可。 平台简介 企业情报管理系统&#xff0c;主要包括情报分析、文章情报、报告情报、数据情报、数据管理、AI管理、平…

动态规划 丑数(三指针 谁先创造谁先功德++)

无语这是medium题目吗 先放暴力解法 反正超时 无法ac本题 2, 3, 5 这前 3 个丑数一定要乘以其它的丑数&#xff0c; 所得的结果才是新的丑数 合并过程中重复解的处理 nums2, nums3, nums5 中是存在重复的解的&#xff0c; 例如 nums2[2] 32, nums3[1] 23 都计算出了 6 这个结…

200+行代码写一个简易的Qt界面贪吃蛇

照例先演示一下&#xff1a; 一个简单的Qt贪吃蛇&#xff0c;所有的图片都是我自己画的&#xff08;得意&#xff09;。 大致的运行逻辑和之前那个200行写一个C小黑窗贪吃蛇差不多&#xff0c;因此在写这个项目的时候&#xff0c;大多情况是在想怎么通过Qt给展现出来。 背景图…

【Minio中间件】上传图片并Vue回显

流程&#xff1a; 目录 1.文件服务器Minio的安装 1.1 下载Minio安装后&#xff0c;新建1个data文件夹。并在该安装目录cmd 敲命令。注意不要进错目录。依次输入 1.2 登录Minio网页端 1.3 先建1个桶&#xff08;buckets&#xff09;&#xff0c;点击create a bucket 2. Spr…

使用docker部署springboot微服务项目

文章目录 1. 环境准备1. 准备好所用jar包项目2.编写相应的Dockerfile文件3.构建镜像4. 运行镜像5. 测试服务是否OK6.端口说明7.进入容器内8. 操作容器的常用命令 1. 环境准备 检查docker是否已安装 [rootlocalhost /]# docker -v Docker version 1.13.1, build 7d71120/1.13.…

LabVIEW开发航天器动力学与控制仿真系统

LabVIEW开发航天器动力学与控制仿真系统 计算机仿真是工程设计和验证的非常有用的工具。它节省了大量的时间、金钱和精力。航天器动力学与控制仿真系统由LabVIEW程序开发&#xff0c;它是模拟航天器等动态系统的有用工具。还可轻松与硬件连接并输出真实信号。 项目采用系统工…

《Kali渗透基础》11. 无线渗透(一)

kali渗透 1&#xff1a;无线技术特点2&#xff1a;IEEE 802.11 标准2.1&#xff1a;无线网络分层2.2&#xff1a;IEEE2.3&#xff1a;日常使用标准2.3.1&#xff1a;802.112.3.2&#xff1a;802.11b2.3.3&#xff1a;802.11a2.3.4&#xff1a;802.11g2.3.5&#xff1a;802.11n …

一维(1D)CNN模型下轴承故障诊断(Python,TensorFlow框架下,很容易改为其它模型,解压缩后可以直接运行,无需修改任何目录)

1.数据集 使用凯斯西储大学轴承数据集&#xff0c;一共有4种负载下采集的数据&#xff0c;每种负载下有10种 故障状态&#xff1a;三种不同尺寸下的内圈故障、三种不同尺寸下的外圈故障、三种不同尺寸下的滚动体故障和一种正常状态。 2.模型&#xff08;1DCNN&#xff09; 使…

【Git】git reset 版本回退 git rm

前言 在日常开发时&#xff0c;我们经常会需要撤销之前的一些修改内容或者回退到之前的某一个版本&#xff0c;这时候reset命令就派上用场了 git reset 用法1——所有文件回退到某个版本 1、使用git reflog查看要回退的commit对象 2、使用git reset [-- hard/soft /mixed] …

26 用lsqnonlin求解最小二乘问题(matlab程序)

1.简述 函数语法 x lsqnonlin(fun,x0) 函数用于&#xff1a; 解决非线性最小二乘(非线性数据拟合)问题 解决非线性最小二乘曲线拟合问题的形式 变量x的约束上下限为ub和lb&#xff0c; x lsqnonlin(fun,x0)从x0点开始&#xff0c;找到fun中描述的函数的最小平方和。函数fu…

【前端知识】React 基础巩固(三十九)——React-Router的基本使用

React 基础巩固(三十九)——React-Router的基本使用 一、Router的基本使用 Router中包含了对路径改变的监听&#xff0c;并且会将相应的路径传递给子组件。 Router包括两个API&#xff1a; BrowserRouter使用history模式 HashRouter使用hash模式&#xff08;路径后面带有#号…

Debeizum 增量快照

在Debeizum1.6版本发布之后&#xff0c;成功推出了Incremental Snapshot&#xff08;增量快照&#xff09;的功能&#xff0c;同时取代了原有的实验性的Parallel Snapshot&#xff08;并行快照&#xff09;。在本篇博客中&#xff0c;我将介绍全新快照方式的原理&#xff0c;以…

S32K14x FlexNVM介绍(flexible Non-volatile memory)

S32K14x是一款NXP推出的32位汽车级微控制器&#xff0c;其存储结构相对复杂。下面是对其存储结构的中文介绍&#xff1a; S32K14x采用了分层存储结构&#xff0c;包括Flash存储器和SRAM存储器。Flash存储器用于存储程序代码和常量数据&#xff0c;而SRAM存储器用于存储变量数据…

常见的几种排序

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C &#x1f525;座右铭&#xff1a;“不要等到什么都没有了&#xff0c;才下…

【分布式系统】分布式系统的8个谬误

网络可靠 对于分布式系统来说&#xff0c;网络、计算、存储是三大基石&#xff0c;系统之间进行拆分隔离之后&#xff0c;那么必定存在网络通讯&#xff0c;而网络是最不可靠的。 不管是从硬件层面还是软件层面来说&#xff0c;网络是不可靠的。&#xff08;断电、配置错误、ID…

ChatGPT结合知识图谱构建医疗问答应用 (一) - 构建知识图谱

一、ChatGPT结合知识图谱 在本专栏的前面文章中构建 ChatGPT 本地知识库问答应用&#xff0c;都是基于词向量检索 Embedding 嵌入的方式实现的&#xff0c;在传统的问答领域中&#xff0c;一般知识源采用知识图谱来进行构建&#xff0c;但基于知识图谱的问答对于自然语言的处理…

《JavaSE-第二十一章》之线程的状态与中断

前言 在你立足处深挖下去,就会有泉水涌出!别管蒙昧者们叫嚷:“下边永远是地狱!” 博客主页&#xff1a;KC老衲爱尼姑的博客主页 博主的github&#xff0c;平常所写代码皆在于此 共勉&#xff1a;talk is cheap, show me the code 作者是爪哇岛的新手&#xff0c;水平很有限&…