文章目录
1 程序和进程
程序是存放在存储介质上的一个可执行文件,进程是程序执行的过程。进程的状态是变化的,包括进程的创建、调度和消亡。程序是静态的,进程是动态的。
进程是管理事务的基本单元。
进程拥有自己独立的处理环境(需要用到哪些环境变量、程序的目录在哪里,当前是哪个用户在运行此程序)和系统资源(CPU占用率、存储器、I/O设备、数据、程序)。
公司相当于操作系统,部门相当于进程,公司通过部门来管理(操作系统通过进程管理)各个部门中的员工。
并行(真正的一起执行)和并发(在短时间内切换使用资源,造成一起执行的错觉)
2 MMU 内存管理单元
CPU用于管理虚拟内存和物理内存之间的映射
3 进程控制块PCB
进程运行时,内核为每一个进程分配一个PCB,用于维护进程的相关信息,Linux内核的进程控制块是task_struct
4 进程的状态(重点)
这张图可以不背了解一下
查看进程状态 ps aux
5 进程相关命令
ps
top 和ps -a差不多
kill 杀进程,
kill pid
有些进程不能直接杀死 需要 kill -9 pid
6 进程号和相关函数
7 进程的创建
从一个已存在的进程中创建一个新进程
会输出两个helloworld
子进程不会调用fork函数,会在fork下面那条语句开始执行。避免重复执行
PC指针,指向下一跳指令
8 父子进程的关系
写时拷贝,读时共享
读时共享,父子进程如果没有改数据,则父子进程都会共享一个空间,没有必要拷贝在自己的空间里。即有相同的文件描述符,和共同的文件偏倚指针。
写时拷贝,如过父子进程需要更改数据,则会拷贝到自己的空间,然后进行更改。
9 区别父子进程
通过pid进行区分
10 父子进程的地址空间
读时共享,写时拷贝
valgrind 检查内存泄漏
valgrind ./a.out
子进程需要分配一次,释放两次
11 GDB调试多进程
12 进程退出函数
13 等待子进程退出函数
使用wait 和waitpid 释放子进程
等待任意一个子进程结束
使用wait时进程会挂起,直到收到子进程退出或者收到一个不能忽视的信号
调用进程没有子进程,就立即返回,若子进程结束,函数会立即返回,并且回收所有资源。
wait()主要用于回收已经结束的子进程的资源。
如果status不为null,就会把子进程退出时的状态存在satus中,。
status的宏
waitpid 不阻塞
wait 阻塞
14 孤儿进程和僵尸进程
15 进程替换
exec 函数组
不会打印hello world,因为进程已经被替换成ls的main函数
剩下的了解即可