版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40028201/article/details/89552268
后台核心技术开发与应用实践读书笔记(十)
第10章 进程
10.1 程序与进程
- 进程结构:
- 代码段:存放程序代码的数据,数个进程运行同一个程序可以使用同一个代码段
- 数据段:存放全局变量、常量、静态变量
- 堆栈段:用于函数调用,存放函数参数与局部变量。另外还包括了PCB,它位于继承核心堆栈的底部不额外分配空间,是进程的唯一标志。系统通过PCB对进程进行管理和调度
- 程序转化为进程的步骤
- 内核将程序读入内存,为程序分配内存空间
- 内核为该进程分别进程标志符(PID)和其他资源
- 内核为进程保存PID及相应的状态和信息,把进程放到运行队列中等待执行,程序转化为进程后就可以被操作系统的调度程序调度执行了
10.2 进程的创建于结束
创建的两种方式:操作系统创建、父进程创建
- fork()函数创建进程。
- 调用一次返回两次,有三种不同的返回值
- 在父进程中,fork返回新创建子进程的进程ID;
- 在子进程中,fork返回0;
- 如果创建出错,fork返回-1
- 子进程与父进程的关系
- 子进程与父进程允许顺序是不确定的,故可以在父进程中休眠2s保证子进程先运行
- 实际上,子进程完全复制了父进程的地址空间内容(包括数据段与堆栈段),但是共用代码段,因为代码段只是可读的不存在修改的情况
- 调用一次返回两次,有三种不同的返回值
- 进程的结束exit()函数
- exit是函数,带参数,执行完后把控制权交给系统;return是函数执行完后的返回,执行完后把控制权交给调用函数
- exit是正常终止进程;abort是异常终止
- exit()会将缓冲区的数据写完后再退出;_exit()函数直接退出
10.3 僵尸进程
- 孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。
- 僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中
10.4 守护进程
- 在Linux或者UNIX操作系统中在系统引导的时候会开启很多服务,这些服务就叫做守护进程(脱离终端在后台运行的进程)
- 生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件
- 一个简单的守护进程创建的步骤
- 创建子进程,父进程退出(使子进程成为孤儿进程)
- 在子进程中创建新的会话(脱离控制终端)
- 改变当前目录为根目录
- 重设文件权限掩码
- 关闭文件描述符
- 守护进程的退出