嵌入式自学第二十七天
(1)进程:正在运行的程序,会去分配内存空间,并受到cpu的调度。
pcb进程控制块,位于kernal(内核),是一个结构体,包含进程标识符、进程状态、内存分配、返回地址等信息。
pid进程标识符,
chdir改变当前工作路径。
umask设置权限掩码
ulimit -a显示进程资源上限
fds 进程打开的文件列表,文件io会提到,文件描述符。
signal进程间通信;大概能发64个信号,接收到信号先执行信号函数。处理异步io,ctrl c就相当于进程通信,强制结束循环。
用户id,记录谁把程序运行的,组id
linux中pcb块名字:task_struct
(2)进程与程序关系
程序:静态
存储在硬盘的代码,数据的集合
进程:动态
程序执行的过程:创建、调度、消亡
.c a.out process
程序是永存,进程是暂时的。
进程有程序状态的变化
进程可以并发
进程间存在计算机资源的竞争
一个程序可以运行多次,变成多个进程,比如开启多个终端,一个进程可以运行一个或多个程序比如打开钉钉,聊天直播都被打开
ELF可执行程序的格式,exe PE格式
内存分布:
运行程序后,内存装code代码段只读、data数据段:静态变量全局变量,bss未初始始变量、heap
堆区(动态内存空间)malloc、映射区(共享区)map(share):内容放在kernal内核(如libc.c)。栈stack
上面是虚拟内存MMU物理地址转虚拟地址
透明、隔离、权限。
4g内核最大3g给a.out
(3)进程作用:程序并发执行
(4)进程状态:
3个状态,就绪→执行态→阻塞(等待,睡眠)基本操作系统
linux中的状态,运行态,睡眠态,僵尸,暂停态。、
(5)进程调度:
调度算法:sched 非实时系统(SHCHED_OTHER,batch,idle),实时系统(SCHED_FIFO,rr)
宏观并行,微观串行。
top查看进程,
ps查看pid,pstree进程树
ps aux查看进程
lsof -p pid 查看进程打开的文件。
kill 发信号关一个 kill -2 PID 普通关闭
kill -9 PID 强制关闭
killall -9 名称全关
终端bash
kill -l查看-
不加-默认15
(6)进程相关函数:
fork();叉子,启动进程。
返回值大于零是父,等于零是子。
一次调用,返回两次。
子进程号大一些
变量不共享。隔离保护
子进程复制父进程的内存空间和内核pcb,但pid号不同
并发逻辑,两个代码都在运行。
getpid获得进程pid号
getppid获得父进程pid号
/less屏满停,空格下一页
man -k模糊搜索
pstree进程树
ps aux/grep 51283父进程获取
子进程会获得父进程数据段、堆、栈、代码段
要想确定父子间运行顺序,需要IPC机制
父的返回值是子的id号,没有函数获得子的id号
写时复制:大部分情况是共享的,只有变量值改变时子进程才开空间。
进程终止:
主动退出:main函数return;
c函数exit()程序结束,资源释放。
系统调用_exit_Exit,进程结束,不清理函数
主线程退出
主线程调用:pthread_exit:线程结束
异常退出:发生严重错误,操作系统调用,abort()
signal kill pid
最后一个现场被pthread_cancle取消