Linux高级编程:进程(一)

1、进程

1.1什么是进程:进行中的程序(正在运行中的程序)-process过程

        程序的一次执行过程 - 进程

        hello.c --  程序源代码

        a.out   --  可执行程序

1.2程序和进程的关系:

        程序<------>进程

1.3进程怎么来的:

        程序->加载到内存(运行起来了)-->进程

1.4总结:

进程 ---动态---内存

程序---静态----硬盘

1个程序可以对应一个或多个进程

1.5为什么需要进程

时间片轮转

若要保存上次程序运行到哪了,则需记录-程序的执行状态

则需要进程这个概念了

描述和记录,正在运行中的程序的相关信息。

进程的调度(操作系统,上下文的切换)(让它看起来程序在并发运行,其实每个程序只能运行一小会,且(单核)cpu每次只执行一个程序)

进程的执行特点:微观串行,宏观并行。

最核心的目的:提高效率。

1.6进程的组成:

1、

程序 = 代码 + 数据

bss --- 未初始化的数据 |

data --- 初始化了的数据 | 静态区 | ---数据

text --- 正文段(代码段)

bss -- 未初始化                                                                栈

----                                                                                    堆

data -- 已初始化      --------------./a.out------------>              bss

----                                                                                    data                                           

text -- 代码段                                                                   text

//linux系统下,程序的内存布局                                        //进程的实体

静态区

字符串常量区

代码段  //c语言标准的内存布局

进程 -----

pcb---是一个结构体    Process Control Block

进程 = pcb块 + 各个段(栈 | 堆 | bss | data | text)

1.7进程的生命周期:

通用三态模型:

linux系统下的状态模型:

1.8观察进程的命令:

1、top命令  :观察进程  //类似任务管理器

2、ps

man ps /state

进程状态代码:

D    uninterruptible sleep (usually IO)
R    running or runnable   (on run queue) ---就绪队列中
S    interruptible sleep   (waiting for an event to complete)
T    stopped(暂停态), either by a job control signal or because it is being traced.
*W    paging (not valid since the 2.6.xx kernel)
*X    dead (should never be seen)Z    defunct ("zombie") process, terminated but not reaped(收尸) by its parent.

查看进程相关信息

1.就绪态、运行态 R

2.睡眠态、等待态

        可唤醒等待态 S

        不可唤醒等待态 D

3.停止态 T

4.僵尸态 Z

5.结束态

ps aux | grep 进程名 (pid号)  //当前进程的id号 及 状态

此命令可以察看所有同名文件

ps -eLf | grep 进程名 (pid号)   //可查看父进程id号

ppid(parent  process id)//父进程id

3、pstree

pstree -sp id号 //是两个命令合起来 {pid号(如果不写表示查看全部的)}

查看进程关系

init(1) (1号进程最早出现的一个进程)---- gnome-terminal(xxxx)----bash(xxxx)

4、kill

kill PID

kill 信号编号(-数字) 进程ID

发送信号+PID对应的进程,默认接收者关闭

kill -9 进程PID号 //杀死程序

kill -l //查看信号列表

killall 信号编号 程序名字

5、 fork()

        pid_t fork();      叉子
    一次调用,会返回两次。
    子进程先运行和是父进程先进程,顺序不确定。
    变量不共享。
    
    子进程复制父进程的0到3g空间和父进程内核中的PCB,但id号不同。
    
    功能:通过该函数可以从当前进程中克隆一个同名新进程。
          克隆的进程称为子进程,原有的进程称为 父进程。
          子进程是父进程的完全拷贝。
          子进程的执行过程是从fork函数之后执行。
          
          子进程与父进程具有相同的代码逻辑。

    返回值:int 类型的数字。
            在父进程中:成功 返回值是子进程的pid号 >0
                        失败 返回-1;
            在子进程中:成功 返回值 0
                        失败 无

