Linux —— 进程介绍

目录

一,进程介绍

二,进程使用

进程查看

通过系统调用获取进程标识符

通过系统调用创建进程 fork


一,进程介绍

        进程是正在执行的程序或命令,每个进程都是一个运行的实体或程序的执行实例,有自己的地址空间,并占用一定系统资源;从内核视角来看,是担当分配系统资源(CPU时间、内存)的实体;

  • 即在操作系统中,所有可执行的程序或命令都会产生进程(如简单的命令ls、touch等,执行完即结束,如httpd启动后就一直驻留在系统中的常驻内存进程);
  • 程序在执行时,执行者的权限和属性均会载入内存,操作系统会对进程分配一个ID,称为进程ID(即PID);
  • 进程可以产生新的进程,称此进程为父进程,新进程为子进程,如bash中执行的ls、touch等命令(bash父进程、ls/touch子进程);即子进程是依赖父进程产生的,若无父进程,子进程也就不存在;

进程控制块 PCB

        操作系统负责管理所有进程,包括进程的创建和消亡、进程状态的转换,及分配和回收进程所需的资源等;为了描述控制进程的运行,系统中存放进程的管理和控制信息的数据结构称为进程控制块(PCB Process Control Block);

  • PBC是进程实体的一部分,是操作系统中最重要的记录性数据结构;
  • PBC是进程管理和控制的最重要的数据结构,每一个进程均有一个PCB,在创建进程时,建立PCB,伴随进程运行的全过程,直到进程撤消而撤消;

        操作系统创建进程时,会额外申请一块内存(即进程控制块),用于存储、管理和控制进程的信息;由操作系统负责管理和维护,进程和进程控制块数量是对应的;Linux系统的PCB/task_struct;

  • task_struct(PCB的一种),描述进程的结构体;
  • task_struct 是Linux内核的一种数据结构,会被载入到内存并包含进程信息;
  • 运行在系统里的进程,都是以task_struct链表形式存在于内核内;对进程的管理,即是对此链表的增删查改;

task_struct 内容

  • 标识符,描述进程的唯一标识符,区别其他进程;
  • 状态,任务状态、退出代码、退出信息等;
  • 优先级,相当于其他进程的优先级;
  • 程序计数器,即将被执行下一指令的地址;
  • 内存指针,包括程序代码和进程相关数据的指针,及与其他进程共享的内存块指针;
  • 上下文数据,进程执行时寄存器中的数据;
  • I/O状态信息,包括显式的I/O请求,分配给进程的I/O设备和被进程使用的文件列表;
  • 记账信息,可能包括处理器时间总和,使用时钟数总和,时间限制,记账号等;
  • 其他信息;

注:管理的本质是先描述在组织;进程 = 程序 + PCB;

查看内核路径:..\linux-6.4.3\include\linux\sched.h

二,进程使用

        进程查看、系统调用获取标识符及创建子进程;

进程查看

  • 进程信息存于 /proc 文件夹,可通过此文件夹查看;
[wz@192 ~]$ ll /proc
total 0
dr-xr-xr-x.  9 root           root                         0 7月   9 06:35 1
dr-xr-xr-x.  9 root           root                         0 7月   9 06:35 10
dr-xr-xr-x.  9 root           root                         0 7月   9 06:35 11
dr-xr-xr-x.  9 root           root                         0 7月   9 06:35 1180
dr-xr-xr-x.  9 root           root                         0 7月   9 06:35 1182
dr-xr-xr-x.  9 root           root                         0 7月   9 06:35 1183
dr-xr-xr-x.  9 root           root                         0 7月   9 06:35 1187
dr-xr-xr-x.  9 root           root                         0 7月   9 06:35 1193
dr-xr-xr-x.  9 root           root                         0 7月   9 06:35 12
...
[wz@192 Desktop]$ ll /proc/59017
total 0
dr-xr-xr-x. 2 wz wz 0 7月  12 09:17 attr
-rw-r--r--. 1 wz wz 0 7月  12 09:17 autogroup
-r--------. 1 wz wz 0 7月  12 09:17 auxv
-r--r--r--. 1 wz wz 0 7月  12 09:17 cgroup
--w-------. 1 wz wz 0 7月  12 09:17 clear_refs
-r--r--r--. 1 wz wz 0 7月  12 06:32 cmdline
-rw-r--r--. 1 wz wz 0 7月  12 09:17 comm
-rw-r--r--. 1 wz wz 0 7月  12 09:17 coredump_filter
-r--r--r--. 1 wz wz 0 7月  12 09:17 cpuset
lrwxrwxrwx. 1 wz wz 0 7月  12 09:17 cwd -> /home/wz/Desktop
-r--------. 1 wz wz 0 7月  12 09:17 environ
lrwxrwxrwx. 1 wz wz 0 7月  12 06:32 exe -> /usr/bin/bash
  • 可通过命令top、ps,来查看大多数进程信息;

