linux操作系统进程

linux操作系统是对下的软硬件进行管理,为了能够对上提供稳定,快速,安全的服务而诞生的软件。

广义上的操作系统是包含搭载在操作系统上的软件和函数库等文件的。

狭义上的操作系统就是操作系统内核,进行进程管理,文件管理,驱动管理,内存管理

而linux对用户提供服务的方式是系统调用接口,系统调用接口实际上是用c语言实现的操作系统内部的函数调用。

因为操作系统不相信用户,所以就用有限制的系统调用接口来为用户提供服务

操作系统的管理

操作系统和被操作系统管理的软硬件是不需要直接接触的,操作系统实际上管理的时,将这些软硬件的属性放到规定好的结构体里面,将这些结构体用链表之类的链接起来,通过管理这些结构体来管理好软硬件。通过对链表增删查改来达到管理的功能。

而将这些软硬件描述成结构体,就是先描述,而连接起来,就是再组织

操作系统要管理内存当中的软硬件结构,所以操作系统也是加载到内存的,而且是最开始就加载到内存的。

进程管理

linux操作系统管理的进程并不是整个进程,而是将进程的属性组织起来称为一个结构体,在进程要加载到内存时,操作系统就会自动创建一个对应的进程块。tast_struct,里面保存着进程的诸多属性,这些结构体用链表连接起来,通过增删查改这些进程块来做到管理进程的效果,所以完整的进程是进程块+进程数据和代码。

进程

查看进程的两种方法

ps axj

ls /proc

proc是一个目录,里面有以进程pid命名的目录,这些目录里面保存了大部分进程的属性

每一个进程都有一个独特的编码,就是pid。 

可以通过筛选来查找该文件的pid和进程状态

 在程序运行的时候,可以通过pid来到proc里面查找对应的目录,里面有两个比较重要的属性。

cwd是当前的路径。

exe是一个该进程的软链接

当一个可执行程序开始执行的时候,它就变成了一个进程。

如果想要不调用指令获取pid,可以在代码层面使用系统调用接口pid。

使用fork来创建进程

pid_t fork(void)

调用该函数后,会有三种返回

返回的是pid,说明是父进程

返回的是0,说明是子进程

返回的是-1,说明创建子进程失败

fork为什么能有两个返回值呢?

子进程可以继承父进程的所有代码,而fork也是一个函数,它里面封装着实现创建子进程的代码,而在函数return返回之前,创建子进程的工作已经完成了,所以return也被子进程继承了,子进程返回一次,父进程返回一次。

而数据在刚开始也是子进程继承一样的一份,但是当数据出现不一样时,操作系统就会给不一样的数据另外开辟一块空间,专门存储修改的数据,修改多少,给多少,这就是父子进程之前数据的写时拷贝,return就是写时拷贝,返回了两个不同的数据。也就是说,父进程子进程用的是同一份代码,但数据可能不一样。

那么fork产生的子进程和父进程谁先运行呢,这个是不确定的,是根据操作系统的调度器来确定的。

操作系统进程的三种状态

运行态

单核的cpu一次只能处理一个进程,所以进程们需要排队,来获取cpu的资源,这个队列就是运行队列,而被cpu调用的时间是由调度器所决定的,一次调用的时间单位是时间片,每个进程被cpu调用的时间都是平均的,如果一个时间片是10毫秒,有五个进程,那么每个进程都被调用了20次。

当该进程在内存的运行队列中排队的时候,就被称为运行态

阻塞态

当进程需要等待某些硬件的反馈(例如等待键盘输入),而不能执行下去时 ,就会把这个进程挂到硬件的队列,硬件管理也是由一个个结构体组成的链表,先描述在组织的。而硬件的结构体里面就会有进程结构体tst_struct的指针,将该进程结构体的指针放入该硬件,就算是排在了这个硬件里面,等待着硬件的反馈,如果有多个进程等待该硬件,那么这些进程就会像一个进程队列一样排在这个文件后面,按照顺序来读取该硬件的反馈。得到反馈之后,就会回到运行对联,变成运行态。

