Linux进阶-加深进程印象

news2024/12/26 20:44:19

进程

进程状态转换

一般来说,一个进程的开始都是从其父进程调用fork()函数开始,所以在系统一上电运行时,init进程就开始工作在系统运行过程中,会不断启动新的进程(要么由init进程启动,要么由被init进程启动的其他进程所启动)init进程的PCB是从内核的启动镜像文件中直接加载的,系统中的所有其他进程都是init进程的后代

一个进程被启动后都是处于可运行状态(但此时进程并未占用CPU运行),处于该状态的进程可以是正在进程等待队列中排队(就绪态),也可以占用CPU正在运行(运行态)。

系统产生进程调度时,处于就绪态的进程可以占用CPU的使用权,处于运行态。但每个进程运行时间是有限的(时间片),当进程的时间片已经耗光,如果进程还没有结束运行,那么会被系统重新放入等待队列中等待,处于就绪态,等待下一次进程的调度。另外,正处于运行态的进程即使时间片没有耗光也可能被别的更高优先级的进程抢占被迫重新回到等待队列中等待

处于运行态的进程可能会因为等待某些事件、信号或资源而进入可中断睡眠态(比如进程要读取一个管道文件数据而管道为空时,或进程要获得一个锁资源而当前锁不可获取时,甚至是进程自己调用sleep()函数来强制将自己进入睡眠等)。

可中断睡眠态:可以被中断的,能响应信号的睡眠状态。在特定条件发生后,进程状态就会转变为“就绪态”(比如其他进程向管道文件写入数据,或锁资源可以被获取了,或睡眠时间到达等)。

处于运行态的进程也可能会进入不可中断睡眠态,即进程不能响应信号。但这种状态非常短暂,我们几乎无法通过ps命令将其显示,一般处于这种状态的进程都是在等待输入或输出(I/O)完成,在等待完成后自动进入就绪态。

当进程收到SIGSTOP或SIGTSTP中的其中一个信号时,进程状态会被置为暂停态不再参与调度,但系统资源不会被释放直到收到SIGCONT信号后被重新置为就绪态。

当进程被追踪时(常见是使用调试器调试应用程序时)收到任何信号状态都会被置为TASK_TRACED状态,不再参与调度,但系统资源不会被释放直到收到SIGCONT信号后被重新置为就绪态。

进程在完成任务后会退出,那么此时进程状态为退出态(属于正常退出,如main()函数return,或调用exit()函数,或线程调用pthread_exit()函数)。

不正常退出时,那么此时进程状态为僵尸进程(如进程收到kill信号)。其实不管怎么死,内核都会调用do_exit()函数来使进程状态变为僵尸进程。

僵尸进程的僵尸指的是进程的进程控制块PCB。为什么一个进程死掉之后还要把PCB留下呢?因为进程在退出时,系统会将其退出信息都保存在PCB中(比如死亡原因),得以让父进程去排查(父进程之所以要启动该进程,很大原因是要让进程去干某一件事情,当该进程死亡,父进程当然要知道那一件事情办得怎样)

父进程去处理僵尸进程时,会将这个僵尸进程的状态设置为EXIT_DEAD,即退出态,系统才能去回收僵尸进程的内存空间,否则系统将存在越来越多的僵尸进程,最后导致系统内存不足而崩溃。

当父进程由于太忙而没能及时去处理僵尸进程时,可以考虑使用信号异步通知机制(让一个孩子在变成僵尸时给其父进程发一个信号,父进程接收到这个信号后再对其进行处理)。

当父进程先一步于子进程退出时,子进程将变成孤儿进程(没有父进程),孤儿进程将被祖先进程(init)收养。所以当孤儿进程退出时,init进程将回收资源。

进程状态

执行ps -ux可查出进程的状态。

状态说明
R

可运行状态。表示进程在运行队列中,处于正在运行或即将运行的状态。

只有在该状态才可能在CPU上运行,同一时刻可能有多个进程处于可运行状态

S可中断睡眠态。处于这个状态的进程可能因为等待某种事件的发生而被挂起,比如进程在等待信息
D不可中断睡眠态。通常是在等待输入或输出(I/O)完成,处于这种状态的进程不能响应异步信号
T停止态。通常是被Shell的工作信号控制,或因为处于调试器的控制下进程被追踪
Z退出态。进程成为僵尸进程
X退出态。进程即将被回收
s进程是会话其首进程
l进程是多线程的
+进程属于前台进程组
<高优先级任务

启动新进程

system()函数

简单,但效率低下而且具有不容忽视的完全风险。

system.c文件
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
        pid_t result;
        result = system("ls -l");
        return result;
}

Makefile文件
ARCH?=x86
ifeq ($(ARCH), x86)
        CC = gcc
else
        CC = arm-linux-guneabihf-gcc
endif

