多进程编程
基本概念
进程是一个具有单独功能的程序对某个数据集在处理机上的执行过程,进程也是作为资源分配的一个单位。
进程和程序是相辅相成的,进程是一个动态概念。
进程具有并行性特征。进程具有独立性和异步性。
进程的描述
进程分为三部分:进程控制块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 是首选。 机器学习流水线: 在构建机…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...
20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
