多进程编程
基本概念
进程是一个具有单独功能的程序对某个数据集在处理机上的执行过程,进程也是作为资源分配的一个单位。
进程和程序是相辅相成的,进程是一个动态概念。
进程具有并行性特征。进程具有独立性和异步性。
进程的描述
进程分为三部分:进程控制块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

相关文章:
多进程编程
基本概念 进程是一个具有单独功能的程序对某个数据集在处理机上的执行过程,进程也是作为资源分配的一个单位。 进程和程序是相辅相成的,进程是一个动态概念。 进程具有并行性特征。进程具有独立性和异步性。 进程的描述 进程分为三部分:…...
7-Zip压缩包如何添加密码,加密后如何取消
压缩包文件大家经常使用,最熟悉的肯定是RAR、ZIP格式压缩文件,但是7z压缩文件格式也很好用,它是三种压缩文件格式中压缩率最大的。想要将文件压缩到最小,使用7z格式可以达到最大化。那么在使用7z压缩格式的时候,我们可…...
HarmonyOS---应用测试概述
一、应用质量要求 应用质量要求分为应用体验质量建议和应用内容合规要求两大部分。 1、应用体验质量建议 功能数据完备、基础体验要求、HarmonyOS特征增强体验要求。 (1)功能数据完备 (2)基础体验要求 (3)增…...
密码学---真题演练
✨Base加密:题目-base? 靶场网址:https://polarctf.com/ Base100加密!!! 得到的新的一串密码是 rot47 密码,属于凯撒密码的一种变体. ✨斐波那契:题目-FB 从第三项开始,每一项都等…...
时间日期工具类
时间日期工具类 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有大量的配置文件,所以 Linux的文本处理工具也是比较多的,其中编辑一些配置文件时,常用的工具就是 vim。在Linux中,Vim编辑器是一个非常强大的文本编辑工具,它提供了多种模式和命令来满足不同的编辑需求。以…...
计算机的错误计算(八十九)
摘要 探讨反双曲余切函数 acoth(x) 在 附近的计算精度问题。 Acoth(x) 函数的定义为: 其中 x 的绝对值大于 1 . 例1. 计算 acoth(1.000000000002) . 不妨在 Excel 的单元格中计算,则有: 若在Python中用定义直接计算,则有几乎…...
深入理解java并发编程之aqs框架
跟synchronized 相比较,可重入锁ReentrankLock其实原理有什么不同? 所得基本原理是为了达到一个目的;就是让所有线程都能看到某种标记。synchronized通过在对象头中设置标记实现了这一目的,是一种JVM原生的锁实现方式。而Reentran…...
ubuntu配置tftp、nfs
tftp配置 tftp是简单文件传输协议,基于udp实现传输。这里的简单文件,指的是不复杂、开销不大的文件。 先在ubuntu中安装tftp,输入命令:sudo apt-get install tftp-hpa tftpd-hpa。 接着配置tftp。 输入命令:sudo v…...
Sklearn的datasets模块与自带数据集介绍
datasets 模块 用 dir() 函数查看 datasets 模块的所有属性和函数 import sklearn.datasets as datasets# 列出 sklearn.datasets 模块中的所有属性和函数 print(dir(datasets)) datasets 模块下的数据集有三种类型: (1)load系列的经典数…...
css 个人喜欢的样式 速查笔记
起因, 目的: 记录自己喜欢的, 觉得比较好看的 css. 下次用的时候,直接复制,很方便。 1. 个人 html 模板, 导入常用的 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: #include <iostream> #include <string>class compileDate {// 静态函数,用来格式化并返回编译日期 static std::string formatCompileDate() {// 编译时的日期,格式为 "MMM…...
git如何灵活切换本地账号对应远程github的两个账号
git如何灵活切换本地账号对应远程github的两个账号 问题: 有时候我们会同时维护两个github的账号里面的仓库内容,这时候本地git需要频繁的切换ssh,以方便灵活的与两个账号的仓库可以通信。这篇日记将阐述我是怎么解决这个问题的。1. 第一个账…...
Python中实现函数的递归调用
在Python中,函数的递归调用是一种非常强大且常用的编程技巧,它允许函数在其执行过程中调用自身。递归调用在解决许多问题时都显得尤为方便,比如遍历树形结构、计算阶乘、实现快速排序等。然而,递归也需要谨慎使用,因为…...
Multisim使用手册
目录 原件库: 基础元件库: 最右侧的分析仪们: 示波器: 交流分析: 操作: dB 一、幅频特性曲线 二、相频特性曲线 下载资源(有汉化):Multisim 14.0电路设计与仿真…...
线程的六种状态
优质博文:IT-BLOG-CN 线程的状态在Thread.State这个枚举类型中定义:共有6种状态,可以调用线程Thread种的getState()方法获取当前线程状态。 public enum State { /** * 新建状态(New): * 当用new操作符创建一个线程时&#…...
全球热门剪辑软件大搜罗
如果你要为你的视频进行配音那肯定离不开音频剪辑软件,现在有不少音频剪辑软件免费版本就可以实现我们并不复杂的音频剪辑操作。这次我就给你分享几款能提高剪辑效率的音频剪辑工具。 1.福晰音频剪辑 链接直达>>https://www.foxitsoftware.cn/audio-clip/ …...
swagger-bootstrap-ui页面空白,也没报错
回想起来,代码层面没有进行什么大的调整,增加了配置文件,application.yml中的 spring:profiles:active: sms # dev --> smsname: sms-server swagger配置未调整导致空白 修改profile 问题解决...
15.2 JDBC数据库编程2
15.2.1 数据库访问步骤 使用JDBC API连接和访问数据库,一般分为以下5个步骤: (1) 加载驱动程序 (2) 建立连接对象 (3) 创建语句对象 (4) 获得SQL语句的执行结果 (5) 关闭建立的对象,释放资源 下面将详细描述这些步骤 15.2.2 加载驱动程序 要使…...
Spark数据介绍
从趋势上看,DataFrame 和 Dataset 更加流行。 示例场景 数据仓库和 BI 工具集成: 如果你需要处理存储在数据仓库中的结构化数据,并且希望与 BI 工具集成,那么 DataFrame 和 Dataset 是首选。 机器学习流水线: 在构建机…...
OpenClaw技能扩展:基于nanobot开发自定义自动化模块
OpenClaw技能扩展:基于nanobot开发自定义自动化模块 1. 为什么选择nanobot作为技能开发基础 当我第一次尝试为OpenClaw开发自定义技能时,面对庞大的框架和复杂的依赖关系感到无从下手。直到发现nanobot这个轻量级解决方案,才真正找到了适合…...
旧电脑秒变云服务器:用Proxmox VE打造家庭虚拟化实验室(ZFS配置优化版)
旧电脑秒变云服务器:用Proxmox VE打造家庭虚拟化实验室(ZFS配置优化版) 1. 为什么选择Proxmox VE搭建家庭实验室? 对于个人开发者和技术爱好者来说,拥有一套完整的虚拟化环境是提升技术能力的绝佳途径。Proxmox VE作为…...
AI如何助力人力资源管理:从效率工具到战略伙伴的跃迁
去年某互联网大厂HR负责人跟我说,他们团队用AI筛选简历后,招聘周期从45天缩短到28天,但更让他意外的是——AI还帮他们发现了一个被忽视3年的优质候选人。这个案例折射出AI对人力资源管理的深层改变:不只是提速,更是让H…...
AnotherRedisDesktopManager:让Redis管理变得简单高效的5个理由
AnotherRedisDesktopManager:让Redis管理变得简单高效的5个理由 【免费下载链接】AnotherRedisDesktopManager qishibo/AnotherRedisDesktopManager: Another Redis Desktop Manager 是一款跨平台的Redis桌面管理工具,提供图形用户界面,支持连…...
5年java开发经验总结面试题-内含完整答案
1、讲讲IO里面的常见类,字节流、字符流、接口、实现类、方法阻塞。 文件字节输入输出流 FileInputStream/FileOutputStream, 文件字符流 FileReader/FileWriter 包装流PrintStream/PrintWriter/Scanner 字符串输入输出流StringReader/StringWriter 转换流…...
告别重复劳动:用快马AI自动生成akshare数据清洗与分析流水线
告别重复劳动:用快马AI自动生成akshare数据清洗与分析流水线 金融数据分析中,数据获取和清洗往往是最耗时的环节。每次研究新标的,我们都要重复编写类似的代码:从不同接口获取数据、对齐时间轴、处理缺失值、计算技术指标……这些…...
Welch‘s t-test实战指南:从原理到Python实现
1. 为什么你需要Welchs t-test? 做数据分析时,经常会遇到这样的场景:你想比较两组数据的平均值是否有显著差异,但发现这两组数据的方差不一样,样本量也不同。这时候传统的Students t-test就不太适用了,因为…...
COMSOL中固态锂离子电池的电-热-力耦合仿真:考虑扩散诱导应力、热应力及外部挤压应力的影响
COMSOL 固态锂离子电池仿真 固态锂离子电池电-热-力耦合仿真,考虑了扩散诱导应力,热应力以及外部挤压应力。固态电池鼓包变形的时候,工程师老张盯着屏幕上的应力云图直挠头。这玩意儿明明充满电就膨胀,放完电又缩回去,…...
Nginx 简单使用配置
配置 user nginx; worker_processes auto;error_log /var/log/nginx/error.log notice; pid /var/run/nginx.pid;events {worker_connections 1024; }http {include /etc/nginx/mime.types;default_type application/octet-stream;log_format main $remote…...
收藏!小白也能看懂的大模型如何改写工业效率?
收藏!小白也能看懂的大模型如何改写工业效率? 本文介绍了中控技术的TPT大模型在工业生产中的应用,它通过实时监控、自动计算最优参数和风险预警,帮助企业提升效率、降低成本。与互联网领域的AI应用不同,工业AI的价值更…...
