自学Linux系统软件编程第四天

news/2025/2/25 19:58:11

进程

  1. 概念                                                                                                                                        进程:就是程序执行的过程,包括创建、调度和消亡,是活的
    程序:一段数据的集合,是死的
    进程是操作系统资源分配的最小单元(文本段、数据段、系统数据段
  2. 常用命令                                                                                                                                                             top
    根据CPU占用率查看当前所有进程任务
    PID:唯一识别进程的ID号 ( pid > 0 )
    PPID:父进程的ID
    按q退出top命令
                             ps -ef
    ps -ef | grep a.out 组合命令,查看所有进程中与a.out相关联的内容
                             ps -aux
    查看进程状态(就绪态、运行态 R、可唤醒等待态 S、不可唤醒等待态 D、停止态 T、僵
    尸态 Z、结束态 X)
                             pstree
    查看所有进程的关系
                               kill
    kill -9 进程PID
    killall -9 进程名
    ./a.out &
    在后台执行a.out
  3. 进程创建                                                                                                                                 在32位操作系统中,会为运行进程开辟0 - 4G虚拟内存空间
    分为                                                                                                                                                 文本段
    存储代码和指令
         数据段
    全局变量、静态变量、字符串常量
    在编译时分配空间,程序运行时,将a.out数据段加载到内存数据段中
    程序结束回收数据段空间
    未经初始化值为0值
         系统数据段
    栈区:操作系统管理区域、存放局部变量、执行到变量定义时分配空间,超过变量
    作用域回收变量空间,未经初始化为随机值
    堆区:程序员管理的区域,malloc申请、free释放
          内核
    操作系统核心区域,用户无法访问,负责内存管理、CPU管理、硬件设备管理、进
    程管理、文件系统管理                                                    

  4. 多个进程的存储
    进程的空间是独立的
    单核:一个CPU在同一时刻只能执行一个任务
    宏观并行,微观串行
    物理地址空间是独立的,虚拟地址空间共用同一份,所以多个进程并不是虚拟机地址空间相加                                      

  5. 进程调度
    1. 宏观并行,微观串行
    2. 进程状态:
    R 就绪态:正在运行的任务(没有占用CPU)
    R 运行态:正在运行的任务(占用CPU)
    S 可唤醒等待态:进程挂起等在某个资源到达后继续向下执行
    D 不可唤醒等待态:进程任务挂起直到等到某个信号继续向下执行
    T 暂停态:进程任务挂起,直到CPU发送指令才能继续向下执行
    Z 僵尸态:代码已经执行完毕,空间仍然存在
    X 结束态:代码执行完毕,空间被回收
    3. CPU调度任务规则(进程调度算法)
             1. 一个任务执行完毕后,如何选择下一个执行的任务
             2. 常见进程调度算法:
              先来先执行,后来后执行
              高优先级调度算法                                                                                                                      时间片轮转调度算法
                    时间片:CPU在某个进程任务中执行的一段时间
             多级队列反馈
             负载均衡调度算法                                                                                                                    4. 进程相关的函数接口
    man 2 fork
    pid_t fork(void);
    功能:
    创建一个子进程
    参数:
    缺省
    返回值:
    成功在父进程中返回创建的子进程的PID
    在子进程中返回0
    失败返回-1
    
    
    
    man 3 exit
    void exit(int status);
    功能:
    刷新缓存区,并让进程结束
    参数:
    status:进程结束的状态
    返回值:
    缺省
    man 2 _exit
    void _exit(int status);
    功能:
    进程直接结束
    参数:
    status:进程结束的状态
    返回值:
    缺省
    

  6. 进程消亡
    1. 僵尸进程:
                 1. 什么是僵尸进程?
                 进程执行结束,空间没有被回收,就会成为僵尸进程
    2. 如何避免产生僵尸进程?
                让父进程先结束,子进程会成为孤儿进程,被init进程收养,子进程结束时,init进程回收子进程空间
                子进程结束,父进程回收子进程空间(wait或者waitpid回收子进程空间)
    1. 进程回收函数接口
      ==========wait============
      man 2 wait
      pid_t wait(int *wstatus);
      功能:
      回收进程空间
      参数:
      wstatus:存放进程结束状态空间首地址
      返回值:
      成功返回回收到的子进程的PID
      失败返回-1
      WIFEXITED(wstatus)
      子进程是否正常结束
      WEXITSTATUS(wstatus)
      子进程结束的状态
      WIFSIGNALED(wstatus)
      是否被信号杀死
      WTERMSIG(wstatus)
      获得杀死进程信号的编号
      注意:
      1.wait具有阻塞功能,子进程不结束,父进程会一直wait直到子进程结束,再回收子进程空
      间
      2.wait回收任意一个子进程空间
      3.wait具有同步的功能
      =========waitpid=============
      man 2 waitpid
      pid_t waitpid(pid_t pid, int *wstatus, int options);
      功能:
      回收某个指定的子进程空间
      参数:
      pid:要回收的进程空间的ID号
      -1 回收任意一个子进程空间
      wstatus:存放子进程结束状态空间首地址
      options:
      0 阻塞回收
      WNOHANG 非阻塞回收
      返回值:
      成功返回回收到子进程的PID
      失败返回-1
      如果没有回收到子进程空间返回0
      ==========exec函数族==========
      extern char **environ;
      int execl(const char *path, const char *arg, ...
      /* (char *) NULL */);
      int execlp(const char *file, const char *arg, ...
      /* (char *) NULL */);
      int execle(const char *path, const char *arg, ...
      /*, (char *) NULL, char * const envp[] */);
      int execv(const char *path, char *const argv[]);
      int execvp(const char *file, char *const argv[]);
      int execvpe(const char *file, char *const argv[],
      char *const envp[]);
      功能:
      利用该进程空间执行另一份代码
      l:参数以列表形式传递
      v:参数以指针数组形式传递
      p:在系统环境变量path对应的路径下找文件
      e:执行新代码时更新环境变量
      注意:
      fork+exec用来启动一个新的软件/系统应用

       


http://www.niftyadmin.cn/n/5865907.html

相关文章

vue2中,打包报错ERROR in /node_modlules/@types/lodash/common/common.d.ts 26

报错如下: 解决 尝试安装lodash另外一个版本,然后重新打包 npm install --save types/lodash4.14.74

WPS计算机二级•文档的页面设置与打印

听说这是目录哦 纸张大小页边距和装订线❤️‍🔥打印界面讲解❤️缩印💕打印作文稿纸💞将文档打印成书籍💓限制编辑设置💗给文字文档加密💖文档导出为 PDF格式💘协作编辑模式💝能量站…

使用 Apache Jena 构建 RDF 数据处理与查询服务

一、引言 随着语义网和知识图谱技术的不断发展,RDF(Resource Description Framework)作为一种用于描述资源的框架,被广泛应用于知识表示和数据集成。Apache Jena 是一个功能强大的 Java 框架,用于处理 RDF 数据和 SPA…

Spring Boot 中的日志管理

一、日志框架选择 1. 主流框架对比 框架特点Spring Boot 默认支持Logback- 性能优异,Spring Boot 默认集成- 支持自动热更新配置文件✅ (默认)Log4j2- 异步日志性能更强- 支持插件扩展- 防范漏洞能力更好❌ (需手动配置)JUL (JDK自带)- 无需额外依赖- 功能简单&am…

《深度剖析Linux 系统 Shell 核心用法与原理_666》

1. 管道符的用法 查找当前目录下所有txt文件并统计行数 # 使用管道符将ls命令的结果传递给wc命令进行行数统计 ls *.txt | wc -l 在/etc目录下查找包含"network"的文件并统计数量 # 使用find命令查找文件,并通过grep查找包含特定字符串的文件&#xf…

永洪科技旗下BI产品,成功入选“金融信创优秀解决方案“

3月28日至29日,金融信创生态实验室在京举办金融信创解决方案研讨会,发布第三期金融信创优秀解决方案、实验室推荐解决方案,启动解决方案的分享活动。 永洪科技凭借旗下的敏捷BI数据分析平台,成功入选“金融信创优秀解决方案&…

【FAQ】HarmonyOS SDK 闭源开放能力 —Ads Kit(2)

1.问题描述: 应用需要获取一个唯一不变的标识生成deviceID。 当前通过OAID生成,但每次重启PC样机,获取到的OAID都会变化,无法满足唯一不变的需求。 解决方案: 需要获取一个唯一不变的标识,可以尝试使用O…

嵌入式项目:STM32刷卡指纹智能门禁系统

本文详细介绍基于STM32的刷卡指纹智能门禁系统。 获取资料/指导答疑/技术交流/选题/帮助,请点链接: https://gitee.com/zengzhaorong/share_contact/blob/master/stm32.txt 1 系统功能 1.1 功能概述 本系统由STM32硬件端(下位机)…