[wz@192 Desktop]$ ps axj | head -1 && ps axj | grep bashPPID    PID   PGID    SID TTY       TPGID STAT   UID   TIME COMMAND1    781    765    765 ?            -1 S        0   0:17 /bin/bash /usr/sbin/ksmtuned2107   2244   2244   2244 ?            -1 Ss    1000   0:02 /usr/bin/ssh-agent /bin/sh -c exec -l /bin/bash -c "env GNOME_SHELL_SESSION_MODE=classic gnome-session --session gnome-classic"59010  59017  59017  59017 pts/0     61546 Ss    1000   0:00 bash59017  61547  61546  59017 pts/0     61546 S+    1000   0:00 grep --color=auto bash

通过系统调用获取进程标识符

  • 进程id为PID;
  • 父进程id为PPID;
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{printf("pid: %d\n", getpid());printf("ppid: %d\n", getppid());return 0;
}

通过系统调用创建进程 fork

        fork() 通过复制正在调用的进程,来创建新进程;新进程将作为子进程,是父进程的完全副本;

  • fork有两个返回值,0代表子进程,大于0代表父进程;
    • 子进程返回0;
    • 父进程返回子进程的ID;
  • 子进程有自己唯一进程ID(PID);
  • 父子进程代码共享(只读),数据各自私有一份 ,采用写实拷贝;各自独立,互不干扰;
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{int ret = fork();printf("hello proc : %d!, ret: %d\n", getpid(), ret);sleep(1);return 0;
}
  • fork通常使用if进行分流;
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{int ret = fork();if(ret < 0){perror("fork");return 1;}else if(ret == 0){ printf("I am child : %d!, ret: %d\n", getpid(), ret); //child}else{ printf("I am father : %d!, ret: %d\n", getpid(), ret); //father}sleep(1);return 0;
}

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

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

相关文章

Win10,WinServer16,DNS,Web ,域 环境配置 周总结 (温故而知新 可以为师矣 第十五课)

Win10,WinServer16,DNS,Web ,域 环境安装 (第十五课) 创建虚拟机安装windowserver2016服务器(NETBASE第二课)_星辰镜的博客-CSDN博客 创建台虚拟机并安装上window10系统&#xff08;NETBASE 第一课&#xff09;_window 虚拟机_星辰镜的博客-CSDN博客配置通过域名访问网站(NET…

40.RocketMQ之高频面试题大全

消息中间件如何选型 RabbitMQ erlang开发&#xff0c;对消息堆积的支持并不好&#xff0c;当大量消息积压的时候&#xff0c;会导致 RabbitMQ 的性能急剧下降。每秒钟可以处理几万到十几万条消息。 RocketMQ java开发&#xff0c;面向互联网集群化功能丰富&#xff0c;对在线业…

行业追踪,2023-07-10,汽车零部件如期调整,需要耐心等待第二波

自动复盘 2023-07-10 成交额超过 100 亿 排名靠前&#xff0c;macd柱由绿转红 成交量要大于均线 有必要给每个行业加一个上级的归类&#xff0c;这样更能体现主流方向 rps 有时候比较滞后&#xff0c;但不少是欲杨先抑&#xff0c; 应该持续跟踪&#xff0c;等 macd 反转时参与…

input输入日期时间,自动格式化组件/工具

input输入日期时间&#xff0c;自动格式化组件/工具 组件/工具使用说明 只能输入日期时间&#xff0c;不能选择日期时间格式 yyyy-MM-dd HH:mm:ss基于VUE框架输入效果见下图 组件/工具解决的痛点 组件库日期时间组件&#xff0c;选日期时间很花时间 例如想快速得到 2021-1…

golang关于成员变量使用:=

错误 错误原因 结构体成员变量不能与:一起用&#xff0c;这是一个语法错误。

C#(五十八)之C#List

前几天&#xff0c;看同事写的代码中有list相关的字眼&#xff0c;百度了一下&#xff0c;原来是C#中list泛型集合。 了解一下。 List&#xff1a;泛型集合&#xff0c;List<T>类是 ArrayList 类的泛型等效类。该类使用大小可按需动态增加的数组实现 IList<T> 泛型…

arcgis拓扑检查

不能有悬挂点 不能有伪结点***路网处理很重要&#xff0c;看研究吧。 一直默认到最后。 导入要素类&#xff0c;单个 toupu2右键新建拓扑&#xff08;T&#xff09; 一般选不能有悬挂点&#xff0c;不能重叠。 一路默认 是 拉进图层可视化 线要素的话记得添加字段length&#…

OSPF和VLAN综合实验

目录 题目 1.IP地址的规划设计 2.搭建拓扑并进行基础IP配置 3.配置虚拟局域网 1&#xff09;按子网划分要求配置PC1和PC2 检测&#xff1a;输入[SW1]display vlan进行检查 配置路由器R3 检测&#xff1a;用PC1去访问PC2 2&#xff09;配置拓扑中其余路由器的网关以及回…

使用RabbitMQ

使用RabbitMQ 1 Docker安装RabbitMQ 1.1 安装RabbitMQ # 下载含有管理页面的镜像 docker pull rabbitmq:3.8.8-management# 创建容器 # 5672&#xff1a;应用访问端口&#xff1b;15672&#xff1a;控制台Web端口号&#xff1b; docker run -itd \ --namemy-rabbitmq \ --re…

OpenCV 优化和改进图像处理应用功能的方法与实践

OpenCV 优化和改进图像处理应用功能的方法与实践 导语一、性能优化二、算法改进三、用户体验改进四、应用实践示例&#xff1a;实时图像滤波总结 导语 图像处理应用是计算机视觉和图像处理领域的关键应用之一&#xff0c;通过对图像进行处理和分析&#xff0c;可以提取有用的信…

创建一门简单的解释性编程语言并实现它的解释器

背景 最近刷到大佬的教程&#xff0c;跟着学一下 效果 开始时 输入姓名和年龄后 代码 自创编程语言SimpleScript: 自创一门简易脚本支持中文编程 (gitee.com) 解析 1.词法分析 将程序的每个字符串精准划分出来&#xff0c;形成多个单词Token 2.语法分析 将各段Token再…

Android 查看ANR和Crash日志(adb bugreport)

今天测试那儿出了个ANR&#xff0c;我自己手机没问题&#xff0c;很烦&#xff0c;定位不了位置。 于是还是得用ADB连接来看一下&#xff0c;之前用&#xff0c;但是老是会忘记&#xff0c;今天总结一下。 ADB命令查看应用包名_adb查看包名命令_&岁月不待人&的博客-C…

TeeChart for.NET Crack

TeeChart for.NET Crack TeeChart for.NET为各种图表需求提供了图表控件&#xff0c;包括金融、科学和统计等重要的垂直领域。它可以处理您的数据&#xff0c;在各种平台上无缝创建信息丰富、引人入胜的图表&#xff0c;包括Windows窗体、WPF、带有HTML5/Javascript渲染的ASP.N…

【C++】string类模拟

文章目录 成员变量和查看接口迭代器&#xff08;读和读写&#xff09;operator[]&#xff08;读和读写&#xff09;c_str()size() 构造函数用字符串构造用对象构造&#xff08;两种方法&#xff09;析构 赋值运算符重载扩容和调整reserve()resize()clear() 增删查改push_back()…

产业大模型刚开卷,京东跑进“最后半公里”

点击关注 文&#xff5c;姚 悦 编&#xff5c;王一粟 “京东一直在探索哪些产品、技术、场景可以真正把大模型用起来&#xff0c;在我们内部的场景中反复验证后&#xff0c;才决定在7月份对外发布&#xff0c;现在我们在零售、健康、物流、金融等业务场景里已经积累了一些经…

记一次阿里云被挖矿处理记录

摘要 莫名其妙的服务器就被攻击了&#xff0c;又被薅了羊毛&#xff0c;当做免费的挖矿劳动力了。 一、起因 上班&#xff08;摸鱼&#xff09;好好的&#xff0c;突然收到一条阿里云的推送短信&#xff0c;不看不知道&#xff0c;两台服务器被拉去作为苦力&#xff0c;挖矿去…

迭代读取文件

使用 torch.utils.data.dataset.Dataset 收集数据信息&#xff0c;创建数据集。 使用 import torch.utils.data.dataloader 创建一个可以批量迭代的数据载入器&#xff0c;并通过 for 循环批量读取所有文件的数据。 import torch.utils.data.dataset as dataset import torch…

光伏并网逆变器低电压穿越MATLAB仿真模型

使用MATLAB 2017b搭建 光伏逆变器低电压穿越仿真模型&#xff0c;boost加NPC拓扑结构&#xff0c;基于MATLAB/Simulink建模仿真。具备中点平衡SVPWM控制&#xff0c;正负序分离控制&#xff0c;pll&#xff0c;可进行低电压穿越仿真。 控制结构完整&#xff0c;波形完美&…

java学习路程之篇二、知识点、配置JAVA_HOME、跨平台、JVM、JRE、JDK

文章目录 1、Java背景介绍2、Java跨平台性3、JDK的下载和安装4、第一个Java程序5、HelloWorld案例详解6、JVM、JRE和JDK7、配置JAVA_HOME 1、Java背景介绍 2、Java跨平台性 3、JDK的下载和安装 4、第一个Java程序 5、HelloWorld案例详解 6、JVM、JRE和JDK 7、配置JAVA_HOME

MySQL(2)

建表 mysql> create table work(-> ‘部门号’ int(11) not null,-> ‘职工号’ int(11) not null,-> ‘工作时间’ date not null,-> ‘工资’ float(8,2) not null,-> ‘政治面貌’ varchar(10) not null default 群众,-> ‘姓名’ varchar(20) not nu…