当前位置: 首页 > news >正文

Linux下的系统编程——认识进程(七)

前言:

程序是指储存在外部存储(如硬盘)的一个可执行文件, 而进程是指处于执行期间的程序, 进程包括 代码段(text section) 和 数据段(data section), 除了代码段和数据段外, 进程一般还包含打开的文件, 要处理的信号和CPU上下文等等.下面让我们开始对Linux进程有个初步的了解吧。

目录

一、进程的概念:

1.程序与进程区别:     

2.并发:

 3.单道程序设计:

4.多道程序设计:

5.CPU和MMU:

6.进程控制块PCB:

7.进程状态:

二、环境变量:

1.PATH:

2.SHELL:

3.TERM:

4.LANG.

5.HOME

三、进程控制

 1.fork(重点):

       (1) fork函数原理:

        (2)创建子进程

2.getpid和getppid:

四、进程共享 


一、进程的概念:

1.程序与进程区别:     

程序:死的。只占用磁盘空间。        ——剧本。

进程;活的。运行起来的程序。占用内存、cpu等系统资源。    ——戏。

2.并发:

        并发,在操作系统中,一个时间段中有多个进程都处于已启动运行到运行完毕之间的状态。但,任一个时刻点上仍只有一个进程在运行。
        例如,当下,我们使用计算机时可以边听音乐边聊天边上网。若笼统的将他们均看做一个进程的话,为什么可以同时运行呢,因为并发。

 3.单道程序设计:

        所有进程一个一个排对执行。若A阻塞,B只能等待,即使CPu处于空闲状态。而在人机交互时阻塞的出现时必然的。所有这种模型在系统资源利用上及其不合理,在计算机发展历史上存在不久,大部分便被淘汰了。

4.多道程序设计:

        在计算机内存中同时存放几道相互独立的程序,它们在管理程序控制之下,相互穿插的运行。多道程序设计必须有硬件基础作为保证。
        时钟中断即为多道程序设计模型的理论基础。并发时,任意进程在执行期间都不希望放弃cpu。因此系统需要一种强制让进程让出 cpu资源的手段。时钟中断有硬件基础作为保障,对进程而言不可抗拒。操作系统中的中断处理函数,来负责调度程序执行。
        在多道程序设计模型中,多个进程轮流使用CPU(分时复用CPu资源)。而当下常见CPu为纳秒级,1秒可以执行大约10亿条指令。由于人眼的反应速度是毫秒级,所以看似同时在运行。
        1s = 1000ms, 1ms = 100Ous,1us = 1000hs       1000000000 
实质上,并发是宏观并行,微观串行!         ----推动了计算机蓬勃发展,将人类引入了多媒体时代。

*5.CPU和MMU:


虚拟内存与物理内存映射关系

6.进程控制块PCB:

        我们知道,每个进程在内核中都有一个进程控制块(PCB)来维护进程相关的信息,Linux内核的进程控制块是task_struct结构体。
        /usr/src/linux-headers-3.16.0-30/include/linux/sched.h.文件中可以查看struct task_struct结构体定义。其内部成员有很多,我们重点掌握以下部分即可:·

    本质:结构体    

    进程id,系统中每个进程有唯一的id,在C语言类型中用pid_t类型表示,其实就是一个非负整数

    文件描述符表

    进程状态:  初始态、就绪态、运行态、挂起态、终止态。

    进程工作目录位置

    *umask掩码 (不是最重要的)

    信号相关信息资源。

    用户id和组id

7.进程状态:

        进程基本的状态有5种。分别为初始态,就绪态,运行态,挂起态与终止态。其中初始态为进程准备阶段,常与就绪态结合来看。

二、环境变量:

1.PATH:

        可执行文件的搜索路径。ls命令也是一个程序,执行它不需要提供完整的路径名/bin/ls,然而通常我们执行当前目录下的程序a.out却需要提供完整的路径名.l/a.out,这是因为PATH环境变量的值里面包含了ls命令所在的目录/bin,却不包含a.out所在的目录。PATH环境变量的值可以包含多个目录,用:号隔开。在shell 中用echo命令可以查看这个环境变量的值:

        $echo  $PATH

2.SHELL:

        当前Shell,它的值通常是:  /bin/bash

3.TERM:

        当前终端类型,在图形界面终端下的值通常是xterm。终端类型决定了一些程序的输出显示方式,比如图形界面终端可以显示汉字,而字符终端一般不行。