代码示例:
int main()
{pid_t pid = fork();if(pid < 0){perror("fork fail");return -1;}if(pid >0 ){printf("father---\n");}else if (pid == 0 ){printf("child---\n");}
}

输出:

代码解释:

 父子进程独立操作。

练习:
1、父子进程都死循环。

        a.结束父进程,查看当前系统中父子进程的状态

        b.结束子进程,查看当前系统中父子进程的状态

#include<stdio.h>
#include<unistd.h>int main(int argc, const char *argv[]){pid_t pid = fork();if(pid < 0){perror("fork fail");return -1;}if(pid >0 ){while(1){printf("father---\n");}                                                                                    }else if (pid == 0 ){while(1){printf("child---\n");}}return 0;}                                                                  

 a.结束父进程    //子进程成为后台进程,孤儿进程 --- 子进程还在,父进程不在。(init收养子进程。以前的版本)

b.结束子进程   //子进程结束,父进程还在 父进程没有去收尸 ---子进程呈僵尸态,若此时结束父进程,则子进程的实尸体被系统收养,但系统发现子进程已死则直接销毁回收,不然僵尸态(户口信息)会占用内存。

 2、

自己分别定义一个 static的变量 static int a = 0; 全局变量 int b = 1; 堆区 int *p = (int *)malloc(sizeof(int)); *p = 2; (做修改)父进程中 做加1的操作 ,子进程中做加2的操作 分别打印,查看效果! 同时可以查看一下父子进程的关系(pstree) 父子进程的状态!

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>int b = 1;int main(int argc, const char *argv[])
{static int a = 0;int *p = (int *)malloc(sizeof(int));*p = 2;pid_t pid = fork();if(pid < 0){perror("fork fail");return -1;}//父进程独立代码while(1){if(pid > 0){printf("father a = %d\n",a++);printf("father b = %d\n",b++);printf("father p = %d\n",(*p)++);}//子进程独立代码else if(pid == 0){printf("child a = %d\n",a++);printf("child b = %d\n",b++);printf("child p = %d\n",(*p)++);}sleep(1);}return 0;
}

   父子进程之间不会影响,谁先运行的顺序由操作系统决定,尽可能公平、高效

 

3、面试题:

一次fork生成几个进程? 

他们之间的关系是什么样的? //生成1个一共有两个

如果两次fork同时前后执行,会生成几个进程? //共有(4)个进程

他们之间的关系如何表示,

有多少个子进程,

有没有孙进程?有

4、fork()&&fork()|| fork() 总共有几个进程?

有5个进程

5、

fork();

fork();

fork();  一共有几个进程?  //  2^n个进程

 6、动态生成子进程,并打印输出各自进程的pid号
#include<stdio.h>
#include<unistd.h>int main(int argc, const char *argv[]){pid_t pid = fork();if(pid < 0){perror("fork fail");return -1;}if(pid >0 ){while(1){printf("father---%d\n",getpid());}                                                                                    }else if (pid == 0 ){while(1){printf("child---%d\n",getpid());}}return 0;}                                                                  

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

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

相关文章

【大数据架构(3)】Lambda vs. Kappa Architecture-选择你需要的架构

文章目录 一. Data Processing Architectures1. Lambda Architecture1.1. 架构说明a. Data Ingestion Layerb. Batch Layer (Batch processing)c. Speed Layer (Real-Time Data Processing)d. Serving Layer 1.2. Lambda Architecture的优缺点1.3. 使用案例 2. Kappa Architect…

【论文阅读-PRIVGUARD】Day4:3节

3 PRIVANALYZER&#xff1a;强制执行隐私政策的静态分析 本节介绍PRIVANALYZER&#xff0c;这是一个用于强制执行由PRIVGUARD追踪的隐私政策的静态分析器**。我们首先回顾LEGALEASE政策语言&#xff0c;我们使用它来正式编码政策&#xff0c;然后描述如何静态地强制执行它们**…

论文设计任务书学习文档|基于Web的个性化简历职位推荐系统的设计与实现

