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自己执行

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CentOS9 Stream 支持输入中文

CentOS9 Stream 支持输入中文 方法一:确保 gnome-control-center 和相关组件已更新方法二:手动添加输入法源配置方法三:配置 .xinputrc 文件方法四:检查语言包 进入centos9 stream后,点击右上角电源键,点击…

Linux权限管理和文件属性

目录 1. 权限的概念 2. 权限管理 2.1 文件访问者的分类 2.2 文件类型和访问权限(事物属性) 2.2.1 文件类型 2.2.2 file指令 2.2.3 基本权限 3. 文件访问权限的相关设置方法 3.1 chmod 3.2 chown 和 chgrp 3.3 umask 4. 粘滞位 1. 权限的…

某些保护措施如反接保护漏电保护为什么用可控硅而不用MOS管

现在很多人了解到MOS的饱和导通时电阻很小。 不过MOS的导通有条件,就是GS电压要求比较高。 在保护方面,我们需要 1,简单可靠,务必不要太复杂 2,触发电压要低,电流要求要小,否则灵敏度达不到…

【力扣专题栏】字母异词分组,如何利用强大的容器(unordered_map)解决该问题?

题解目录 1、题目描述解释2、算法原理解析3、代码编写 1、题目描述解释 2、算法原理解析 3、代码编写 class Solution { public:vector<vector<string>> groupAnagrams(vector<string>& strs) {//创建哈希表unordered_map<string,vector<string&g…

debian11安装最新rabbitmq

1、使用官网提供系统对应的安装脚本 安装 版本说明&#xff1a; Debian Buster代表Debian 10 Debian Bullseye代表Debian 11 Debian Bookworm代表Debian 12 ‌Debian Trixie代表Debian 13 Debian Sid代表Debian unstable版本 2、新建脚本文件 vim rabbitMq.sh将脚本内容复制到…

K 临近算法

机器学习中的 K 临近算法&#xff0c;计算输入数据与训练集中数据的距离&#xff0c;选取 k 个最近的数据&#xff0c;选中的数据中&#xff0c;那个分类多&#xff0c;那个分类就是最终结果。特征空间的距离有多重测量方法&#xff0c;最常用的就是欧氏距离&#xff0c;公式如…

2025上海市公务员考试报名流程详细教程

2025年上海市公务员考试报名马上就要开始了&#xff0c;有想要参加上海公务员考试的姐妹们&#xff0c;可以提前了解一下考试报名流程&#xff0c;和报名照制作尺寸要求 报名时间&#xff1a;11月2日0:00至11月8日12:00 南核时间&#xff1a;11月2日0:00至11月8日14:00 缴费…

GPT原理;ChatGPT 等类似的问答系统工作流程如下;当用户向 ChatGPT 输入一个问题后:举例说明;ChatGPT不是通过索引搜索的传统知识库

目录 GPT原理 GPT架构 GPT 主要基于 Transformer 的解码器部分 ChatGPT 等类似的问答系统工作流程如下: 用户输入 文本预处理 模型处理 答案生成 输出回答 当用户向 ChatGPT 输入一个问题后:举例说明 文本预处理: ChatGPT不是通过索引搜索的传统知识库 GPT GPT…

微服务设计模式 — 补偿事务模式(Compensating Transaction Pattern)

微服务设计模式 — 补偿事务模式&#xff08;Compensating Transaction Pattern&#xff09; 定义 在云计算和分布式系统中&#xff0c;管理跨多个微服务或组件的事务一致性是一项极具挑战性的任务&#xff0c;补偿事务模式Compensating Transaction Pattern&#xff09;是一种…

HTML 基础标签——元数据标签 <meta>

文章目录 1. `<meta>` 标签概述2. 属性详解2.1 `charset` 属性2.2 `name` 属性2.3 `content` 属性2.4 `http-equiv` 属性3. 其他常见属性小结在 HTML 文档中,元数据标签 <meta> 是一种重要的标签,用于提供关于文档的信息,这些信息不直接显示在网页内容中,但对于…

Golang | Leetcode Golang题解之第526题优美的排列

题目&#xff1a; 题解&#xff1a; func countArrangement(n int) int {f : make([]int, 1<<n)f[0] 1for mask : 1; mask < 1<<n; mask {num : bits.OnesCount(uint(mask))for i : 0; i < n; i {if mask>>i&1 > 0 && (num%(i1) 0 |…

Rust 力扣 - 1297. 子串的最大出现次数

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 越短的子串出现的次数越多&#xff0c;我们只需要求某个长度为min_size的子串出现的次数&#xff0c;并且该子串中不重复字符小于等于max_letters的数量 遍历长度长度为min_size的子串&#xff0c;然后将不重复…

[neo4j报错]py2neo.errors.ClientError: [Request.Invalid] Not Found解决方案

报错源代码 g Graph(http://localhost:7687, auth("neo4j", "password"))或许这是从网上复制下来的代码&#xff0c;看上去没什么问题&#xff0c;但实际上 要结合具体的浏览器上的地址来看&#xff0c;具体如下&#xff1a; 看到了吗&#xff0c;这里才…

[ shell 脚本实战篇 ] 编写恶意程序实现需求(恶意程序A监测特定目录B出现特定文件C执行恶意操作D-windows)

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

Q:无法连接到此网络

无法连接到此网络 今天上午正用浏览器开始搜索&#xff0c;发现网络出了问题&#xff0c;就去找了相关的视频教程&#xff1a; 这些视频大概说了这几种&#xff1a; 设备管理器-网络适配器-找到含有WIFI的选项-查看是否状态异常control-网络和internet-网络和共享中心-更改适…

【实战篇】requests库 - 有道云翻译爬虫 【附:代理IP的使用】

目录 〇、引言一、目标二、请求参数分析三、响应分析四、编写爬虫脚本【隧道代理的使用】 〇、引言 无论是学习工作、旅游出行、跨境电商、日常交流以及一些专业领域都离不开翻译工具的支持。本文就带大家通过爬虫的方式开发一款属于自己的翻译工具~ 一、目标 如下的翻译接口…

[ 应急响应靶场实战 ] VMware 搭建win server 2012应急响应靶机 攻击者获取服务器权限上传恶意病毒 防守方人员应急响应并溯源

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

鸿蒙NEXT开发-学生管理系统小案例(基于最新api12稳定版)

注意&#xff1a;博主有个鸿蒙专栏&#xff0c;里面从上到下有关于鸿蒙next的教学文档&#xff0c;大家感兴趣可以学习下 如果大家觉得博主文章写的好的话&#xff0c;可以点下关注&#xff0c;博主会一直更新鸿蒙next相关知识 专栏地址: https://blog.csdn.net/qq_56760790/…

keepalived + nginx 实现网站高可用性(HA)

keepalive 一、keepalive简介二、实现步骤1. 环境准备2. 安装 Keepalived3. 配置 Keepalived 双机主备集群架构4. 配置 Nginx5. 启动Keepalived6. 测试高可用性7. 配置keepalived 双主热备集群架构 一、keepalive简介 目前互联网主流的实现WEB网站及数据库服务高可用软件包括&a…

Javase——正则表达式

正则表达式的相关使用 public static void main(String[] args) {//校验QQ号 System.out.println("3602222222".matches("[1-9][0-9]{4,}"));// 校验18位身份证号 System.out.println("11050220240830901X".matches("^([0-9]){7,18}…