4.LANG.

         语言和 locale,决定了字符编码以及时间、货币等信息的显示格式。

5.HOME

        当前用户主目录的路径,很多程序需要在主目录下保存配置文件,使得每个用户在运行该程序时都有自己的一套配置。

三、进程控制

 *1.fork(重点):

    pid_t fork(void)

    创建子进程。父子进程各自返回。父进程返回子进程pid。 子进程返回 0.

    getpid();getppid();

    循环创建N个子进程模型。 每个子进程标识自己的身份。
 

       (1) fork函数原理:

        (2)创建子进程

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>int main(int argc,char *argv[])
{printf("before fork -1-\n");printf("before fork -2-\n");printf("before fork -3-\n");printf("before fork -4-\n");pid_t pid = fork();if(pid == -1){perror("fork error !\n");exit(1);}else if(pid == 0){printf("child is created\n");}else if(pid > 0){printf("parent process : my child is %d\n",pid);}printf("end of file\n");return 0;
}

  

        循环创建n个子进程

    一次fork函数调用可以创建一个子进程。那么创建N个子进程应该怎样实现呢?简单想

        for(i= 0; i< n; i++)fork()}即可。但这样创建的是N个子进程吗?
 

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>int main(int argc,char *argv[])
{int i;pid_t pid;for(i = 0;i < 5;i++){if(fork() == 0)break;}if(i == 5)printf("I'm parent \n");elseprintf("I'm %dth child\n",i+1);return 0;
}

 

CPU抢夺现象:

如果出现3这种情况,说明子进程没有抢过bash进程,没有争过bash的CPU

避免父进程超越子进程的办法:

增加一个sleep进行延时打印父进程


#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>int main(int argc,char *argv[])
{int i;pid_t pid;for(i = 0;i < 5;i++){if(fork() == 0)break;}if(i == 5){sleep(2);printf("I'm parent \n");}else{sheep(i);printf("I'm %dth child\n",i+1);}return 0;
}

2.getpid和getppid:

getpid():获取当前进程ID

​ pid_t getpid(void);

getppid 函数:获取当前进程的父进程 ID

​ pid_t getppid(void);

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>int main(int argc,char *argv[])
{printf("before fork -1-\n");printf("before fork -2-\n");printf("before fork -3-\n");printf("before fork -4-\n");pid_t pid = fork();if(pid == -1){perror("fork error !\n");exit(1);}else if(pid == 0){printf("child is created,pid = %d,parent-pid:%d\n",getpid(),getppid());}else if(pid > 0){printf("parent process : my child is %d,my pid :%d,my parent_pid:%d\n",pid,getpid(),getppid());}printf("end of file\n");return 0;
}

四、进程共享 

        父子进程之间在 fork后。有哪些相同,那些相异之处呢?

        刚fork 之后: 
        父子相同处:全局变量.data、.text、栈、堆、环境变量、用户ID、宿主目录、进程工作目录、信号处理方式...


        父子不同处:

        1.进程ID                        2.fork返回值              3.父进程ID             

        4.进程运行时间             5.闹钟(定时器)            6.未决信号集
l
      似乎,子进程复制了父进程 0-3G 用户空间内容,以及父进程的 PCB,但 pid 不同,真的每fork一个子进程都要将父进程的 0-3G 地址空间完全拷贝一份,然后在映射至物理内存吗?

      当然不是!  父子进程间遵循读时共享写时复制的原则。这样设计,无论子进程执行父进程的逻辑还是执行自己的逻辑都能节省内存开销。


重点注意!        躲避父子进程共享全局变量的知识误区
【重点】:父子进程共享:

        1.文件描述符(打开文件的结构体)

        2. mmap建立的映射(进程间通信详解)

特别的,fork之后父进程先执行还是子进程先执行不确定。取决于内核所使用的调度算
法。

五、父子进程gdb调试

gdb调试:

    设置父进程调试路径:set follow-fork-mode parent (默认)

    设置子进程调试路径:set follow-fork-mode child

遇到gdb运行时No symbol table is loaded. Use the “file“ command.的解决方法

  1. 首先,GDB已经报错file找不到了,那可以运行file test检测一下
(gdb) file test
Reading symbols from test...(no debugging symbols found)...done.

        2.发现找不到可执行文件,所以问题应该在于编译时候没有加上ggdb3,重新编译一下

