Linux中并发程序设计

2024-01-25 00:04
文章标签 linux 设计 并发程序

本文主要是介绍Linux中并发程序设计,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

进程的创建和回收

进程概念

  • 概念
    程序
    存放在磁盘上的指令和数据的有序集合(文件)
    静态的
    进程
    执行一个程序所分配的资源的总称
    动态的
  • 进程和程序比较
    在这里插入图片描述
    注:进程是存在RAM中,程序是存放在ROM(flash)中的
  • 进程内容
    BSS段:存放程序中未初始化的全局变量
    数据段:已初始化的全局变量,static声明的变量
    代码段:程序执行代码
    堆(heap):malloc等函数分配内存
    栈(stack):局部变量,函数参数,函数的返回值
    进程控制块(pcb):PID, 进程优先级,文件描述符表
  • 进程控制块
    进程标识PID、进程用户、进程状态、优先级、文件描述符表
  • 进程类型
    交互进程:在shell下启动,在前台后台运行
    批处理进程:和在终端无关,被提交到一个作业队列中以便顺序执行
    守护进程:和终端无关,一直在后台运行
  • 进程状态
    运行态、等待态、停止态、死亡态:
    在这里插入图片描述

进程常用命令

  • 查看进程信息
    ps 查看系统进程快照
    top 查看进程动态信息
    /proc 查看进程详细信息
  • 执行命令如下:
    ps:当前shell显示
    在这里插入图片描述
    ps -e :所有进程显示
    在这里插入图片描述
    ps -el:是显示详细信息
  • 具体命令参数信息如下:
    ps 命令详细参数:
    -e:显示所有进程
    -l:长格式显示更加详细的信息
    -f 全部列出,通常和其他选项联用
    表头 含义
    F 进程标志,说明进程的权限,常见的标志有两个:
    1:进程可以被复制,但是不能被执行;
    4:进程使用超级用户权限;
    S 进程状态。进程状态。常见的状态有以下几种:
    1. -D:不可被唤醒的睡眠状态,通常用于 I/O 情况。
    2. -R:该进程正在运行。
    3. -S:该进程处于睡眠状态,可被唤醒。
    4. -T:停止状态,可能是在后台暂停或进程处于除错状态。
    5. -W:内存交互状态(从 2.6 内核开始无效)。
    6. -X:死掉的进程(应该不会出现)。
    7. -Z:僵尸进程。进程已经中止,但是部分程序还在内存当中。
    8. -<:高优先级(以下状态在 BSD 格式中出现)。
    9. -N:低优先级。
    10. -L:被锁入内存。
    11. -s:包含子进程。
    12. -l:多线程(小写 L)。
    13. -+:位于后台。
      UID 运行此进程的用户的 ID;
      PID 进程的 ID;
      PPID 父进程的 ID;
      C 该进程的 CPU 使用率,单位是百分比;
      PRI 进程的优先级,数值越小,该进程的优先级越高,越早被 CPU 执行;
      NI 进程的优先级,数值越小,该进程越早被执行;
      ADDR 该进程在内存的哪个位置;
      SZ 该进程占用多大内存;
      WCHAN 该进程是否运行。"-"代表正在运行;
      TTY 该进程由哪个终端产生;
      TIME 该进程占用 CPU 的运算时间,注意不是系统时间;
      CMD 产生此进程的命令名;
  • 实时查看进程命令如下:
    top 查看进程动态信息
    shift +> 后翻页
    shift +< 前翻页
    top -p PID 查看某个进程
  • 改变进程优先级
    nice 按用户指定的优先级运行进程
    nice [-n NI值] 命令
    NI 范围是 -20~19。数值越大优先级越低
    普通用户调整 NI 值的范围是 0~19,而且只能调整自己的进程。
    普通用户只能调高 NI 值,而不能降低。如原本 NI 值为 0,则只能调整为大于 0。
    只有 root 用户才能设定进程 NI 值为负值,而且可以调整任何用户的进程。
    renice 改变正在运行进程的优先级
    renice [优先级] PID
  • 设置优先级案例如下:
    在这里插入图片描述
  • 改变优先级案例如下:
    在这里插入图片描述
  • 进程相关命令
    jobs 查看后台进程
    bg 将挂起的进程在后台运行
    fg 把后台运行的进程放到前台运行
    ctrl + z 把运行的前台进程转为后台并停止
  • 案例代码如下:
    编写一个.c文件,然后调用一个简单的sleep函数后,执行test后在另一个端口查看进程如下:
    在这里插入图片描述
    注:上述是在运行函数后,按ctrl + Z使其进程进入停止状态T

创建子进程

  • 子进程概念
    子进程为由另一个进程(对应称之为父进程)所创建的进程,实际上你在linux中写程序都是别人创建的,比如运行.test文件时,就是shell的子进程
  • 子进程创建-fork
    #include <unistd.h>
    pid_t fork(void);
    创建新的进程,失败时返回-1
    成功时父进程返回子进程的进程号,子进程返回0
    通过fork的返回值区分父进程和子进程
  • 创建子进程案例如下:
    在这里插入图片描述
    注:创建子进程时虽然会复制父进程的代码,但是不会从头开始执行,而是从创建fork函数下方的时候执行,所以子进程没有赋予相应的进程号,但是系统默认给了0,下面图片显示得很清楚
    在这里插入图片描述
    要点:1 子进程只执行fork之后的代码
    父子进程执行顺序是操作系统决定的。
  • 父子进程
    子进程继承了父进程的内容
    父子进程有独立的地址空间,互不影响
    若父进程先结束
    子进程成为孤儿进程,被init进程收养
    子进程变成后台进程
    若子进程先结束
    父进程如果没有及时回收,子进程变成僵尸进程
  • 父子进程案例如下:
    在这里插入图片描述
  • 运行如下:
    在这里插入图片描述
    注:可以得出父子进程没有什么特定的关系,是系统随机调用的
  • 通过父进程号看出子进程和父进程
    在这里插入图片描述
  • 在用kill -9 杀死父进程,然后可以发现子进程的父进程PPID变成1,也就是init进程中,然后另一个终端ctrl + c结束不掉,说明以及变为后台进程了
    在这里插入图片描述
    注:有些新版的ubuntu系统子进程可能被其他进程领养,例如:systemd作为最新的初始化系统(init)来提高系统的启动速度。这和进程1的init是一个道理不要疑惑。

