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

自学嵌入式第二十七天:Linux系统编程-进程

一、进程

1.进程是一个程序执行的过程,会去分配内存(mem)、固态硬盘(ssd)和CPU等;需要多任务并发使用进程;

2.pcb(管理进程) - process control block 

               是一个结构体;

                        PID进程标识符;

                        当前工作路径chdir;

                        umask 0002(权限);

                        进程打开的文件列表 文件IO中有提到;

                        信号相关设置,处理异步IO;

                        用户id,组id;

                        进程资源的上限;

                        ulimit -a,显示资源上限;

3.进程和程序的区别

        程序是静态的,在硬盘中代码、数据和操作的集合;

        进程是动态的,程序执行的过程包括进程的创建、调度和消亡;

        在运行之前是程序,运行之后是进程;

        (1)程序是永存的,进程是短暂的;

        (2)进程有程序状态的变化,程序没有;

        (3)进程可以并发,程序无并发;

        (4)进程与进程会存在竞争计算机的资源;

        (5)一个程序可以运行多次;变成多个进程;一个进程可以运行一个或多个程序;

        (6)内存分布:0-3G是进程的空间;3G-4G是内核的空间,

                虚拟地址-物理内存和虚拟内存的地址,映射表1page=4k;

                有硬件mmu专门转换物理内存和虚拟内存;

4.内存分布(0-3G)

        code段:代码段,只读;

        data段:全局变量,静态,可读可写;

        heap段:堆,大段内存空间,<3G

        share/map:共享区、映射区,实现printf等,存放动态库共享库libc.so

        stack:8M,放局部变量,函数调用参数,返回地址;

        以上都是虚拟空间,起隔离作用,以防不同进程篡改其他地址,还能区分不同进程的权限;

5.可执行文件

        linux的可执行文件(ELF|code|data)是ELF类型;

6.进程分类

        (1)交互式进程

        (2)批处理进程 shell脚本

        (3)守护进程

7.进程的状态

        (1)就绪态:刚运行程序,可以运行,但CPU在运行别的进程;

        (2)运行态:在就绪态经过CPU的调度;

        (3)阻塞态:代码希望往下走,但某条件没有就绪,被迫阻塞,例如scanf,条件满足后进入就绪态;

8.进程调度,上下文切换

        在cpu调度时,前一个进程把数据存入ssd;

        在寄存器里保存pc、ip指针(指向下一次执行的位置)pcb;

9.调度算法

        (1)先来先服务:先运行先走完;

        (2)短任务优先;

        (3)多级任务队列:运行过就把优先级减一;

        (4)时间片轮转:优先级平级;

10.内核

        内核的主要功能:进程调度,硬件,bios,io,文件系统,驱动;

11.宏观并行,微观串行

12.查询进程相关命令

        (1)ps aux 查看进程相关信息(PID、CPU和内存占用率、终端、运行状态、时间、名字)

        ps -ejH打印一个process tree;

        ps -elF查看线程;

        (2)top 根据CPU占用率查看进程相关信息和进程个数;

        (3)kill和killall发送一个信号

        kill -l查看所有可发送的信号;

        kill -2 PID 发送信号+PID对应的进程,默认接收者关闭,可以不写-2,默认发送15号信号;

        killall -9 进程名 发送信号进程名对应的所有进程;(9是强制关闭)

13.sudo apt install 软件名,安装软件(ubuntu,其它用dnf install)

14.fork

        pid_t fork();产生第二个进程(子进程);

        调用一次会返回两次;子进程先运行还是父进程先运行不确定;变量不共享;

        第一次返回时,是父在运行,返回的是子的pid;第二次返回时,是子在运行,返回值是0;

15.getpid

        get_t getpid(void)获得调用该函数进程的PID;

16.getppid

        get_t getppid(void)获得父进程的PID;

17.父子进程的关系

        子进程是父进程的副本;

        子进程获得父进程数据段,堆,栈,正文段共享;

        写时复制:一样的部分不用复制,用一个系统指针指过去,不一样的部分才会开辟对应的空间;cow:copy on write 

        在fork之后,如果非要确定哪个要先运行,需要IPC机制;

18.进程的终止情况:

        (1)main中的return;

        (2)exit(),c库的函数,会执行io库的清理工作,关闭所有的流以及打开的文件;

        (3)_exit(有清理但不完全)、_Exit会关闭所有的已经打开的文件,不执行清理函数;

        (4)主线程退出;

        (5)主线程调用pthread_exit;

        (6)abort();异常终止;

        (7)signal:kill pid;

        (8)最后一个线程被pthread_cancle;

19.进程的退出

        退出后有僵尸进程和孤儿进程两种情况;

        父子进程的父进程先结束了,子进程会往上找,就是孤儿进程,不会影响什么;

        子进程消亡,pcb块还在占用内存,此时是僵尸进程,父进程需要回收子进程的pcb;

20.exit

        void exit(int status);

        status:退出状态,0为正常退,1为前面有异常错误导致退出;

21._exit系统调用

        void exit(int status);

        status:退出状态,0为正常退,1为前面有异常错误导致退出;

        让进程退出但不清除缓冲;

        缓冲区的结束需要遇到\n或1024满或正常退出或fflush函数;

http://www.xdnf.cn/news/18778.html

相关文章:

  • MQTT 协议模型:客户端、 broker 与主题详解(二)
  • Java 学习笔记(基础篇10)
  • Qwen2-Plus与DeepSeek-V3深度测评:从API成本到场景适配的全面解析
  • Coze用户账号设置修改用户头像-后端源码
  • 大模型的多机多卡训练
  • 09-数据存储与服务开发
  • 深度学习分类网络初篇
  • react+taro打包到不同小程序
  • Nginx与Apache:Web服务器性能大比拼
  • Docker:技巧汇总
  • 连锁零售排班难?自动排班系统来解决
  • Swiper属性全解析:快速掌握滑块视图核心配置!(2.3补充细节,详细文档在uniapp官网)
  • 从C语言到数据结构:保姆级顺序表解析
  • 数据库之两段锁协议相关理论及应用
  • 前端开发:详细介绍npm、pnpm和cnpm分别是什么,使用方法以及之间有哪些关系
  • Ansible 任务控制与事实管理指南:从事实收集到任务流程掌控
  • 面向过程与面向对象
  • AP服务发现中两条重启检测路径
  • Linux系统操作编程——http
  • 逆向抄数工程师能力矩阵:设备操作(±0.05mm 精度)× 曲面重构 ×GDT 公差分析
  • springboot项目每次启动关闭端口仍被占用
  • CTFshow系列——命令执行web53-56
  • GO学习记录八——多文件封装功能+redis使用
  • Coze用户账号设置修改用户昵称-前端源码
  • Vue 3 defineOptions 完全指南:让组件选项声明更现代化
  • `lock()` 和 `unlock()` 线程同步函数
  • Node.js(1)—— Node.js介绍与入门
  • maven-default-http-blocker (http://0.0.0.0/)
  • 设计模式4-建造者模式
  • 【AI论文】LiveMCP-101:针对支持多主体通信协议(MCP)的智能体在复杂查询场景下的压力测试与故障诊断