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

多进程编程

基本概念

进程是一个具有单独功能的程序对某个数据集在处理机上的执行过程,进程也是作为资源分配的一个单位。

进程和程序是相辅相成的,进程是一个动态概念。

进程具有并行性特征。进程具有独立性和异步性。

进程的描述

进程分为三部分:进程控制块PCB、程序段、数据集

PCB是标识和描述进程存在及其相关特性的数据块,是进程存在的唯一标识。

系统首先创建其PCB然后根据PCB中的信息对进程进行有效的管理和控制。

PCB包括:进程标识、状态信息、进程的优先级、CPU现场信息、资源清单、队列指针等。

每个进程都由一个task_struct数据结构来表示,task_struct叫做进程控制块或者进程描述符。

task_struct

可分为进程标识符信息PID、进程调度信息、进程间通信信息、时间和定时器信息、进程链接信息、文件系统信息、虚拟内存信息、处理器特定信息等。

1.进程标识符信息

每个进程都有唯一的进程标识符,最大的PID号是32767,进程标识符还包括了用户标识符uid、有效用户标识符euid、组标识符gid、有效组标识符egid等

2.进程调度信息

主要包括调度标志、调度的策略、进程的类别、进程的优先级、进程的状态

状态一般有可运行、可中断等待、不可中断等待、暂停、僵尸等

3.进程链接信息

存储了用于链入进程双向链表的前后指针,指向祖先进程、父进程、子进程、兄弟的指针

4.时间和定时器

内核需要记录进程的创建时间以及在其生命周期中消耗的CPU时间。

5.文件系统信息

进程会经常访问文件系统资源,打开或关闭文件,Linux内核要对进程使用文件的情况进行记录。

6.虚拟内存信息

Linux采用按需分页的策略来解决进程的内存需求,当物理内存不足时,Linux内存管理系统需要把内存中的部分页面交换到外存。

7.处理器特定信息

所有与CPU相关的处理机状态都储存在这。

Linux支持两种进程:普通进程和实时进程。

进程的标识符

用于唯一标识某个进程,在程序运行时,PID不会改变,程序终止之后PID就会被系统回收,以后分配给新的进程。类型pid_t,实际上就是int。

我们可以使用

pid_t getpid(void);

来查看进程的pid

PID文件

PID文件为文本文件,内容只有一行,记录了该进程的id。

用于防止进程启动多个副本。只有获得相应PID文件写入权限的进程才能正常启动,并把自身PID写入该文件中。

通常有两种方法配合PID文件来实现进程的重复启动:文件加锁法、PID读写法。

文件加锁法:进程运行后会给pid文件加一个文件锁,只有获得该锁的进程才有写入权限,其他试图获得该锁的进程会自动退出。加锁函数 fcntl。

PID读写法:先启动的进程往PID中写入自己的进程ID号,然后其他进程判断该PID文件中是否有数据。

