1.pcb(process control block)进程控制块
结构体的路径:~/usr/src/linux-headers-3.5.0-23/include/linux/sched.h
结构体:
1 | struct task_struct { |
2.内存映射(重点)
由于应用程序不能直接操作设备硬件地址,所以操作系统提供了这样的一种机制——内存映射,把设备地址映射到进程虚拟地址,mmap
就是实现内存映射的接口。
mmap
的好处是,mmap把设备内存映射到虚拟内存,则用户操作虚拟内存相当于直接操作设备了,省去了用户空间到内核空间的复制过程,相对IO操作来说,增加了数据的吞吐量
。
用户空间映射时,会映射到不同的区域,内核空间映射时,会映射到同一区域的不同地方(共享!!)
每个进程都有4G的虚拟地址空间,其中3G用户空间,1G内核空间(linux),每个进程共享内核空间,独立的用户空间
3.fork 创建子进程(重点)
1 |
|
4.父子进程共享(重点)
4.1 父子进程相同:
刚 fork 后,data 段,text 段,堆,栈,环境变量,全局变量,进程工作目录,信号处理方式。(0-3G 部分是共享的)
4.2 父子进程不同的:
进程 id ,返回值,各自的父进程,进程创建时间,闹钟,未决信号集
4.3 父子进程共享:
map 映射区,读时共享,写时复制。
5. 进程回收
回收的就是残留在内核中的 3-4G 的数据(pcb 进程控制块)
- 孤儿进程:父进程先于子进程结束,则子进程会成为孤儿进程,子进程的父进程成为 init 进程,有 init 进程(进程孤儿院)来回收进程。
- 僵尸进程:子进程结束,父进程尚未回收,该子进程会变成僵尸进程
wait, waitpid
wait功能:
- 阻塞等待子线程退出
- 回收子进程残留的资源
- 获取子进程退出的状态(怎么死掉的)
1 | int state; |
6.监听 APP 应用被卸载
- fork 一个子进程
- 监听文件是否被删除了,data/data/xxx包名
- execl 函数族去执行某些命令(打开浏览器收集用户反馈)
1 | // 可以执行自己写好的程序,path 是路径,arg 是可变参数 |
1 |
|