挂起态

完整的进程是由进程结构tast_struct和进程数据,进程代码组成的。

在内存的空间不够的时候,操作系统就会将那些长时间处于阻塞状态的进程当中的进程数据和进程代码换出到磁盘存储,只留tast_struct用来管理,这种状态就是挂起状态。

等到 进程得到反馈之后,再将代码和数据换入。

./文件 & 在执行文件的后面加上一个&,代表着后台运行,后台运行时,bash命令行还是可以输入的。 

linux操作系统的进程状态

R 运行状态( running : 并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里
S 睡眠状态( sleeping): 意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠
interruptible sleep ))。
D 磁盘休眠状态( Disk sleep )有时候也叫不可中断睡眠状态( uninterruptible sleep ),在这个状态的进程通常会等待IO 的结束。

 在这个状态下,该进程甚至不可被操作系统删除,只能等待磁盘的反馈回来给进程,才会重新变为运行状态,当出现该状态的时候说明内存已经非常拥挤了,因为在内存不足的时候,操作系统会杀掉一些无关紧要的进程,而等待磁盘反馈的进程,为了避免被删掉,就会变成D状态。

T 停止状态( stopped ): 可以通过发送 SIGSTOP 信号给进程来停止( T )进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行。
可以通过 kill -19 来让一个进程暂停  kill -18 来让一个暂停的进程继续运行。
而在gdb调试器当中打断点的行为就是一种暂停,代码会运行到断点处停下来,这种是t。
t 和 T暂时不做区分。
Z(zombie)- 僵尸进程
僵死状态( Zombies )是一个比较特殊的状态。当进程退出并且父进程(使用 wait() 系统调用来接收子进程返回的信息 ) 没有读取到子进程退出的返回代码时就会产生僵死( ) 进程
僵死进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。
所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入 Z状态,子进程的进程相关资源尤其是tast_struct不会被释放。 如果父进程被释放了,子进程就变成孤儿进程,那么子进程就会有操作系统来回收接收处理。
X 死亡状态( dead ):这个状态只是一个返回状态,你不会在任务列表里看到这个状态

 进程优先级

进程优先级有40个等级 [60,99]

一个进程的优先级可以通过nice来进行一定程度的变化,最终优先级是:pri + nice

而进程队列实际上是由两个指针数组来控制的,每个指针数组都有四十个指针,每一个指针都对应着不同的优先级,如果对应的优先级没有进程,那该指针就是null。

两个指针数组一个是当前运行的进程,还有一个是新加入的进程和运行时间片到了但没有运行完毕的进程,因为进程运行中,不能加入新的进程,需要把目前的进程都运行一边才可以,所以当管理运行进程的指针中的进程运行好之后,就会和管理新加入的进程的指针进行调换,让管理新加入进程的指针来运行进程。而之前的指针数组开始接收新的进程。

进程的上下文

在进程加载到cpu运行的时候,cpu的寄存器会用来保存进程的那些高频出现,经常被cpu访问或修改的数据,来提高效率,因为寄存器相对于内存,更加靠近cpu,速度也就更快。而这些寄存器所保存的进程的临时数据,就被称作上下文。

函数返回的数据就是被寄存器所保存,函数运行完毕,该函数所占的函数栈帧就会被释放,而返回的数据是被寄存器所保存,所以才能将这个数据给到函数栈帧之外。

还有一个寄存器 pc/eip ,记录的是当前进程需要执行的下一条指令的位置。如果是单纯的顺序执行,当前在49行,那么eip所保存的就是50行,而如果是循环,到了循环的最后,50行,而循环开头在20行,那么eip保存的就是20行。

进程在从cpu离开时,会保存自己的上下文数据,在再次被cpu所调用时,再将这些上下文恢复到寄存器里。 