子进程进阶例题

  • 一个父进程拥有五个子进程,代码如下: 在这里插入图片描述
  • 运行结果如下:
    在这里插入图片描述
    注:可以看出出现了孙进程的情形,因为上述代码中for循环语句,使子进程执行完fork函数下面的语句后,由于for内部是一个循环语句,因此子进程也执行了一次fork函数所以出现孙进程的情形
  • 解决办法如下:
    在这里插入图片描述
    注:在子进程语句中末尾加入break即可

这篇关于Linux中并发程序设计的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/641470

相关文章

基于C++的UDP网络通信系统设计与实现详解

《基于C++的UDP网络通信系统设计与实现详解》在网络编程领域,UDP作为一种无连接的传输层协议,以其高效、低延迟的特性在实时性要求高的应用场景中占据重要地位,下面我们就来看看如何从零开始构建一个完整... 目录前言一、UDP服务器UdpServer.hpp1.1 基本框架设计1.2 初始化函数Init详解

Linux内核定时器使用及说明

《Linux内核定时器使用及说明》文章详细介绍了Linux内核定时器的特性、核心数据结构、时间相关转换函数以及操作API,通过示例展示了如何编写和使用定时器,包括按键消抖的应用... 目录1.linux内核定时器特征2.Linux内核定时器核心数据结构3.Linux内核时间相关转换函数4.Linux内核定时

Linux镜像文件制作方式

《Linux镜像文件制作方式》本文介绍了Linux镜像文件制作的过程,包括确定磁盘空间布局、制作空白镜像文件、分区与格式化、复制引导分区和其他分区... 目录1.确定磁盘空间布局2.制作空白镜像文件3.分区与格式化1) 分区2) 格式化4.复制引导分区5.复制其它分区1) 挂载2) 复制bootfs分区3)

Springboot3统一返回类设计全过程(从问题到实现)

《Springboot3统一返回类设计全过程(从问题到实现)》文章介绍了如何在SpringBoot3中设计一个统一返回类,以实现前后端接口返回格式的一致性,该类包含状态码、描述信息、业务数据和时间戳,... 目录Spring Boot 3 统一返回类设计:从问题到实现一、核心需求:统一返回类要解决什么问题?

Linux服务器数据盘移除并重新挂载的全过程

《Linux服务器数据盘移除并重新挂载的全过程》:本文主要介绍在Linux服务器上移除并重新挂载数据盘的整个过程,分为三大步:卸载文件系统、分离磁盘和重新挂载,每一步都有详细的步骤和注意事项,确保... 目录引言第一步:卸载文件系统第二步:分离磁盘第三步:重新挂载引言在 linux 服务器上移除并重新挂p

Linux下屏幕亮度的调节方式

《Linux下屏幕亮度的调节方式》文章介绍了Linux下屏幕亮度调节的几种方法,包括图形界面、手动调节(使用ACPI内核模块)和外接显示屏调节,以及自动调节软件(CaliseRedshift和Reds... 目录1 概述2 手动调节http://www.chinasem.cn2.1 手动屏幕调节2.2 外接显

Linux(centos7)虚拟机没有IP问题及解决方案

《Linux(centos7)虚拟机没有IP问题及解决方案》文章介绍了在CentOS7中配置虚拟机网络并使用Xshell连接虚拟机的步骤,首先,检查并配置网卡ens33的ONBOOT属性为yes,然后... 目录输入查看ZFhrxIP命令:ip addr查看,没有虚拟机IP修改ens33配置文件重启网络Xh

linux实现对.jar文件的配置文件进行修改

《linux实现对.jar文件的配置文件进行修改》文章讲述了如何使用Linux系统修改.jar文件的配置文件,包括进入文件夹、编辑文件、保存并退出编辑器,以及重新启动项目... 目录linux对.jar文件的配置文件进行修改第一步第二步 第三步第四步总结linux对.jar文件的配置文件进行修改第一步进

linux ssh如何实现增加访问端口

《linuxssh如何实现增加访问端口》Linux中SSH默认使用22端口,为了增强安全性或满足特定需求,可以通过修改SSH配置来增加或更改SSH访问端口,具体步骤包括修改SSH配置文件、增加或修改... 目录1. 修改 SSH 配置文件2. 增加或修改端口3. 保存并退出编辑器4. 更新防火墙规则使用uf

Linux join命令的使用及说明

《Linuxjoin命令的使用及说明》`join`命令用于在Linux中按字段将两个文件进行连接,类似于SQL的JOIN,它需要两个文件按用于匹配的字段排序,并且第一个文件的换行符必须是LF,`jo... 目录一. 基本语法二. 数据准备三. 指定文件的连接key四.-a输出指定文件的所有行五.-o指定输出