Linux 进程(二)

news2025/1/20 3:38:44

1.当前工作目录

        Linux 下使用 ls /proc 查看程序中的进程,其中这些蓝色的数字代表的就是进程。

        其中cwd(current working directory)就是当前工作目录,那么为什么cwd 和 exe 是在同一级目录下呢因为 进程需要依赖可执行程序,可执行程序需要依赖源代码,所以不管是进程和可执行程序都默认生成在跟源代码同一级的目录下。

        怎么更改当前工作目录呢?

        chdir。 查看chdir的使用手册。

        用法如下,更改完成后,再去查看cwd 就会发现cwd已经更改 。

2. fork():

        首先我们来查看一下fork函数的使用。

        对于fork函数的返回值来说是最奇怪的!!!!

        fork 函数竟然有两个返回值!!这是真的吗?我们来创建程序来实验一下!! 

 

        我们可以惊奇的发现执行fork函数之后,之后的代码竟然执行力两次,并且这两个进程互为父子进程。

        进程= 内核数据结构 + 可执行程序的代码和数据!fork函数创建的子进程也不例外,并且子进程会继承父进程的绝大部分的属性(如代码和数据),这样子进程也会打印出和父进程相同的内容,但是pid就不一样,也是子进程没有继承父进程的属性。

        在上面fork 函数的介绍中说道 fork 函数有两个 返回值,返回给父进程的是子进程的pid,返回给子进程的是 0。是这样的吗?我们写个代码看一下

        如果这两个死循环能够同时跑起来,那么就能说明 id 的值既 大于0 又等于 0 ;

        我们来看程序执行的结果:

        这说明id 的值确实是既大于0 又等于 0。

        在进程当中父进程可以有很多个子进程,但是子进程只能有一个父进程,这就相当于一个人可以有很多个儿子,但只能有一个爹,所以为了更好的辨识子进程,父进程需要子进程的pid。

        下面我们继续实验:

        当我们杀死父进程时候,子进程竟然丝毫没有受到影响! 这说明了父进程和子进程在创建之后都有了独立的代码和数据,彼此不会收到影响。这是因为在fork之后 ,当父、子进程要对数据做修改时,os会介入进来会给子进程在copy一份数据,子进程就对这份数据做修改。既然有了两份数据就有两个返回值也不足为奇了!

        但问题的关键是一个变量怎么会有两个值!但linux下确实可以做到这一点。

3.进程状态

        进程被cpu运行需要在cpu下的队列进行排队,在cpu队列下排队的进程我们都可以叫它运行状态(大多数教材都是这么叫的),被cpu正在执行的也肯定是运行状态

        进程(进程 = task_struct PCB + 可执行程序(狭义上这么说))排队这件事,是进程进程所对应的PCB来排队的。进程在排队的时候,一定是在等待某种资源。

        一、进程不是一直在执行的比如一下代码:

        这个代码被执行后会卡住,因为需要等待键盘输入。

           二、进程放在cpu上也不是一直会运行的。

        比如当我们写一个死循环时,它会一直占用cpu的资源,导致电脑上的其他资源会卡死,但是事实并不是这样的,我们电脑可能会卡一点,但是其他的进程还是能正常的执行。这是系统中有一个叫“时间片”的概念。比如每个进程会执行 1ms 然后就执行下一个进程!

                

        在task_struct pcb 中会有struct_listnode n 通过 这个链表来管理全局的进程。

        n 对象是我们自己搞得那么struct 中别的对象是怎么搞得呢?

        首先将 0 强制转换成结构体指针,然后指向某个成员,这时候就算出偏移量了,然后再用n 的地址减去偏移量 就能够算出 task_struct 的地址,然后在强制转化成该结构体指针。不就能拿到该结构体地址,就能够访问该结构体的任意成员了!

        tast_struct pcb 中有很多个节点,cpu 是一种设备,所以对应的节点都可以链接到对应设备的队列上排队等待获取资源!!!

        进程的状态有 运行,阻塞,挂起。

        运行状态简单的理解就是,PCB在进程队列排队,或者正在被cpu执行。

        状态的不同,决定了你下一步要干什么!!比如你的状态是生病,下一步就是看病!!

        那么操作系统也是这样的,task_struct 中的状态其实就是一个整形变量。如下图:

        当程序走到了scanf 时,那么程序就会卡住,等待从键盘上获取资源。

        这时候操作系统会将该进程的pcb中的某个节点 连接到 对应设备的队列上去,同时该进程已经不在cpu队列了,那么该进程的状态要从运行 ,状态改为阻塞状态!!!这也就是状态的变迁。

        当我们的进程正在等待软硬件资源的时候,资源如果没有就绪,我们进程task_struct 只能

