当前位置: 首页 > news >正文

Linux软件编程-进程(1)

1.进程的概念

正在运行的程序,其运行过程中需要消耗内存和CPU。
main.c ---------->a.out ----------------->./a.out
应用程序         可执行程序                  内存
硬盘                  硬盘                           cpu

 

     程序和进程的区别
程序:静态的数据集合,存储在硬盘空间
程序运行起来可以产生进程;
一个程序可以产生多个进程

     进程:是一个程序动态执行的过程,需要消耗内存和CPU,
进程具备动态生命周期,从产生到调度再到消亡
一个进程中也可执行多个程序

                 是操作系统资源分配的最小单位

2.进程的产生

进程产生时,操作系统都会为其分配0-4G的虚拟内存空间。

内核:

1. 文件管理
2. 进程管理
3. 内存管理
4. ...

栈区:

1.保存局部变量
2.函数的形参和返回值
3.保存函数的调用关系(保护现场和恢复现场)

堆区:

1. 由开发人员手动分配
2. 使用完要手动释放

数据区:

data段:1. 已初始化的全局变量 2. 已初始化的静态变量

bss段:1.未初始化的全局变量  2. 未初始化的静态变量(static)-->bss段初始时按位清0

字符串常量区:1. 保存字符串常量   "hello world"

文本区:

1. 存放指令代码   2. 存放常量             eg:'A', 10

3.进程的调度

CPU:数据处理速度快
宏观并行,微观串行

 

cpu调度算法
1、时间片轮询算法
2、先来先服务,后来后服务(任务队列)
3、短作业优先调度
4、高优先级先执行,低优先级后执行

4.进程的状态

操作系统进程进程三态图:

Linux操作系统的进程状态:

 

1.运行态(用户运行态、内核运行态)     R
正在执行,且被CPU任务调度所执行的进程
2.就绪态    R
正在执行,没有CPU任务调度执行的进程(只缺少cpu)
3.可唤醒等待态    S
也称为睡眠态,阻塞等待资源的进程
4.不可唤醒等待态 D
不想被CPU任务调度所打断的进程任务可以设置为不可唤醒等待态
5.暂停态    T
被暂停执行的进程
6.僵尸态    Z
进程执行结束,空间没有被回收

7.结束态    X
进程执行结束,空间被回收

5. 进程的消亡

   1. 进程执行结束(进程退出)
2. 回收进程资源空间

 

     僵尸进程:进程退出后,但其资源空间未被父进程回收
如何避免僵尸进程产生:
1.  子进程退出后,父进程及时为其回收资源空间
2.  让该进程成为一个孤儿进程,结束时被操作系统中的系统进程回收

     孤儿进程:父进程先消亡,其对应的子进程成为一个孤儿进程,会被系统进程所收养
(守护类的进程)

6. 进程相关命令

      PID:进程的ID号
PPID :父进程ID号
父进程:产生子进程的进程称为父进程
子进程:父进程产生出来的新进程即为该父进程的子进程

 

     1. ps  -aux      查看进程相关参数:PID、状态、CPU占有率、内存占有率
ps -aux | grep ./a.out
|  : 管道  :前面命令的输出作为后面命令的输入
grep : 字符串查找:在输入中查找和后面字符串相关的数据                
2. top          动态查看进程的相关参数:CPU占有率、内存占有率

     3. ps -ef         查看该进程的ID和父进程ID

     4. pstree         查看进程的产生关系
pstree -p        查看进程的产生关系(有PID号)

         pstree -sp  进程PID号           查看某个指定的进程的产生关系

     5. kill -信号的编号/信信号的名称  PID         向进程发送信号,让进程的状态发生变化
kill -l         查看系统支持的信号

eg:杀死一个指定的进程

         kill -9 PID
kill -SIGKILL PID
killall -9  进程名称

         有+号表示:前台进程
无+号表示: 后台进程
jobs         查看当前终端的后台进程
fg 后台进程编号         让后台进程切换成前台进程

7.进程相关编程

(1)进程创建

    fork()
getpid(); 获取当前进程自己的PID号
getppid():获取当前进程父进程的PID号

 

 头文件:

       #include <sys/types.h>
#include <unistd.h>

函数接口:

       pid_t fork(void);
功能:通过拷贝父进程产生一个新的子进程
子进程完全拷贝父进程0-3G的虚拟内存空间
子进程拷贝父进程PCB(进程控制块)块中的部分内容:PID不拷贝
返回值:
>0 :父进程 ,是子进程的PID号
==0:子进程
-1 :出错

注意:
1. 子进程完完整整拷贝父进程0-3G虚拟内存空间。
2. 父子进程栈区、数据区、文本区、堆区完全独立,数据不共享
3. 要想共享数据,需要使用进程间通信方式实现

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>int main(int argc, char const *argv[])
{int *p = malloc(sizeof(int));*p = 100;pid_t pid = fork();if(pid > 0){*p = 1000;printf("ppid = %d, pid = %d, *p = %d\n",getpid(), pid, *p);}else if(0 == pid){*p = 10000;printf("pid = %d, ppid = %d, *p = %d\n", getpid(), getppid(), *p);}else{perror("fork error");}return 0;
}

(2)进程调度

操作系统完成

(3)进程消亡

进程退出:return、exit()相关函数

      1)main中return
2) exit ()、_exit() :结束一个进程
exit (0) : 正常退出
exit (非0) :由于进程产生了某种问题,需要主动退出进程

 

http://www.dtcms.com/a/332030.html

相关文章:

  • 【嵌入式C语言】四
  • 【PCB设计经验】3D模型在线预览!效率便捷!
  • pycharm远程连接服务器跑实验详细操作
  • ClickHouse 日常运维命令总结
  • 并发编程原理与实战(二十三)StampedLock应用实战与其他锁性能对比分析
  • CentOS7系统负载异常飙高全链路分析详细指南
  • Kaggle赛题分析1:Elo用户忠诚度评分预测(2)-特征工程与模型训练
  • 解决Python环境混乱问题
  • 【159页PPT】智慧方案企业数字化转型流程体系建设与运营方案(附下载方式)
  • 鸿蒙应用开发实战:模块内页面路由与Navigation导航详解
  • 深入理解提示词工程:从入门到精通的AI对话艺术
  • 零基础-动手学深度学习-10.3. 注意力评分函数
  • [vibe coding-lovable]lovable是不是ai界的复制忍者卡卡西?
  • 《零基础入门AI:深度学习中的视觉处理(卷积神经网络(CNN)进阶)》
  • 光猫 SK-D840N 获取管理员密码和登录Telnet简记
  • 如何永久修改开发板的时间(重启开发板也不会失效)
  • 深度学习-卷积神经网络CNN-膨胀卷积、可分离卷积(空间可分离、深度可分离)、分组卷积
  • 从红警中来学习工厂方法 vs. 抽象工厂
  • C# 异步编程:提高应用程序效率的关键
  • A股大盘数据-20250814 分析
  • mysql如何降级
  • IDEA 插件 Trae AI 全攻略
  • 20道前端性能优化面试题精华
  • 数仓分层架构设计全解析:从理论到实践的深度思考
  • 多模态大模型技术框架汇总
  • cursor中的设置C++无法跳转
  • CMake中add_definitions()的使用指南
  • geoserver sql视图调用Postgis自定义函数问题记录
  • 五种IO模型与非阻塞IO
  • 双椒派E2000D网络故障排查指南