Linux —— 进程介绍

news2024/11/20 10:41:37

目录

一,进程介绍

二,进程使用

进程查看

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

通过系统调用创建进程 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;

二,进程使用

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

进程查看

  • 进程信息存于 /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 bash
  PPID    PID   PGID    SID TTY       TPGID STAT   UID   TIME COMMAND
     1    781    765    765 ?            -1 S        0   0:17 /bin/bash /usr/sbin/ksmtuned
  2107   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 bash
 59017  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.coloradmin.cn/o/755741.html

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

相关文章

RNA病毒基因组的重头组装-内含tophat2报错的快速解决办法-CPIV3数据分析-2023-07-13

1、使用Trim Galore软件对两次数据进行质控&#xff0c;去掉20bp以下的reads vim新建RNA_seq_script_1对CPIV3测序数据进行质控分析 #!/bin/bash # 上面一行宣告这个script的语法使用bash语法&#xff0c;当程序被执行时&#xff0c;能够载入bash的相关环境配置文件。 # Prog…

Java 核心技术 卷I 第4章 对象与类

第4章 对象与类 4.1 面向对象程序设计概述 面向对象程序设计&#xff08;OOP&#xff09;是当今主流的程序设计范型。 Java是完全面向对象的&#xff0c;必须熟悉OOP才能够编写Java程序。 面向对象的程序是由对象组成的&#xff0c;每个对象包含对用户公开的特定功能部分和…

云计算相关概念

文章目录 一、云计算的三种部署模式&#xff1a;公有云、私有云、混合云--区别和特性二、华为云&#xff1a;简介、主要业务、特点和优势、不同场景和行业中的应用三、华为云-三剑客&#xff1a;IaaS、PaaS、SaaS 一、云计算的三种部署模式&#xff1a;公有云、私有云、混合云–…

驱动程序——字符设备驱动框架

文章目录 编写驱动程序的步骤代码hello_drv.chello_drv_test.c驱动模块代码编译&#xff08;编写Makefile&#xff0c;编译时间短&#xff09;驱动模块代码编译&#xff08;修改Makefile&#xff0c;编译时间长&#xff09;测试 应用调用open函数打开文件应用调用open函数打开设…

学习使用FAsyncTask执行异步任务

目标 要想在另一个线程中执行代码&#xff0c;使用FRunnable是一种方式。而使用FAsyncTask是另一种方式&#xff08;这也是UE的DDC相关代码中所使用的方式&#xff09;。 本篇尝试运行一个 FAsyncTask 的最简单的例子。 1. FAsyncTask 对于任务类的要求 FAsyncTask是一个类…

SPEC CPU 2006 在 CentOS 5.0 x86_64 古老系统测试【4】-O3 不支持 编译失败

gcc -O3 编译失败 结论&#xff1a;默认情况下SPEC CPU 2006 1.2 不支持 gcc -O3编译参数。

谈 Delphi 中 JSON 的简便操作(非常简单)

我曾有讲过Delphi操作JSON的方法&#xff0c;特别是这一篇【delphi】类和记录的 helpers&#xff08;助手&#xff09;。但是因为当时是主要介绍的是Delphi的Helper&#xff0c;大家可能并没注意到Delphi中JSON的简便操作方法。 早期Delphi并没有自己的JSON操作库&#xff0c;大…

51. N 皇后 (递归+回溯)

题目链接&#xff1a;力扣 解题思路&#xff1a;递归回溯&#xff0c;n个皇后不能在同一行&#xff0c;同一列&#xff0c;同一斜线上&#xff0c;需要将n个皇后放在n*n的棋盘上&#xff0c;所以棋盘的每一行一定有一个皇后&#xff0c;因此可以第一行开始&#xff0c;在当前行…

计算机毕设 大数据电商用户行为分析及可视化

文章目录 1. 数据集说明2. 数据处理2.1 数据导入2.2 数据清洗 3.数据分析可视化3.1 用户流量及购物情况3.2 用户行为转换率3.3 用户行为习惯3.4 基于 RFM 模型找出有价值的用户3.5 商品维度的分析 4 最后 1. 数据集说明 这是一份来自淘宝的用户行为数据&#xff0c;时间区间为…

大数据分析平台能为企业带来哪些好处_光点科技