1.将自己设置为阻塞状态。2.将自己的pcb连接到该资源提供的等待队列。

              状态的变迁原因是,os将pcb放到了不同的队列中。

        挂起状态:简单的理解为内存现在吃紧,os将一些不重要的进程写入磁盘,为内存空间辗转腾挪。 

          

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

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

相关文章

局部内部类(内部类) - Java

局部内部类 说明:局部内部类是定义在外部类的局部位置,比如方法中,并且有类名。 LocalInnerClass.java 非常重要的几点!! 局部内部类本质还是一个类,该有的属性方法也都可以有。【举例a.见下文】可以直接…

KT1404C语音芯片为什么用着用着,声音就变大了,发指令设置音量?

一、问题简介 有客户反馈,使用KT404C语音芯片,每次主板上电的时候,都会发指令将音量设置为20级,但是实际到使用现场,就会有终端的客人反馈,机器的音量变大了,这个是什么情况呢,该如…

微服务API网关Spring Cloud Gateway实战

概述 微服务网关是为了给不同的微服务提供统一的前置功能;网关服务可以配置集群,以承载更多的流量;负载均衡与网关互相成就,一般使用负载均衡(例如 nginx)作为总入口,然后将流量分发到多个网关…

远程办公和密码管理的好伴侣

在当今快速变化的商业环境中,远程办公已经不再是一种简单的应急措施,而是被视为企业长期发展的关键战略之一。 随着科技的不断进步和全球化的推动,远程办公为企业提供了更大的灵活性和适应性,使得员工能够更好地平衡工作和生活。这…

ardupilot开发 --- ROS 篇

0. 前言 关于机载计算机; 关于ROS; 关于基于ROS的视觉SLAM和避障; 1. APSync 说到机载计算机Companion computer就不得不提另一个关键词APSync;APSync简化了机载计算机的设置,以便它可以为ArduPilot提供额外的功能,…

Debian arm系统安装wxPython

一、系统版本 二、安装wxPython-4.0.4.tar.gz 1、下载依赖 >sudo apt update >sudo apt-get install build-essential libgtk-3-dev libwebkit2gtk-4.0-dev libssl-dev libcurl4-openssl-dev libgstreamer-plugins-base1.0-dev libnotify-dev freeglut3 freeglut3-dev …

Python爬虫遇到重定向URL问题时如何解决?

什么是重定向 重定向是指当用户请求一个URL时,服务器返回一个中断请求的URL的响应。这种情况通常发生在网站对URL进行了修改或者重定向到其他页面的情况下。其中,如果处理不当开发,可能会导致爬虫无法获取所需的数据,从而影响爬虫…

激光切割机切割工件出现锯齿是什么原因?