TARGET=system
BUILD_DIR=build
SRC_DIR=module
INC_DIR=include
CFLAGS = $(patsubst %,-I %,$(INC_DIR))
INCLUDES = $(foreach dir, $(INC_DIR), $(wildcard $(dir)/*.h))

SOURCES = $(foreach dir, $(SRC_DIR), $(wildcard $(dir)/*.c))
OBJS = $(patsubst %.c, $(BUILD_DIR)/%.o, $(notdir $(SOURCES)))
VPATH = $(SRC_DIR)

$(BUILD_DIR)/$(TARGET):$(OBJS)
        $(CC) $(^) -o $(@)
$(BUILD_DIR)/%.o:%.c $(INCLUDE) | create_build
        $(CC) -c $< -o $@ $(CFLAGS)

.PHONY:clean create_build
clean:
        rm -r $(BUILD_DIR)
create_build:
        mkdir -p $(BUILD_DIR)

执行过程

fork()函数

复杂,但提供更好地弹性、效率和安全性。

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

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

相关文章

Floyd-Warshall最短路径(C++,例题:pta大众情人)

Floyd-Warshall算法是一种用于求解所有点对之间最短路径的动态规划算法。它可以处理带权有向图或无向图&#xff0c;但是不能处理带负环的图。 算法步骤如下&#xff1a; 1. 初始化一个nn的矩阵D&#xff0c;其中D[i][j]表示从顶点i到顶点j的最短路径长度&#xff0c;如果i和…

文心一言 VS 讯飞星火 VS chatgpt (111)-- 算法导论10.2 2题

二、用go语言&#xff0c;用一个单链表 L实现一个栈。要求操作 PUSH和 POP 的运行时间仍为 O(1)。 文心一言&#xff1a; 在 Go 语言中&#xff0c;我们可以用结构体来实现一个单链表&#xff0c;然后再用栈的相关操作。 以下是一个可能的实现方式&#xff1a; package mai…

Spring Boot 中的 Redis 数据操作配置和使用

Spring Boot 中的 Redis 数据操作配置和使用 Redis&#xff08;Remote Dictionary Server&#xff09;是一种高性能的开源内存数据库&#xff0c;用于缓存、消息队列、会话管理和数据存储。在Spring Boot应用程序中&#xff0c;Redis被广泛用于各种用例&#xff0c;包括缓存、…

从0开始学Java:Java概述

文章目录 1. JavaSE体系介绍2. 计算机语言介绍3. Java语言概述3.1 Java生态圈3.2 Java语言发展历史3.3 Java技术体系平台3.4 Java的主要应用领域3.5 Java语言的特点 4. Java语言跨平台原理 1. JavaSE体系介绍 JavaSE知识模块介绍 第一部分&#xff1a;计算机编程语言核心结构&…

2023 年诺贝尔物理学奖-阿秒光谱学

如果您想了解和衡量周围的世界&#xff0c;您可以使用的最重要的工具之一就是能够准确地对正在发生的事情进行成像&#xff08;或拍摄快照&#xff09;。在 19 世纪&#xff0c;摄影意味着让拍摄对象保持完全静止&#xff0c;同时积累大量光线&#xff1a;相当于几秒钟的时间。…

一种用于肽图分析的烷化剂,Desthiobiotin-Iodoacetamide

中文名&#xff1a;脱硫生物素-碘乙酰胺 英文名&#xff1a;Desthiobiotin-Iodoacetamide 化学式&#xff1a;C14H25IN4O3 分子量&#xff1a;424.28 外观&#xff1a;固体/粉末 规格&#xff1a;10mg、25mg、50mg等&#xff08;接受各种规格的定制服务&#xff0c;具体可…

JavaScript的懒加载处理

&#x1f618;博主&#xff1a;小猫娃来啦 &#x1f618;文章核心&#xff1a;JavaScript的懒加载处理 文章目录 什么是懒加载实现懒加载的方式js四步法设置占位图监听滚动事件加载图片触发加载函数 什么是懒加载 懒加载&#xff08;Lazy Loading&#xff09;是一种优化技术&a…

GitLab 502问题解决方案

由于最近 gitlab 切换到另一台服务器上部署的 gitlab 后&#xff0c;经常出现 502。平时重启 gitlab 后都能解决&#xff0c;今天突然重启多次后都还是 502&#xff08;重启日志是正常的&#xff09;&#xff0c;遂通过 gitlab-ctl tail 查看日志进行排查。 gitlab-ctl tail通…

《进化优化》第3章 遗传算法

文章目录 3.1 遗传学的历史3.2 遗传学3.3 遗传学的历史3.4 一个简单的二进制遗传算法3.4.1 用于机器人设计的遗传算法3.4.2 选择与交叉3.4.3 变异3.4.5 遗传算法参数调试 3.5 简单的连续遗传算法 遗传算法模仿自然选择来解决优化问题。 为研究遗传算法&#xff0c;得遵守自然选…

微软10月补丁 | 修复103个漏洞,包括2个零日漏洞,13个严重漏洞

近日&#xff0c;微软发布了2023年10月的补丁更新&#xff0c;解决了其软件中的103个漏洞。 在这103个漏洞中&#xff0c;有13个的评级为严重漏洞&#xff0c;90个被评为重要漏洞。自9月12日以来&#xff0c;谷歌已经解决了基于chrome的Edge浏览器的18个安全漏洞。 这两个零日…

ATFX汇市:美国9月CPI数据来袭,机构预期年率增速将继续回落

ATFX汇市&#xff1a;今日20:30&#xff0c;美国劳工部将公布9月未季调CPI年率增速&#xff0c;前值为3.7%&#xff0c;预期值3.6%&#xff1b;9月未季调核心CPI年率&#xff0c;同一时间公布&#xff0c;前值为4.3%&#xff0c;预期值4.1%。无论是名义CPI增速还是核心CPI增速&…

深入理解强化学习——标准强化学习和深度强化学习

分类目录&#xff1a;《深入理解强化学习》总目录 强化学习的历史 早期的强化学习&#xff0c;我们称其为标准强化学习。最近业界把强化学习与深度学习结合起来&#xff0c;就形成了深度强化学习&#xff08;Deep ReinforcemetLearning&#xff09;。因此&#xff0c;深度强化…

基于YOLO算法的单目相机2D测量(工件尺寸和物体尺寸)三

1.简介 1.1 2D测量技术 基于单目相机的2D测量技术在许多领域中具有重要的背景和意义。 工业制造&#xff1a;在工业制造过程中&#xff0c;精确测量是确保产品质量和一致性的关键。基于单目相机的2D测量技术可以用于检测和测量零件尺寸、位置、形状等参数&#xff0c;进而实…

腾讯云国际站-阿里云OSS如何迁移到腾讯云COS?腾讯云cos迁移教程

下面小编将介绍当源对象存储部署在阿里云国际版OSS 时&#xff0c;如何配置全托管迁移任务和半托管迁移任务&#xff0c;实现顺利迁移数据至腾讯云国际版COS。 准备工作 阿里云对象存储 OSS 创建 RAM 子账号并授予相关权限&#xff1a; 登录 RAM 控制台。选择人员管理 > …

吃瓜神奇!企查查、天眼查、天眼销,到底哪家强?

最近&#xff0c;我发现很多人在讨论查企业信息的工具&#xff0c;什么企查查、天眼查、天眼销等&#xff0c;到底哪家强呢&#xff1f; 首先&#xff0c;我们来简单了解一下这些工具。企查查是一款可以帮助用户查询企业信息的工具&#xff0c;通过输入关键词&#xff0c;可以搜…

VPN基础

1.VPN简介 VPN即虚拟专用网&#xff0c;泛指通过VPN技术在公用网络上构建的虚拟专用网络。VPN用户在此虚拟网络中传输私网流量&#xff0c;在不改变网络现状的情况下实现安全、可靠的连接。 专用&#xff1a;VPN网络是专门供VPN用户使用的网络&#xff0c;对于VPN用户&#xf…

Redis魔法:点燃分布式锁的奇妙实现

分布式锁是一种用于在分布式系统中控制对共享资源的访问的锁。它与传统的单机锁不同&#xff0c;因为它需要在多个节点之间协调以确保互斥访问。 本文将介绍什么是分布式锁&#xff0c;以及使用Redis实现分布式锁的几种方案。 一、前言 了解分布式锁之前&#xff0c;需要先了…

太顶了!文心大模型落地文旅行业不仅能业生成潮玩、还可补文物残卷!

10月11日&#xff0c;文化和旅游部公布了2023年文化和旅游数字化创新示范十佳案例和优秀案例。百度文心大模型创新文化产品生产方式入选十佳案例&#xff0c;也是唯一一个入选的大模型应用案例。文心大模型获奖类型为运用数字化工具助力艺术创作生产&#xff0c;促进文化机构数…

产品升级!全球尺度下原核基因组关键基因共进化无标题

微生物是群落型的生存方式&#xff0c;高通量测序时代到来后&#xff0c;掀起了针对微生物群落整体研究的高潮&#xff0c;比如基于功能基因/16S/ITS/扩增子、宏基因组等进行群落多样性分析。但是&#xff0c;我们基于分离培养等方法获得单菌落&#xff0c;针对单菌开展基因组、…

xxx.ko 驱动模块加载报错 “unknown symbol in module or invalid parameter”

一、问题 在对单独驱动模块进行测试时&#xff0c;我们要进行动态编译&#xff0c;生成对应驱动的.ko模块。然后进行手动加载和卸载。但是在进行驱动模块加载时遇到了unknown symbol in module or invalid parameter问题&#xff0c;对此进行排查解决。 二、解决 首先进行dmes…