大数据分析平台是近年来迅速发展的一项关键技术&#xff0c;它利用先进的数据处理和分析技术&#xff0c;帮助企业从海量数据中提取有价值的信息和见解。对于企业来说&#xff0c;拥有一个强大的大数据分析平台可以带来许多好处。 首先&#xff0c;大数据分析平台可以帮助企业更…

【ArcGIS微课1000例】0070:制作宾馆酒店分布热度热力图

本文讲解在ArcGIS中,基于长沙市酒店宾馆分布矢量点数据(POI数据)绘制酒店分布热力图。 相关阅读: 【GeoDa实用技巧100例】004:绘制长沙市宾馆热度图 【ArcGIS Pro微课1000例】0028:绘制酒店分布热力图(POI数据) 文章目录 一、加载宾馆分布数据二、绘制热度图一、加载宾…

[QT编程系列-11]:C++图形用户界面编程,QT框架快速入门培训 - 5- QT主要控件与自定义控件

目录 5. QT主要控件 5.1 预定义控件 5.2 自定义控件 5.3 用预定义容器橙子和提升自定义控件 5.3 后记 5. QT主要控件 5.1 预定义控件 在Qt中&#xff0c;有许多预定义的控件&#xff08;Widgets&#xff09;可用于创建用户界面。这些控件提供了各种常见的用户界面元素&am…

五笔没落之五笔学习热潮

1998年&#xff0c;一个风雨交加的下午&#xff0c;有一个年轻人骑着一辆破旧的自行车来到电脑培训班&#xff0c;学习五笔打字。那时电脑还很贵&#xff0c;他一个月的工资只有几百元&#xff0c;根本买不起电脑&#xff0c;所以选择参加培训班。那时会打字就像现在的硕士生那…

Java----Nacos服务注册

除了通过Eureka&#xff0c;还可以通过我们的Nacos进行注册服务&#xff0c;方法也很简单。 前提&#xff01;需要开启Nacos服务&#xff0c;在官网中下载对应的压缩包&#xff0c;然后启动&#xff0c;如下windows需要输入命令&#xff1a; startup.cmd -m standalone 然后会…

Qt+C++多线程thread-QThread-QTimer视频-控件动画-混合应用实例

程序示例精选 QtC多线程thread-QThread-QTimer混合应用实例 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<QtC多线程thread-QThread-QTimer混合应用实例>>编写代码&#xff0c…

事务@transactional执行产生重复数据

背景 系统设计之初&#xff0c;每次来新请求&#xff0c;业务层会先查询数据库&#xff0c;判断是否存在相同的id数据&#xff08;id是唯一标识产品的&#xff09;&#xff0c;有则返回当前数据库查到的数据&#xff0c;根据数据决定下一步动作&#xff0c;没有则认为是初次请…

【ArcGIS Pro二次开发】(46):要素类从上到下、从左到右排序

要素类经过编辑之后&#xff0c;【OBJECTID】字段会变得不规律。应部分网友要求&#xff0c;做了这个从上到下、从左到右排序的工具。 不过后来在ArcGIS Pro中发现了一个【排序】工具&#xff0c;已经可以完美实现这个功能需求&#xff0c;发现自己做了个白工。 不过做了不能白…

火山引擎徐广治:边缘云,下一代云计算

6月30日&#xff0c;2023稀土开发者大会在北京举办。大会以「代码不止&#xff0c;掘金不停」为主题&#xff0c;与上百位海内外技术专家一起剖析行业最新动态&#xff0c;为一直在路上的技术开发者们&#xff0c;拓宽技术视野&#xff0c;传播前沿的技术理念。火山引擎边缘云资…

图腾柱电路

驱动MOS或者IGBT管&#xff0c;需要比较大的驱动电流或者灌电流 使用图腾柱电路或许是一个好的办法 电流路径是这样的 当CTL1端口输出为高电平的时候 三极管Q2的2脚为高&#xff0c;三极管Q2不导通 三极管Q1的2脚为高&#xff0c;三极管导通 所以Q1的3脚和1脚导通 VCC--…

C++笔记(总)

15重载 为什么使用重载 可以让函数名相同 提高复用性 函数重载需要满足的条件 1.函数的作用域相同 2.函数的返回值相同 3.函数的参数类型不同,或者参数的个数不相同或者参数的顺序不相同或者参数的类型不相同 4.不能用函数的返回值作为判断重载判断的条件。 举个例子 根…