命令的分类

在执行命令时, 

分为内建命令和常规命令

在执行常规命令时,会创建子进程去执行

而内建命令是bash自己执行

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

js 获取当前时间与前一个月时间

// 获取当前时间的毫秒数 var currentTimeMillis new Date().getTime();// 获取前一个月的Date对象 var dateLastMonth new Date(); dateLastMonth.setMonth(dateLastMonth.getMonth() - 1);// 获取前一个月的毫秒数 var timeMillisLastMonth dateLastMonth.getTime();conso…

php内置服务停止shell小工具,用来停止指定的端口的php内置服务进程

最近vscode总是喜欢闪退,这导致了上面启动的php内置服务变成了无法管理状态,所以就有了这个工具来停止相关的PHP内置服务进程. 将下面的代码保存到本地合适的位置,并命名为 stop.sh #!/bin/bash # Author: tekintian # Date: 2024-11-02 …

服务器文件访问协议

服务器文件访问协议 摘要NFS、CIFS、SMB概述SMBWindows SMBLinux SambaPython SMB NFS 摘要 本篇博客参考网上文档和博客,对基于网络的服务器/主机的文件访问、共享协议进行简要总结,完整内容将会不断更新,以便加深理解和记忆 NFS、CIFS、S…

Leetcode - 周赛421

目录 一,3334. 数组的最大因子得分 二,3335. 字符串转换后的长度 I 三,3336. 最大公约数相等的子序列数量 四,3337. 字符串转换后的长度 II 一,3334. 数组的最大因子得分 暴力方法就不演示,这里介绍一个…

【java】java的基本程序设计结构06-运算符

运算符 一、分类 算术运算符关系运算符位运算符逻辑运算符赋值运算符其他运算符 1.1 算术运算符 操作符描述例子加法 - 相加运算符两侧的值A B 等于 30-减法 - 左操作数减去右操作数A – B 等于 -10*乘法 - 相乘操作符两侧的值A * B等于200/除法 - 左操作数除以右操作数B /…

群控系统服务端开发模式-应用开发-菜单功能开发

为什么优先开发菜单,而不是优先开发管理员?查看一下程序草图就明白,还有一个重点就是,管理员需要添加图片,而我还没有封装上传工具及上传目标。 一、添加路由 在根目录下route文件夹下的app.php文件里面,添…

顶点动画-河流的效果

目标是让一个矩形网格面片,通过顶点动画,实现出河流的效果。(如下图)所谓的河流效果,就是呈现出波浪感,而想要呈现出波浪感,我们必须了解 波长、波动频率、波动幅度 这些关键因素 1、波浪感的关…

线程函数和线程启动的几种不同形式

线程函数和线程启动的几种不同形式 在C中&#xff0c;线程函数和线程启动可以通过多种形式实现。以下是几种常见的形式&#xff0c;并附有相应的示例代码。 1. 使用函数指针启动线程 最基本的方式是使用函数指针来启动线程。 示例代码&#xff1a; #include <iostream&g…

3.1 快速启动Flink集群

文章目录 1. 环境配置2. 本地启动3. 集群启动4. 向集群提交作业4.1 提交作业概述4.2 添加打包插件4.3 将项目打包4.4 在Web UI上提交作业4.5 命令行提交作业 在本实战中&#xff0c;我们将快速启动Apache Flink 1.13.0集群&#xff0c;并在Hadoop集群环境中提交作业。首先&…

讲讲RabbitMQ 性能优化

大家好&#xff0c;我是锋哥。今天分享关于【RabbitMQ 性能优化&#xff1f;】面试题。希望对大家有帮助&#xff1b; 讲讲RabbitMQ 性能优化 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 RabbitMQ 是一个强大的消息代理&#xff0c;广泛用于分布式系统中&#x…

redolog与binlog的写入机制

