自学嵌入式第二十七天: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函数;