6、进程理论和简单进程创建

一、了解进程推荐看这个视频,很详细

1、概念

  • 进程(Process)=程序的运行过程,是系统进行资源分配和调度的独立单元
  • 程序的运行过程:多个不同程序 并发,同一个程序同时执行多个任务。
    • 就需要很多资源来实现这个过程
  • 每个进程都有一个独立的地址空间【空间由0开始扩大,直到最大值,成一个连续的空间】。在这个空间里,进程能够执行读写操作,存放可执行的程序代码、程序运行所需的资源以及函数调用和局部变量存储的栈结构。
  • 进程控制块PCB):
    • 是一个数据结构
    • 描述进程的基本情况和运行状态
    • 为控制和管理提供数据依据

2、访问linux的进程方法

那么如何查看进程?
基本语法:ps 选项
a:显示当前终端下的所有进程信息,包括其他用户的进程
u:以用户为主的进程状态
x:通常与 a 这个参数一起使用,显示当前用户在所有终端下的进程信息
-e:显示系统内所有的进程信息
-l:使用长格式显示进程信息
-f:使用完整的格式显示进程信息
在这里插入图片描述

//使用ps -aux
ps -aux

在这里插入图片描述

ps -elf

在这里插入图片描述

top
q       退出显示
top -d  默认三秒,指定top命令每隔几秒刷新
top -i  使用top不显示任何闲置或者僵死的进程
top -p  通过指定监控ID来仅仅监考某个进程的状态
例如:
top -d 10  每10秒刷新1次
  • top命令将会在当前终端以全屏交互式的界面显示进程排名,及时跟踪CPU、内存等系统资源占用情况,默认情况下每三秒刷新一次,其作用类似于windows系统中的任务管理器。
    在这里插入图片描述
    在这里插入图片描述
pgrep 
  • 使用pgrep命令可以根据进程的名称、运行该进程的用户、进程所在的终端等多中属性查询特定进程的PID号
pstree  选项
-u  显示进程的用户名
-p  显示进程号(PID)
  • 将进程以树形的结构展现出来

3、删除进程

kill 进程号   删除进程
kill -9 进程号 强制删除进程 

4、进程的文件

  • 在**/proc/里面**
    在这里插入图片描述
    这些蓝色的就是进程号。

二、进程模型

严格来说,一个CPU核心在任一时刻仅能执行一个线程的任务,即便是系统配置有双核心(或更多CPU)时每个核心也是独立地且一次仅执行一个线程

  • 进程的组成
    • 1、代码段和相关数据段
    • 2、PCB(进程控制块)
      • 2.1、PCB包含的信息
      • ①进程标识符PID
      • ②进程控制管理信息
      • ③资源清单
      • ④进程调度信息
      • ⑤处理机状态
      • 2.2、PCB是什么?
      • ①是一个数据结构
      • ②描述进程的基本情况和运行状态
      • ③为管理和控制提供数据依据
  • 抽象的角度看,每个进程似乎都配备了专属的虚拟CPU以支持其独立执行,但物理程度上,CPU通过时间片机制在多个进程间进行快速切换从而并发执行的假象。【简而言之:抽象看是每个进程都有一个CPU;物理上看是只有一个CPU供所有进程使用,进程用时间片机制来快速切换,像并发一样。】
  • 如下图【物理上看】:

在这里插入图片描述

  • 如下图【抽象上看】

在这里插入图片描述

  • 所以可以发现:
    • 在经历足够长的一段时间后,所有的进程都运行了,但实际上在任何一个给定的瞬间仅有一个进程真正运行
    • 所以它们实际上是这样运行【A运行一点时间,就给B运行,B运行一点给C运行,如果需要回到A,就使用PCB,PCB记录了之前的状态。】的,如下图:
    • 在这里插入图片描述
  • PCB进程控制管理信息
    • 代码段和数据段的地址
    • 进程同步和通信信息
    • 资源清单地址
    • 进程队列指针
  • PCB处理机状态
    • 处理机中寄存器的内容
    • 作用:CPU切换时保存现场信息和回复现场信息。
  • PCB进程标识符
    • 进程号
  • PCB资源清单
    • 内存地址
    • 虚拟地址
    • 打开文件列表
    • I/O设备信息
  • PCB进程调度信息
    • 进程状态
    • 优先级
    • 等待和使用CPU时间总和
    • 进程调度和对换依据
  • 进程与进程之间怎么数据交换?
    • 依靠操作系统内核

    • 在这里插入图片描述

    • 但是从上图可知:进程1和进程2是独立的个体。似乎不相互影响。

  • 我们通过2段代码来理解【推荐先看下面部分的编程再看这里
  • 首先是创建一个全局变量 global_vary = 100 。再在child函数里改global_vary =200 。然后我们运行代码,得到结果如下图:
  • 会发现,parent还是100 。child的是200 。