redo log 事务在执行的过程中&#xff0c;生成的redo log是要先写到redo log buffer中的。redo log buffer里面的内容不需要每次生成后都直接持久化到磁盘。 如果事务执行期间MySQL发生异常重启&#xff0c;那这部分日志就丢了&#xff0c;但是由于没有commit&#xff0c;所以…

推荐一款数学绘图工具:FX Draw Tools

FX Draw Tools是目前最新好用的一款数学绘图工具。该软件界面简洁&#xff0c;使用方便。该软件能够帮助用户快速制作数学图表&#xff0c;从而提高用户的工作效率&#xff0c;轻松完成制图工作&#xff0c;欢迎需要的用户前来下载使用。 功能特色 1. 180和360可以被添加到任何…

《云计算网络技术与应用》实训8-1:OpenvSwitch简单配置练习

1.按《云计算网络技术与应用》实训5-1进行环境配置&#xff0c;安装好OVS 2.开启OVS虚拟交换机 3.创建一个网桥br0 4.查看网桥列表 5.把ens34网卡连接到网桥br0上 6. 查看网桥br0所有端口 7.列出网卡ens34连接的所有网桥列表 8.查看OVS网络状态 9.将网桥br0上连接的网卡ens34删…

Netty 组件介绍 - pipeline

ChannelPipeline为ChannelHandler链提供了容器&#xff0c;并且定义了该链上的入站和出站事件。当initChannel()被调用时&#xff0c;ChannelInitializer将在ChannelPipeline中安装一组自定义的ChannelHandler。他们的执行顺序就是添加顺序。 Server public class Server {pr…

Leetcode 热题100 之 二叉树3

1.二叉树展开为链表 思路分析&#xff1a;迭代法。对于每个节点&#xff0c;我们将其左子树放到右子树的位置。将原来的右子树接到新的右子树&#xff08;也就是原来的左子树&#xff09;的末端。移动到右子节点&#xff0c;继续处理下一节点&#xff0c;直到所有节点都处理完。…

UE5.4 PCG Layered Biomes插件

B站学习链接 官方文档 一、PCGSpawn Preset&#xff1a;负责管理PCG要用到的植被资产有哪些 二、BiomesSettings&#xff1a;设置要使用的植被资产Layer、Spawn参数 1.高度Layer参数&#xff1a; 2.地形Layer&#xff1a;我这里用地形样条线绘制了一块地形Layer 绘制点和…

单个相机矫正畸变

1、通过标定助手获取到内参外参&#xff0c;外参在此无效&#xff0c;只用到了内参 2、然后通过halcon算子进行矫正 参考&#xff1a;超人视觉

Orleans8.2入门测试

微软官方文档&#xff1a;快速入门&#xff1a;使用 ASP.NET Core 生成第一个 Orleans 应用 - .NET | Microsoft Learn 项目及引入的nuget库&#xff1a; 1、接口项目&#xff1b;2、接口实现项目&#xff1b;3、silo项目&#xff1b;4、客户端项目 其中Microsoft.Orleans.St…

电赛入门之软件stm32keil+cubemx

hal库可以帮我们一键生成许多基本配置&#xff0c;就不需要自己写了&#xff0c;用多了hal库就会发现原来用基本库的时候都过的什么苦日子&#xff08;笑 下面我们以f103c8t6&#xff0c;也就是经典的最小核心板来演示 一、配置工程 首先来新建一个工程 这里我们配置rcc和sys&…

第三十章 章节练习商品列表组件封装

目录 一、需求说明 二、技术要点 三、完整代码 3.1. main.js 3.2. App.vue 3.3. MyTable.vue 3.4. MyTag.vue 一、需求说明 1. my-tag 标签组件封装 (1) 双击显示输入框&#xff0c;输入框获取焦点 (2) 失去焦点&#xff0c;隐藏输入框 (3) 回显标签信息 (4) 内…