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

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

linux-基础知识3

打包和压缩 zip 安装zip软件包 yum -y install zip unzip 压缩打包命令: zip -q -r -d -u 压缩包文件名 目录和文件名列表 -q:不显示命令执行过程-r:递归处理,打包各级子目录和文件-u:把文件增加/替换到压缩包中-d:从压缩包中删除指定的文件 解压:unzip 压缩包名 打包文件 把压缩包从服务器下载到本地 把压缩包上传到服务器(zip

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

怎么让1台电脑共享给7人同时流畅设计

在当今的创意设计与数字内容生产领域,图形工作站以其强大的计算能力、专业的图形处理能力和稳定的系统性能,成为了众多设计师、动画师、视频编辑师等创意工作者的必备工具。 设计团队面临资源有限,比如只有一台高性能电脑时,如何高效地让七人同时流畅地进行设计工作,便成为了一个亟待解决的问题。 一、硬件升级与配置 1.高性能处理器(CPU):选择多核、高线程的处理器,例如Intel的至强系列或AMD的Ry

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念

Linux服务器Java启动脚本

Linux服务器Java启动脚本 1、初版2、优化版本3、常用脚本仓库 本文章介绍了如何在Linux服务器上执行Java并启动jar包, 通常我们会使用nohup直接启动,但是还是需要手动停止然后再次启动, 那如何更优雅的在服务器上启动jar包呢,让我们一起探讨一下吧。 1、初版 第一个版本是常用的做法,直接使用nohup后台启动jar包, 并将日志输出到当前文件夹n

[Linux]:进程(下)

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:Linux学习 贝蒂的主页:Betty’s blog 1. 进程终止 1.1 进程退出的场景 进程退出只有以下三种情况: 代码运行完毕,结果正确。代码运行完毕,结果不正确。代码异常终止(进程崩溃)。 1.2 进程退出码 在编程中,我们通常认为main函数是代码的入口,但实际上它只是用户级