tinclude <stdlib.h>
tinclude <stdio.h>
finclude <sys/types.h>
tinclude <sys/stat.h>
tinclude <fcntl.h>
tinclude <unistd.h>
tinclude <string.h>
include <signal.h>static char*starter pid file default ="/var/run/test.pid";static bool check pid(char *pid file)
{struct stat stb;FILE *pidfile;if (stat(pid file,6stb)==0){pidfile = fopen(pid file,"r");if (pidfile){char buf[64];pid_t pid =0;memset(buf,0,sizeof(buf));if (fread(buf,1,sizeof(buf),pidfile)){buf[sizeof (buf)-1]\0';pid = atoi (buf);}fclose(pidfile);if(pid&&kill(pid,0)==0)/检查进程{	/* such a process is running */return 1;}}printf ("removing pidfile '&s',process not running",pid file);unlink (pid file);}return 0;
}
int main()
{FILE *fd = fopen(starter pid file default,"w");if (fd){fprintf (fd,"%u\n",getpid());fclose(fd);}if (check_pid(starter_pid_file_default)){printf("test is already running (%s exists)",starter_pid_file_default);}elseprintf("test is NOT running(%s NOT exists)",starter_pid_file_defult);unlink(starter_pid_file_default);return 0;
}

进程的创建

使用fork创建进程

由fork创建的进程称为子进程,和父进程的属性基本是等同的。但是他们并不共享内存,而是采用写时复制的技术。

#inlcude<unistd.h>
pid_t fork();

使用exec创建进程

#include <unistd.h>
int execl(const char *path,const char *arg,...);
int execlp(const char *file,const char *arg,...);
int execle(const char *path,const char *arg,···,char const envp[]);
int execv(const char *path,char *const argv[]);
int execvpe (const char *file,char *const argv[],char *const envp[]);

进程调度

进程调度就是处理机调度。

任务就是控制和协调进程对CPU的竞争,按照一定的算法是某一就绪程序取得CPU的控制权,转为运行状态。

常用算法有:先来先服务算法,时间片轮转法,优先级算法,多级反馈算法

进程状态转换

进程的分类

前台进程

普通进程

可以通过

ps -e|grep 进程名

来查看

后台进程

在启动时加一个'&'。一般称为job。

守护进程

是运行在后台的特殊进程。独立于终端并周期性的执行某种任务或等待处理某些发生的事件。

它的父进程是init进程,因为它产生以后它的父进程就退出由init继承。

特点

具有超级用户的权限。

守护进程的父进程是init进程。

不用控制终端,tty以'?'表示。

是自己进程组合会话过程的唯一进程。

查看守护进程

ps x或ps axj

相关文章:

多进程编程

基本概念 进程是一个具有单独功能的程序对某个数据集在处理机上的执行过程&#xff0c;进程也是作为资源分配的一个单位。 进程和程序是相辅相成的&#xff0c;进程是一个动态概念。 进程具有并行性特征。进程具有独立性和异步性。 进程的描述 进程分为三部分&#xff1a;…...

7-Zip压缩包如何添加密码,加密后如何取消

压缩包文件大家经常使用&#xff0c;最熟悉的肯定是RAR、ZIP格式压缩文件&#xff0c;但是7z压缩文件格式也很好用&#xff0c;它是三种压缩文件格式中压缩率最大的。想要将文件压缩到最小&#xff0c;使用7z格式可以达到最大化。那么在使用7z压缩格式的时候&#xff0c;我们可…...

HarmonyOS---应用测试概述

一、应用质量要求 应用质量要求分为应用体验质量建议和应用内容合规要求两大部分。 1、应用体验质量建议 功能数据完备、基础体验要求、HarmonyOS特征增强体验要求。 &#xff08;1&#xff09;功能数据完备 &#xff08;2&#xff09;基础体验要求 &#xff08;3&#xff09;增…...

密码学---真题演练

✨Base加密&#xff1a;题目-base? 靶场网址&#xff1a;https://polarctf.com/ Base100加密&#xff01;&#xff01;&#xff01; 得到的新的一串密码是 rot47 密码&#xff0c;属于凯撒密码的一种变体. ✨斐波那契&#xff1a;题目-FB 从第三项开始&#xff0c;每一项都等…...

时间日期工具类

时间日期工具类 import java.time.*; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit;public class DateTimeUtils {private static final String DEFAULT_DATE_FORMAT "yyyy-MM-dd";private static final String DEFAULT_TIME_…...

linux中vim常用命令大全

前言 Linux有大量的配置文件&#xff0c;所以 Linux的文本处理工具也是比较多的&#xff0c;其中编辑一些配置文件时&#xff0c;常用的工具就是 vim。在Linux中&#xff0c;Vim编辑器是一个非常强大的文本编辑工具&#xff0c;它提供了多种模式和命令来满足不同的编辑需求。以…...

计算机的错误计算(八十九)

摘要 探讨反双曲余切函数 acoth(x) 在 附近的计算精度问题。 Acoth(x) 函数的定义为&#xff1a; 其中 x 的绝对值大于 1 . 例1. 计算 acoth(1.000000000002) . 不妨在 Excel 的单元格中计算&#xff0c;则有&#xff1a; 若在Python中用定义直接计算&#xff0c;则有几乎…...

深入理解java并发编程之aqs框架

跟synchronized 相比较&#xff0c;可重入锁ReentrankLock其实原理有什么不同&#xff1f; 所得基本原理是为了达到一个目的&#xff1b;就是让所有线程都能看到某种标记。synchronized通过在对象头中设置标记实现了这一目的&#xff0c;是一种JVM原生的锁实现方式。而Reentran…...

ubuntu配置tftp、nfs

tftp配置 tftp是简单文件传输协议&#xff0c;基于udp实现传输。这里的简单文件&#xff0c;指的是不复杂、开销不大的文件。 先在ubuntu中安装tftp&#xff0c;输入命令&#xff1a;sudo apt-get install tftp-hpa tftpd-hpa。 接着配置tftp。 输入命令&#xff1a;sudo v…...

Sklearn的datasets模块与自带数据集介绍

datasets 模块 用 dir() 函数查看 datasets 模块的所有属性和函数 import sklearn.datasets as datasets# 列出 sklearn.datasets 模块中的所有属性和函数 print(dir(datasets)) datasets 模块下的数据集有三种类型&#xff1a; &#xff08;1&#xff09;load系列的经典数…...

css 个人喜欢的样式 速查笔记

起因&#xff0c; 目的: 记录自己喜欢的&#xff0c; 觉得比较好看的 css. 下次用的时候&#xff0c;直接复制&#xff0c;很方便。 1. 个人 html 模板&#xff0c; 导入常用的 link 设置英语字体: Noto导入默认的 css使用网络 icon 图标导入 Bootstrap css 框架 html <…...

C/C++ let __DATE__ format to “YYYY-MM-DD“

C/C let DATE format to “YYYY-MM-DD” code&#xff1a; #include <iostream> #include <string>class compileDate {// 静态函数&#xff0c;用来格式化并返回编译日期 static std::string formatCompileDate() {// 编译时的日期&#xff0c;格式为 "MMM…...

git如何灵活切换本地账号对应远程github的两个账号

git如何灵活切换本地账号对应远程github的两个账号 问题&#xff1a; 有时候我们会同时维护两个github的账号里面的仓库内容&#xff0c;这时候本地git需要频繁的切换ssh&#xff0c;以方便灵活的与两个账号的仓库可以通信。这篇日记将阐述我是怎么解决这个问题的。1. 第一个账…...

Python中实现函数的递归调用

在Python中&#xff0c;函数的递归调用是一种非常强大且常用的编程技巧&#xff0c;它允许函数在其执行过程中调用自身。递归调用在解决许多问题时都显得尤为方便&#xff0c;比如遍历树形结构、计算阶乘、实现快速排序等。然而&#xff0c;递归也需要谨慎使用&#xff0c;因为…...

Multisim使用手册

目录 原件库&#xff1a; 基础元件库&#xff1a; 最右侧的分析仪们&#xff1a; 示波器&#xff1a; 交流分析&#xff1a; 操作&#xff1a; dB 一、幅频特性曲线 二、相频特性曲线 下载资源&#xff08;有汉化&#xff09;&#xff1a;Multisim 14.0电路设计与仿真…...

线程的六种状态

优质博文&#xff1a;IT-BLOG-CN 线程的状态在Thread.State这个枚举类型中定义&#xff1a;共有6种状态&#xff0c;可以调用线程Thread种的getState()方法获取当前线程状态。 public enum State { /** * 新建状态(New)&#xff1a; * 当用new操作符创建一个线程时&#…...

全球热门剪辑软件大搜罗

如果你要为你的视频进行配音那肯定离不开音频剪辑软件&#xff0c;现在有不少音频剪辑软件免费版本就可以实现我们并不复杂的音频剪辑操作。这次我就给你分享几款能提高剪辑效率的音频剪辑工具。 1.福晰音频剪辑 链接直达>>https://www.foxitsoftware.cn/audio-clip/ …...

swagger-bootstrap-ui页面空白,也没报错

回想起来&#xff0c;代码层面没有进行什么大的调整&#xff0c;增加了配置文件&#xff0c;application.yml中的 spring:profiles:active: sms # dev --> smsname: sms-server swagger配置未调整导致空白 修改profile 问题解决...

15.2 JDBC数据库编程2

15.2.1 数据库访问步骤 使用JDBC API连接和访问数据库&#xff0c;一般分为以下5个步骤: (1) 加载驱动程序 (2) 建立连接对象 (3) 创建语句对象 (4) 获得SQL语句的执行结果 (5) 关闭建立的对象&#xff0c;释放资源 下面将详细描述这些步骤 15.2.2 加载驱动程序 要使…...

Spark数据介绍

从趋势上看&#xff0c;DataFrame 和 Dataset 更加流行。 示例场景 数据仓库和 BI 工具集成&#xff1a; 如果你需要处理存储在数据仓库中的结构化数据&#xff0c;并且希望与 BI 工具集成&#xff0c;那么 DataFrame 和 Dataset 是首选。 机器学习流水线&#xff1a; 在构建机…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化&#xff1a;人工智能的自我改进与监管挑战 文章目录 递归进化&#xff1a;人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管&#xff1f;3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)

引言 在人工智能飞速发展的今天&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;已成为技术领域的焦点。从智能写作到代码生成&#xff0c;LLM 的应用场景不断扩展&#xff0c;深刻改变了我们的工作和生活方式。然而&#xff0c;理解这些模型的内部…...

抽象类和接口(全)

一、抽象类 1.概念&#xff1a;如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象&#xff0c;这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法&#xff0c;包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中&#xff0c;⼀个类如果被 abs…...

Oracle11g安装包

Oracle 11g安装包 适用于windows系统&#xff0c;64位 下载路径 oracle 11g 安装包...