当前位置: 首页 > news >正文

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所调用时,再将这些上下文恢复到寄存器里。 

相关文章:

linux操作系统进程

linux操作系统是对下的软硬件进行管理,为了能够对上提供稳定,快速,安全的服务而诞生的软件。 广义上的操作系统是包含搭载在操作系统上的软件和函数库等文件的。 狭义上的操作系统就是操作系统内核,进行进程管理,文件…...

jeecgbootvue2菜单路由配置静态文件夹(public)下的html

需求:想要在菜单配置src/assets/iconfont/chart.html显示页面(目的是打包上线以后运维依然可以修改数据) 官网没有相关数据:菜单配置说明 JeecgBoot 开发文档 看云 问题现象: 我把文件放在src/assets/iconfont/chart.html然后在vue中作为 iframe 的 src 属性&am…...

PHP反序列化原生类字符串逃逸框架反序列化利用

PHP反序列化 概念 序列化的原因:为了解决开发中数据传输和数据解析的一个情况(类似于要发送一个椅子快递,不可能整个椅子打包发送,这是非常不方便的,所以就要对椅子进行序列化处理,让椅子分成很多部分在一起打包发送…...

6.1、属性动画

使用显式动画产生布局更新动画 1.旋转动画 只修改对应的属性 rotate({angle: this.angle}) 即可达到效果 动画效果 对应实现代码 @Entry @Component struct AnimationPage {@State angle:number = 0aboutToAppear() {...

v-model还可以作用于其他表单元素的使用

1、文本输入框 直接双向绑定输入的元素值 初始化默认值为空字符串 2、复选按钮 直接双向绑定输入的元素值 初始化默认值为flase,不选中 3、单选按钮, 1.使用name分组,产生互斥效果。 2.使用value存值, 3再用v-model双向绑定…...

最短路的求解

实验类型:◆验证性实验 ◇综合性实验 ◇设计性实验 实验目的:学会使用Matlab求解最短路。 实验内容:1.熟练运用Floyd算法;2. 熟练运用Dijkstra算法;3.利用Matlab编程实现最短路的计算。 例1:已知无向图…...

四:java 基础知识(4)-- 异常 字符串

目录 1. 异常处理 1.1 什么是异常 1.2 异常的类型 1.2.1 检查异常 1.2.2 运行时异常 1.3 异常的捕获与处理 1.3.1 try-catch 语句 1.3.2 finally 块 1.3.3 throw 和 throws 关键字 1.4 自定义异常 1.5 异常的最佳实践 2. 字符串 2.1 String 类的概述 2.2 字符串的…...

Uniapp 实现app自动检测更新/自动更新功能

实现步骤 配置 manifest.json 在 manifest.json 中设置应用的基本信息,包括 versionName 和 versionCode。 一般默认0.0.1,1. 服务器端接口开发 提供一个 API 接口,返回应用的最新版本信息,版本号、下载链接。客户端检测更新 使…...

7.0、RIP

RIP (Routing Information Protocol) 简介 RIP是由Xerox在20世纪70年代开发的,最初定义在RFC1058中。RIP用两种数据包传输更新:更新和请求,每个有RIP功能的路由器在默认情况下,每隔30s利用UDP520端口向与它直连的网络邻居广播(RIP1)或组播(R…...

C#与C++结构体的交互

C#在和C进行交互时,有时候会需要传递结构体。 做一些总结,避免大家在用的时候踩坑。 一般情况 例如我们在C里定义了一个struct_basic结构体 1 struct struct_basic 2 { 3 WORD value_1; 4 LONG value_2; 5 DWORD value_3; 6 UINT v…...

sql纵表转横表

项目上有一个需求(例子): 用户表 user{ id, name, workCode } id name workCode 1 张三 WC1001 2 李四 WC1002 工作信息表 work{ id, name, workCode, workTimeSun } id name …...

数据采集-Kepware OPCUA 服务器实现

KepserverEX OPC UA server设置 系列文章目录 数据采集-Kepware 安装证书异常处理 目录 KepserverEX OPC UA server设置系列文章目录一、OPC UA(OPC Unified Architecture)二、防火墙的配置三、配置KepserverEX的OPC UA3.1 启用远程连接3.2 启动OPCUA服务器接口 四、管理OPCU…...

初识计算机网络

🌎初识计算机网络 文章目录: 初识计算机网络 计算机网络背景 网络协议       初识协议       制定协议标准的组织或公司       OSI七层模型       操作系统和计算机网络关系       再谈协议 网络传输的基本流程     …...

Oracle 第11章:异常处理

在 Oracle PL/SQL 中,异常处理是一个重要的概念,它用于管理程序执行过程中可能发生的错误或特殊情况。异常可以是系统预定义的,也可以是由用户自定义的。 异常类型与处理机制 PL/SQL 提供了两种类型的异常: 预定义异常&#xf…...

导航栏渐变色iOS

- (void)viewDidLoad {[super viewDidLoad];// 设置导航栏属性self.navigationBar.translucent NO;[self.navigationBar setTitleTextAttributes:{NSForegroundColorAttributeName : [UIColor whiteColor], NSFontAttributeName:[UIFont boldSystemFontOfSize:28]}];// 修复iO…...

mysql读写分离

一、proxysql实现mysql读写分离 二、mycat...

计算机的错误计算(一百四十二)

摘要 本节探讨 MATLAB中 附近数的正弦函数的计算精度问题。 例1. 已知 计算 与 直接贴图吧: 另外, 16位的正确值分别为 -0.3077518861551721e-8 与 0.4106402475009074e-3(ISRealsoft 提供)。 容易看出,MATLAB的…...

利用大模型辅助科研论文写作·第一期|论文写作·24-11-02

小罗碎碎念 从这期推文开始,开一个新的系列——如何利用大语言模型辅助论文写作。 我目前的推文主要都集中于分享已经发表的论文,前期背景积累到一定程度以后,我们要动手做实验然后写自己的论文。如果从头到尾,全都自己写&#xf…...

JavaScript。—关于语法基础的理解—

一、程序控制语句 JavaScript 提供了 if 、if else 和 switch 3种条件语句&#xff0c;条件语句也可以嵌套。 &#xff08;一&#xff09;、条件语句 1、单向判断 &#xff1a; if... &#xff08;1&#xff09;概述 < if >元素用于在判断该语句是否满足特定条…...

Tomcat 11 下载/安装 与基本使用

为什么要使用Tomcat&#xff1f; 使用Apache Tomcat的原因有很多&#xff0c;以下是一些主要的优点和特点&#xff1a; 1. 开源与免费 Tomcat是一个完全开源的项目&#xff0c;任何人都可以免费使用。它由Apache软件基金会维护&#xff0c;拥有一个活跃的社区&#xff0c;这…...

Linux系统时间服务——Chrony服务器

文章目录 Linux系统时间服务——Chrony服务器前言时间同步的重要性Linux系统的两种时钟系统时钟&#xff08;System Clock&#xff09;相关命令硬件时钟 (RTC - Real Time Clock)相关命令 Chrony介绍NTP Chronyc相关命令服务管理相关命令chronyc 基本命令时间校正和控制命令NTP…...

C# 接口(Interface)

C# 接口&#xff08;Interface&#xff09; 接口在C#中是一种非常重要的概念&#xff0c;它定义了一个约定&#xff0c;实现该接口的类必须遵循这个约定。接口可以包含方法、属性、事件和索引器&#xff0c;但不包含实现。这使得接口成为定义抽象行为的理想选择。在本文中&…...

《高频电子线路》—— 电容三端LC振荡器

文章内容来源于【中国大学MOOC 华中科技大学通信&#xff08;高频&#xff09;电子线路精品公开课】&#xff0c;此篇文章仅作为笔记分享。 电容三端LC振荡器 基本原理&#xff08;考毕兹电路&#xff09; 反馈电压从C2上取得&#xff0c;作为输入电压&#xff0c;形成正反馈&a…...

leetcode35.搜索插入位置

1&#xff09;题目描述&#xff1a; 2&#xff09;本题要求使用 时间复杂度O(log n)的算法&#xff0c;这里使用二分查找的方法&#xff0c;这道题本身不复杂&#xff0c;但是&#xff0c;在使用递归调用时&#xff0c;笔者经常把递归结束的边界搞错&#xff0c;这里给出几版代…...

Redis全系列学习基础篇之位图(bitmap)常用命令的解析

文章目录 描述常用命令及解析常用命令解析 应用场景统计不确定时间周期内用户登录情况思路分析实现 统计某一特定时间内活跃用户(登录一次即算活跃)的数量思路分析与实现 描述 bitmap是redis封装的用于针对位(bit)的操作,其特点是计算效率高&#xff0c;占用空间少,常被用来统计…...

Copilot功能

Copilot 1、简介&#xff1a;Copilot是由GitHub与OpenAI共同开发的一款AI编程助手&#xff0c;旨在帮助开发者提高工作效率&#xff0c;改善代码质量。 2、主要功能包括&#xff1a; 1.代码补全&#xff1a;Copilot可以在开发者编写代码时提供代码建议&#xff0c;包括函数、循…...

《GBDT 算法的原理推导》 11-13初始化模型 公式解析

本文是将文章《GBDT 算法的原理推导》中的公式单独拿出来做一个详细的解析&#xff0c;便于初学者更好的理解。 公式(11-13)是GBDT算法的第一步&#xff0c;它描述了如何初始化模型。公式如下&#xff1a; f 0 ( x ) arg ⁡ min ⁡ c ∑ i 1 N L ( y i , c ) f_0(x) \arg \m…...

# Easysearch 与 LLM 融合打造高效智能问答系统

LangChain通过提供统一的抽象层和丰富的工具&#xff0c;极大地简化了LLM应用程序的开发过程&#xff0c;使得开发者能够更加专注于业务逻辑。RAG技术则通过索引和检索生成两步流程&#xff0c;利用最新数据或私有数据作为背景信息来增强大模型的推理能力。然而&#xff0c;对于…...

本地可以插入表记录,生产不能插入表记录

先说解决方案&#xff1a; 切面没有注入容器&#xff0c;在切面这加上Component详情&#xff1a; 大致是这样一个方法&#xff0c;本地运行会插入数据到sys_log表&#xff0c;但部署到服务器上就不会插入&#xff0c;而服务部署三年多了&#xff0c;一个表一直是空的居然没人…...

11.Three.js使用indexeddb前端缓存模型优化前端加载效率

11.Three.js使用indexeddb前端缓存模型优化前端加载效率 1.简述 在使用Three.js做数字孪生应用场景时&#xff0c;我们常常需要用到大量模型或数据。在访问我们的数字孪生应用时&#xff0c;每次刷新都需要从web端进行请求大量的模型数据或其他渲染数据等等&#xff0c;会极大…...