文章目录 论文(设计)题目:基于Web的个性化简历职位推荐系统的设计与实现1、论文(设计)的主要任务及目标2、论文(设计)的主要内容3、论文(设计)的基本要求4、进度安排论文(设计)题目:基于Web的个性化简历职位推荐系统的设计与实现 1、论文(设计)的主要任务及目标…

163邮箱SMTP端口号及服务器地址详细设置?

163邮箱SMTP端口号是什么&#xff1f;163邮件SMTP设置教程&#xff1f; 除了基本的邮箱账号和密码外&#xff0c;还需要了解SMTP服务器地址和端口号&#xff0c;以及相应的设置。这些设置对于确保邮件能够顺利发送至关重要。下面&#xff0c;蜂邮EDM将详细介绍163邮箱SMTP端口…

JavaScript 进阶03

编程思想 面向过程 面向过程就是分析出解决问题所需要的步骤&#xff0c;然后用函数把这些步骤一步一步实现&#xff0c;使用的时候再一个一个的依次调用 面向对象 面向对象是把事务分解成为一个个对象&#xff0c;然后由对象之间分工与合作。 在面向对象程序开发思想中&a…

[DEBUG] spring boot-如何处理链接中的空格等特殊字符

问题&#xff1a; get或者post中提交的内容可能有空格、#等特殊字符&#xff0c;不做处理的话可能解析错误。 解决&#xff1a; html中&#xff1a; <a th:href"{/listSgrna(id${item.getGeneId()},geneName${item.getGeneName()},genome${genome},sgrnaNum${sgrnaN…

【MATLAB】SVMD_ MFE_SVM_LSTM 神经网络时序预测算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 SVMD_MFE_SVM_LSTM神经网络时序预测算法结合了单变量分解&#xff08;SVMD&#xff09;、多尺度特征提取&#xff08;MFE&#xff09;、聚类后展开支持向量机&#xff08;SVM&#xff09;…

【文献管理】zotero插件3——翻译与笔记

文章目录 文献翻译——zotero-pdf-translate记笔记——条目笔记记笔记——zoterobetter notes 文献翻译——zotero-pdf-translate 翻译插件zotero-pdf-translate下载划词翻译功能介绍 记笔记——条目笔记 记笔记——zoterobetter notes zotero better notes介绍笔记插件&am…

前后端分离项目Vue+node.js二手商品交易系统74qb3

校园二手交易网络的开发和使用在不同的地方是有着差别的。在初高中&#xff0c;校园二手交易网也就是简单的买卖物品&#xff1b;但在大学中&#xff0c;通过买卖自己的物品可以建立联系成为朋友&#xff0c;也就是说校园二手交易网不仅仅是一个交易物品的平台&#xff0c;同时…

[WebUI Forge]ForgeUI的安装与使用 | 相比较于Auto1111 webui 6G显存速度提升60-75%

ForgeUI的github主页地址:https://github.com/lllyasviel/stable-diffusion-webui-forge Stable Diffusion WebUI Forge 是一个基于Stable Diffusion WebUI(基于Gradio)的平台,可简化开发、优化资源管理并加快推理速度。 “Forge”这个名字的灵感来自于“Minecraft Forge”…

2024深度学习主流框架对比

tensorFlow 是最受欢迎和广泛使用的深度学习框架之一&#xff0c;目前在github的start数为181k。 TensorFlow是一个由Google Brain团队开发的开源深度学习框架。它允许开发者创建多种机器学习模型&#xff0c;包括卷积神经网络、循环神经网络和深度神经网络等&#xff0c;该框架…

【笔记】深度学习入门:基于Python的理论与实现(五)

卷积神经网络 卷积神经网络(Convolutional Neural Network&#xff0c;CNN) 整体结构 CNN 中新出现了卷积层(Convolution 层)和池化层(Pooling 层)&#xff0c;之前介绍的神经网络中&#xff0c;相邻层的所有神经元之间都有连接&#xff0c;这称为全 连接(fully-connected) …