在这里插入图片描述

#include<stdio.h>
#include<stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int global_vary = 100;//创建了一个全局变量
void child(){global_vary =200;printf("in child process:%d global_vary:%d \n",getpid(),global_vary);
}
void parent(){sleep(3);//休眠3秒后,再运行。printf("int parent process:%d global_vary:%d \n",getpid(),global_vary);
}
int main(){pid_t pid;pid=fork();if(pid<0){perror("fork have problem\n");exit(0);//释放pid}else if(pid==0){//childchild();}else if(pid>0){parent();}return 0;}
  • 使用sleep 修改
  • 让 子进程结束变慢。
    在这里插入图片描述
#include<stdio.h>
#include<stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int global_vary = 100;//创建了一个全局变量
void child(){global_vary =200;printf("in child process:%d global_vary:%d \n",getpid(),global_vary);sleep(3);
}
void parent(){sleep(1);        printf("int parent process:%d global_vary:%d \n",getpid(),global_vary);
}
int main(){pid_t pid;pid=fork();if(pid<0){perror("fork have problem\n");exit(0);//释放pid}else if(pid==0){//childchild();}else if(pid>0){parent();}return 0;}

就会发现结果还是 200 ,100 。
这就能体现出他们是独立的
它们是独立占用 0-3G虚拟空间。

三、进程的创建

1、了解情况

  • 随机分配,谁先获得CPU的使用权
  • 通过返回值来区分父子进程
  • 返回是2次,一次是父进程的,另一次是子进程的
  • 子父进程共享文件

2、简单编程实现

2.1、getpid和getppid和fork

  • fork() 的作用
    • fork() 会创建一个子进程,父进程返回子进程的 PID,子进程返回 0
    • 如果 fork() 失败(如系统资源不足),返回 -1,并进入错误处理。
  • getpid() 和 getppid()
    • getpid():返回当前进程PID
    • getppid():返回当前进程父进程 PID
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>int main() {pid_t pid;pid = fork();if (pid < 0) {perror("fork failed\n");exit(1);} else if (pid == 0) {printf("子进程: PID = %d, PPID = %d\n", getpid(), getppid());} else {printf("父进程: PID = %d, PPID = %d\n", getpid(), getppid());wait(NULL);  // 父进程等待子进程结束}return 0;
}

2.2、sleep

如果我想让子进程先运行,父进程后运行。就可以使用sleep(时间) 。这里的时间是默认按秒的时间,休眠作用。


#include<stdio.h>
#include<stdlib.h>
#include <sys/types.h>
#include <unistd.h>void child(){printf("in child process:%d \n",getpid());
}
void parent(){sleep(3);//休眠3秒后,再运行。printf("int parent process:%d \n",getpid());
}
int main(){pid_t pid;pid=fork();if(pid<0){perror("fork have problem\n");exit(0);//释放pid}else if(pid==0){//childchild();exit(0);}else if(pid>0){parent();exit(0);}return 0;}

在这里插入图片描述

2.3、execlp和excvp

  • execvpexeclp很像,只是参数的写法不同
  • 都通过PATH的方式查找。
    • execvp的参数是指针数组
    • execlp的参数是可变参数列表
#include <unistd.h>int main() {execlp("ls", "ls", "-l", NULL);  // 等价于 execvp("ls", {"ls", "-l", NULL})perror("execlp failed");return 1;
}
  • exlvp的作用:
    • 用于 替换当前进程的映像即运行另一个程序,当前进程的代码和数据会被新程序覆盖 。替换后,原进程的代码不会执行了。)。
函数原型
#include <unistd.h>
int execvp(const char *file, char *const argv[]);
argv以NULL结尾
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>int main(){pid_t pid;pid=fork();if(pid<0){perror("fork have problem\n");exit(0);//释放pid}else if(pid==0){//替换成当前父进程的上下文,替换成新的进程静态数据区int ret=execlp("ls","ls","-l",NULL);if(ret<0){perror("execlp error");exit(-1);}printf("================================\n");exit(0);}else if(pid>0){//父进程回收子进程的资源getchar();wait(NULL);//阻塞接口,等待一个事件的发生}return 0;}

3、创建进程中的指令总结

exit(数字)   用来终止执行
fork         创建进程
wait         接收另一个进程的退出[阻塞接口]
sleep        休眠
execlp       替换当前进程的映像
  • fork 子进程诞生,此时父进程是副本
  • exec系列调用,替换成静态区
  • exit系统调用,结束,变成僵尸
  • wait系统调用,回收资源,已经变成僵尸状态的子进程的资源。

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

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

相关文章

Java通信

Trae - AI 原生 IDE目录 同步代码块 ​编辑 同步方法​编辑​编辑 二者对比 ​编辑 lock对象 通信 cs架构​编辑​编辑​编辑 mac地址&#xff0c;物理地址​编辑 取地址​编辑 127 0 0 1和IP 127.0.0.1和ipconfig获得的IP地址是什么关系 。127.0.0.1 和通过 ipcon…

K8S学习之基础五十八:部署nexus服务

部署nexus服务 Nexus服务器是一个代码包管理的服务器&#xff0c;可以理解 Nexus 服务器是一个巨大的 Library 仓库。Nexus 可以支持管理的工具包括 Maven &#xff0c; npm 等&#xff0c;对于 JAVA 开发来说&#xff0c;只要用到 Maven 管理就可以了。Nexus服务器作用&#x…

hackmyvm-reversteg

arp-scan -l nmap -sS -v 192.168.222.45 在源码中可以看到 根据下面的提示可以猜测117db0148dc179a2c2245c5a30e63ab0是一个图像文件 将图片下载到本地 隐写术 在两张图片上使用strings,发现有一些可打印的字符串 strings 117db0148dc179a2c2245c5a30e63ab0.jpg base64解码…

通过国内源在Ubuntu20.0.4安装repo

国内三大免费源&#xff1a; 清华大学&#xff1a;清华大学开源软件镜像站 | Tsinghua Open Source Mirror中国科技大学&#xff1a;USTC Open Source Software Mirror阿里云&#xff1a;阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区 repo只在清华源网站里搜到&#xff1a;…

基于EFISH-SBC-RK3576的无人机智能飞控与数据存储方案

一、方案背景 民用无人机在电力巡检、农业植保、应急救援等领域快速普及&#xff0c;但传统方案面临‌多协议设备兼容性差‌、‌野外环境数据易丢失‌、‌复杂电磁干扰‌三大痛点。 电鱼智能推出‌EFISH-SBC-RK3576‌&#xff0c;可集成双冗余总线接口与工业级加固存储&#x…

飞牛NAS本地部署小雅Alist结合内网穿透实现跨地域远程在线访问观影

文章目录 前言1. VMware安装飞牛云&#xff08;fnOS&#xff09;1.1 打开VMware创建虚拟机1.3 初始化系统 2. 飞牛云搭建小雅Alist3. 公网远程访问小雅Alist3.1 安装Cpolar内网穿透3.2 创建远程连接公网地址 4. 固定Alist小雅公网地址 前言 嘿&#xff0c;小伙伴们&#xff0c…

Java多线程与高并发专题—— CyclicBarrier 和 CountDownLatch 有什么异同?

引入 上一篇我们了解CountDownLatch的原理和常见用法&#xff0c;在CountDownLatch的源码注释中&#xff0c;有提到&#xff1a; 另一种典型用法是将一个问题分解为 N 个部分&#xff0c;用一个Runnable描述每个部分&#xff0c;该Runnable执行相应部分的任务并对闭锁进行倒计…

自建隐私优先的元搜索引擎:SearXNG 部署全指南

一、SearXNG 简介 SearXNG 是一款开源的元搜索引擎,通过聚合 Google、Bing、DuckDuckGo 等 70 多个搜索引擎的结果,为用户提供无广告、无追踪的搜索体验。其核心特性包括: 隐私保护:不记录用户 IP、搜索记录或使用 Cookie。多格式输出:支持 HTML 和 JSON 格式,便于与其他…

新手SEO优化实战快速入门

内容概要 对于SEO新手而言&#xff0c;系统化掌握基础逻辑与实操路径是快速入门的关键。本指南以站内优化为切入点&#xff0c;从网站结构、URL设计到内链布局&#xff0c;逐层拆解搜索引擎友好的技术框架&#xff1b;同时聚焦关键词挖掘与内容策略&#xff0c;结合工具使用与…

递归、搜索、回溯算法

记忆化搜索算法 记忆化搜索是一种将动态规划与递归相结合的算法&#xff0c;它通过记录已解决的子问题的解来避免重复计算&#xff0c;从而提高算法的效率。它主要用于解决具有重叠子问题性质的问题&#xff0c;例如斐波那契数列的计算、最短路径问题等。记忆化搜索的实现通常采…

Windows 10 ARM64平台MFC串口程序开发

Windows 10 IoT ARM64平台除了支持新的UWP框架&#xff0c;也兼容支持老框架MFC。使得用户在Windows 10 IoT下可以对原MFC工程进行功能升级&#xff0c;不用在新框架下重写整个工程。熟悉MFC开发的工程师也可以在Windows 10 IoT平台下继续使用MFC进行开发。 本文展示MFC串口程序…

browser-use 库网页元素点击测试工具

目录 代码代码解释输出结果 代码 import asyncio import jsonfrom browser_use.browser.browser import Browser, BrowserConfig from browser_use.dom.views import DOMBaseNode, DOMElementNode, DOMTextNode from browser_use.utils import time_execution_syncclass Eleme…

vue 点击放大,图片预览效果

背景&#xff1a; 在vue框架element组件的背景下&#xff0c;我们对图片点击放大(单张)&#xff1b;如果是多张图片&#xff0c;要支持左右滑动查看多张图片(多张)。 图片单张放大&#xff0c;el-image图片组件&#xff0c;或者原生的img标签。previewSrcList string[单个] 图片…

个人学习编程(3-27) leetcode刷题

合并两个有序链表&#xff1a; 当我们执行 current->next node; 时&#xff0c;current 最初指向的是 dummy 节点&#xff0c;因此这行代码实际上是&#xff1a; dummy->next node; /*** Definition for singly-linked list.* struct ListNode {* int val;* st…

游戏引擎学习第177天

仓库:https://gitee.com/mrxiao_com/2d_game_4 今日计划 调试代码有时可能会非常困难&#xff0c;尤其是在面对那些难以发现的 bug 时。显然&#xff0c;调试工具是其中一个非常重要的工具&#xff0c;但在游戏开发中&#xff0c;另一个非常常见的工具就是自定义的调试工具&a…

【MySQL】MySQL结构体系及核心组件功能是怎样的?

简要回答&#xff1a; MySQL采用三层架构&#xff1a;连接层处理网络连接和认证&#xff1b;服务层包含SQL解析、优化器等核心功能&#xff1b;存储引擎层插件式支持InnoDB等引擎。其中InnoDB通过redo log 实现事务持久性&#xff0c;优化器负责选择最优执行计划。 1.MySQL整体…

VR视频加密是如何实现的对视频保护?

如今VR&#xff08;虚拟现实&#xff09;技术正以前所未有的速度改变着我们的生活和工作方式。从沉浸式的游戏体验到远程教育、企业培训、医疗康复等多个领域&#xff0c;VR视频的应用场景不断拓展&#xff0c;为人们带来了全新的视觉盛宴。然而&#xff0c;随着VR视频的广泛应…

Faster RCNN Pytorch 实现 代码级 详解

基本结构&#xff1a; 采用VGG提取特征的Faster RCNN. self.backbone:提取出特征图->features self.rpn:选出推荐框->proposals self.roi heads:根据proposals在features上进行抠图->detections features self.backbone(images.tensors)proposals, proposal_losses…

LabVIEW时间触发协议

介绍了基于LabVIEW开发的时间触发协议应用&#xff0c;通过实例解析了FlexRay总线的设计与优化。通过技术细节、系统构建和功能实现等方面&#xff0c;探讨了LabVIEW在现代工业通信系统中的应用效能&#xff0c;特别是在提高通信可靠性和实时性方面的贡献。 ​ 项目背景 在工…

Linux 进程3-fork创建子进程继承父进程缓冲区验证

目录 1. fork创建子进程继承父进程缓冲区验证 1.1 write向标准输出&#xff08;终端屏幕&#xff09;写入数据验证 1.1.1 write函数写入数据不带行缓冲刷新 \n 1.1.2 write函数写入数据带行缓冲刷新 \n 1.2 fork创建前执行printf函数 1.2.1 fork创建前执行printf函数带\n…