ty@ubuntu:~$ gcc -ggdb3 -o main main.c

         3.编译完成再次执行就没有问题了,问题解决

相关文章:

Linux下的系统编程——认识进程(七)

前言&#xff1a; 程序是指储存在外部存储(如硬盘)的一个可执行文件, 而进程是指处于执行期间的程序, 进程包括 代码段(text section) 和 数据段(data section), 除了代码段和数据段外, 进程一般还包含打开的文件, 要处理的信号和CPU上下文等等.下面让我们开始对Linux进程有个…...

2023年9月CSPM-3国标项目管理中级认证报名,找弘博创新

CSPM-3中级项目管理专业人员评价&#xff0c;是中国标准化协会&#xff08;全国项目管理标准化技术委员会秘书处&#xff09;&#xff0c;面向社会开展项目管理专业人员能力的等级证书。旨在构建多层次从业人员培养培训体系&#xff0c;建立健全人才职业能力评价和激励机制的要…...

使用ChatGLMTokenizer处理json格式数据

我下载了一些中文wikipedia数据&#xff0c;准备采用ChatGLMTokenizer对齐进行清洗&#xff0c;整理为预训练语料。 import numpy as np import json from tqdm import tqdm from chatglm_tokenizer.tokenization_chatglm import ChatGLMTokenizertokenizer ChatGLMTokenizer…...

Redis基础特性及应用练习-php

redis持久化&#xff08;persistence&#xff09; redis支持两种方式的持久化&#xff0c;可以单独使用或者结合起来使用。 第一种&#xff1a;RDB方式&#xff08;redis默认的持久化方式&#xff09; rdb方式的持久化是通过快照完成的&#xff0c;当符合一定条件时redis会自…...

Numpy知识点回顾与学习

Numpy知识点回顾与学习 什么是Numpy&#xff1f; Numpy使用Python进行科学计算的基础包。因为机器学习当中很多都会用到数组、线性代数等知识&#xff0c;经常需要和数组打交道&#xff0c;所以Numpy学习成为了科研之路上必须掌握的一门技能。Numpy包含以下的内容&#xff1a…...

H.264视频编码推荐的分辨率和码率配置表

Video Encoding Settings for H.264 Excellence 针对H.264编码格式&#xff0c;根据不同分辨率&#xff0c;推荐其对应的码率配置关系如下图所示&#xff1a; 如下为上限&#xff0c;超过这个上限再增加码率基本无太大意义&#xff01;根据业务场景、帧率&#xff0c;建议码率…...

Greenplum 实用工具-gpaddmirrors

注&#xff1a;本文翻译自https://docs.vmware.com/en/VMware-Greenplum/7/greenplum-database/utility_guide-ref-gpaddmirrors.html gpaddmirrors工具用于向未配置镜像的Greenplum数据库系统添加镜像segment。 语法 gpaddmirrors [-p <port_offset>] [-m <datadi…...

详解 Cent OS JDK 8.0 安装配置

环境配置 云服务器云耀云服务器L操作系统CentOS 7.9 64bit | 公共镜像JDK版本64 bit JDK 1.8 下载地址 JDK官网下载地址Java Downloads | Oraclehttps://www.oracle.com/java/technologies/downloads/#java8百度网盘 ARM64 链接&#xff1a;https://pan.baidu.com/s/1wQ1mp…...

代理IP与网络安全在跨境电商中的关键作用

跨境电商已成为全球商业的重要组成部分&#xff0c;然而&#xff0c;随之而来的网络安全问题也日益凸显。为了在海外市场取得成功&#xff0c;不仅需要优质的商品和服务&#xff0c;还需要稳定、安全的网络连接。本文将介绍如何运用Socks5代理IP技术解决这些挑战。 1. 代理IP与…...

Kafka3.0.0版本——消费者(消费方式)

目录 一、Kafka 消费方式1.1、pull&#xff08;拉&#xff09; 模式1.2、push &#xff08;推&#xff09;模式1.3、Kafka采用pull&#xff08;拉&#xff09; 模式缺点 一、Kafka 消费方式 1.1、pull&#xff08;拉&#xff09; 模式 consumer采用从broker中主动拉取数据。K…...

uni-app rich-text组件富文本图片展示不全问题

