page
1page=4096B
操作系统按page管理内存。每个page,可以设置读写访问控制属性。
虚拟内存空间
每个进程拥有4G的虚拟内存空间,由操作系统映射到物理地址。其中0~3G为用户空间,3~4G为内核空间。
内核空间
内核空间存储PCB等信息,由多个进程共享。进程无法访问内核空间。
用户空间
进程只能读写自己的用户空间。
内容包括
- 栈空间
- 堆
- 代码段(text)
- …
PCB
进程控制块。内核为进程创建PCB来维护进程相关信息。
- pid
- 进程状态
- 进程切换的CPU寄存器
- 虚拟地址空间信息
- 当前工作目录
- umask掩码
- 文件描述符表
- 用户id, 组id
- 控制终端, session和进程组
进程id,父进程id,进程组id
每个进程有一个进程id,
进程的父id为调用fork的id;
父、子进程共享进程组id。
进程组id与父进程id相同。
进程原语
fork
进程复制0~3G用户空间和内核空间的PCB, 但id不同。
fork调用一次,返回两次,父进程返回子进程pid,子进程返回0.
- create()
- clone()
- return
fork时,并不会立即复制父进程内存空间,而是采用copy on write, 即读时共享,写时拷贝
exec族
加载一个新的程序,替换掉当前程序的代码段,堆栈等。
fork后,多半会exec。 因为fork时,并不会立即clone父进程内存。
wait/waitpid
僵尸进程:子进程用户空间已释放,PCB等待父进程回收。未回收时为僵尸态。
孤儿进程:父进程先于子进程结束,则子进程成为孤儿进程。
wait为阻塞函数,等待回收子进程的资源。如果没有子进程,返回-1.
waitpid()
- 参数为负, 代表进程组id
- 参数为0,代表当前进程组内所有子进程
- 参数为正,具体子进程
当一个进程成为孤儿进程时,其父进程自动更改为init进程(1号进程)。称为init领养子进程。
进程间关系
终端
init–>fork–>exec–>getty–>输入账号–>输入密码–>exec–>shell
进程组
进程组id = 组长进程id
会话
一个或多个进程组的集合
守护进程
后台服务,生存周期较长。独立于控制终端并周期性地执行某种任务或等待处理某些发生的事情。