金属激光切割机因切割速度快,效率高,切割效果好受到广大金属加工需求的厂家追捧,但在使用时不免出现一些小问题,如:在激光切割加工的时候出现锯齿的问题。 编辑搜图 请点击输入图片描述(最多18字&#xff…

传感器:探索Android中的传感器功能与使用

传感器:探索Android中的传感器功能与使用 一、传感器介绍1.1 Android 平台三大类传感器1.2 Android 平台支持的传感器1.3 传感器框架 二、传感器的使用2.1 识别传感器和传感器特性2.2 针对不同制造商的传感器或传感器的不同版本优化2.3 监控传感器事件2.4 处理不同的…

Docker中Alpine容器中配置MariaDB

1.更新镜像源 apk update2.安装 Mysql apk add --no-cache mysql mysql-client # 安装命令也可使用 apk add mariadb mariadb-client,alpine 中 mysql 就是 mariadb3. 安装openrc openrc是Alpine服务控制器,负责Alpine服务启动,添加、删除…

Linux 基本语句_13_消息队列

概念: 不同进程能通过消息队列来进行通信,不同进程也能获取或发送特定类型的消息,即选择性的收发消息。 一般一个程序采取子进程发消息,父进程收消息的模式 常用函数功能: fork(); // 创建子进程 struct msgbuf{ …

探索测试开发工程师的通往成功的秘密路径!

「作者说」随着近几年国内IT行业高速发展,对测试工程师的要求也越来越高,其作用也越来越重要,但很多测试工程师也迎来了个人发展的瓶颈,下一步该向哪个方向发展,该如何发展?本文将概述测试工程师的现状及发…

图片伪装,将RAR文件隐藏到图片里

下载链接 效果图: 代码: ECHO OFF TITLE PtoR MODE con COLS55 LINES25 color 0A:main cls echo.当前时间:%date% %time% echo.欢迎使用图片伪装,本脚本可以将RAR文件隐藏到图片里. echo.set /p "imagefile①请拖入图像文件…

Condition原码分析及实现原理

一、引言 Java作为一种广泛应用于企业级开发的编程语言,其内部机制和特性被许多开发者所关注。本文将深入分析Java Condition原码,以及Condition接口的实现原理,为大家提供一个更深入的了解。 二、Condition概述 Condition是Java并发编程中一…

tcp/ip协议 error=10022 Winsock.reg Winsock2.reg

tcp/ip协议 error10022 这2个注册表选项千万不能删除,否则上不了网。 按下windows键R键,输入regedit,打开注册表,在文件目录里找到如下两个文件夹,删除这两个文件夹。 路径:HKEY_LOCAL_MACHINE\System\C…

Python---练习:求某同学成绩的总分及平均分

需求: 已知某同学的语文(70)、数学(90) 、英语(80)、历史(75)、地理(85)五门课的成绩,编程求该同学的总分以及平均分。 思考: 要求是算总分和平均分,先看总分,已经知道了各科成绩,那么可以用把成绩赋值给每个学科的…

JVM——内存溢出和内存泄漏

目录 1. 内存溢出和内存泄漏内存泄漏的常见场景解决内存溢出的思路1.发现问题 – Top命令2.发现问题 – VisualVM3.发现问题 – Arthas4.发现问题 – Prometheus Grafana5.发现问题 – 堆内存状况的对比![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/058d113715b…

手机厂商集体入局大模型:谁在抢占「新高地」?

手机这个赛道,已然迎来了新的排位赛。大模型这条路上固然走的艰难,但也必须迎头赶上。大模型背后,手机厂商锚定的更是下一个入口战。 作者|斗斗 编辑|皮爷 出品|产业家 手机厂商们开始在大模型领域“卷”起来了。 今年8月,小米…

“Install Js dependencies failed“JS SDK安装失败【Bug已解决-鸿蒙开发】

文章目录 项目场景:问题描述原因分析:解决方案:解决措施1解决方案2:其他解决方案解决方案3:此Bug解决方案总结项目场景: 在下载JS SDK时,出现下载失败的情况,并显示“Install Js dependencies failed”。 在使用版本为DevEco Studio 3.0.0.601 Beta1进行低代码开发时…

你了解vue的diff算法吗?

​🌈个人主页:前端青山 🔥系列专栏:Vue篇 🔖人终将被年少不可得之物困其一生 依旧青山,本期给大家带来vue篇专栏内容:vue中的diff算法 目录 一、是什么 二、比较方式 三、原理分析 小结 一、是什么 diff 算法是一…