背景&#xff1a;phpfastadmin富文本插件上传富文本内容到数据库&#xff0c;uni-app渲染富文本内容。这里后端不需要特殊处理。uni-app的rich-text组件展示图片跑板。直接贴代码。 <template><view><title-bar title"会员动态" back backcolor"…...

文件包含漏洞学习小结

目录 一、介绍 二、常见文件包含函数 三、文件包含漏洞代码举例分析 四、文件包含漏洞利用方式 4.1 本地文件包含 1、读取敏感文件 2、文件包含可运行的php代码 ①包含图片码 ②包含日志文件 ③包含环境变量getshell ④临时文件包含 ⑤伪协议 4.2 远程文件包含 4.…...

同时安装python2和3解决方案

我先安装python3后&#xff0c;按照网上步骤&#xff0c;继续安装好python2&#xff0c;直接运行python -v只能显示python2&#xff0c;运行python3找不到此命令&#xff0c;通过https://blog.csdn.net/qq_64409509/article/details/131514944这篇文章找到了解决方案&#xff0…...

通过jr-qrcode生成二维码并下载到客户端本地(Vue)

生成二维码 首先生成二维码图片的地址 引入jr-qrcode import jrQrcode from jr-qrcode; 生成二维码图片的地址 // 生成二维码地址 getQRCodeUrl(spreadUrl) {const QRCodeUrl jrQrcode.getQrBase64(spreadUrl);return QRCodeUrl; }that.backUrl jrQrcode.getQrBase64(da…...

命令执行漏洞(附例题)

一.原理 应用有时需要调用一些执行系统命令的函数&#xff0c;如PHP中的system、exec、shell_exec、passthru、popen、proc_popen等&#xff0c;当用户能控制这些函数的参数时&#xff0c;就可以将恶意系统命令拼接到正常命令中&#xff0c;从而造成命令执行攻击。 二.利用条…...

iOS开发Swift-类型转换

1.Int或Double转字符串 let x 20 let y "\(x)" let z String(x)2.Double转Int(去掉小数点后面的) Int(1.9)3.Int转Double Double(1)4.向上转型 class A{//A父类 }class B: A{//B子类继承A }let a A() let b B()b as A //子类转化成父类5.向下转型 class A{//A…...

python基础爬虫反爬破解

文章目录 爬虫初识1. HTTP协议与WEB开发&#xff08;1&#xff09;简介&#xff08;2&#xff09;socket套接字&#xff08;3&#xff09;请求协议与响应协议 2. requests&反爬破解&#xff08;1&#xff09;UA反爬&#xff08;2&#xff09;referer反爬&#xff08;3&…...

Maven 必备技能:MAC 系统下 JDK和Maven 安装及环境变量配置详细讲解

开发中难免因系统问题或者版本变更反复折腾JDK和Maven环境变量&#xff0c;干脆写个笔记备忘个&#xff0c;也方便小伙伴们节省时间。 JDK安装与环境变量配置 1.官网下载jdk mac安装包: Java Downloads | Oracle " https://www.oracle.com/java/technologies/downloads…...

electron笔记无边框窗口、DLL调用、DLL函数返回指针

无边框 const win new BrowserWindow({width: 1290,height: 736,minHeight: 736,minWidth: 1040,maxHeight: 736,maxWidth: 1290,frame: false, // 无边框webPreferences: {// preload: process.env.WEBPACK_DEV_SERVER_URL ? __dirname /preload.js : app://./preload.js,…...

递归算法学习——黄金矿工,不同路径III

目录 ​编辑 一&#xff0c;黄金矿工 1.题意 2.题目分析 3.题目接口 4.解题思路及代码 二&#xff0c;不同路径III 1.题意 2.解释 3.题目接口 4.解题思路及代码 一&#xff0c;黄金矿工 1.题意 你要开发一座金矿&#xff0c;地质勘测学家已经探明了这座金矿中的资源…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势&#xff1a;专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发&#xff0c;是一款收费低廉但功能全面的Windows NAS工具&#xff0c;主打“无学习成本部署” 。与其他NAS软件相比&#xff0c;其优势在于&#xff1a; 无需硬件改造&#xff1a;将任意W…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者&#xff1a;来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗&#xff1f;了解下一期 Elasticsearch Engineer 培训的时间吧&#xff01; Elasticsearch 拥有众多新功能&#xff0c;助你为自己…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...