## 进程[]()
进程是什么?进程是正在执行的程序;进程是正在计算机上执行的程序实例;进程是能分配给处理器并由处理器执行的实体。进程一般会包括指令集和系统资源集,这里的指令集是指程序代码,这里的系统资源集是指I/O、CPU、内存等。综合起来,我们也可以理解进程是具有一定独立功能的程序在关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。
在进程执行时,进程都可以被唯一的表示,由以下一些元素组成:
- 进程描述符:进程的唯一标识符,用来和其它进程区分。在Linux中叫进程ID,在系统调用fork期间生成,只是我们通过getpid返回的不是其pid字段,而是其线程组号tgid。
- 进程状态:我们常说的挂起、运行等状态,其表示的是当前的状态。
- 优先级:进程间的执行调度相关,相对于其它进程而言。
- 程序计数器:程序中即将被执行的下一条指令的地址,该地址是内核术中或用户内存空间中的内存地址。
- 内存指针:包括程序代码和进程相关数据的指针,还有和其它进程共享内存块的指针。
- 上下文数据:进程执行时处理器的寄存器的数据。
- I/O状态信息:包括显式的I/O请求、分配给进程的I/O设备等
- 记账信息:可能包括处理器时间总和、使用的时钟数总和、时间限制等
以上的这些元素都会放在一个叫做进程控制块的数据结构中。进程控制块是操作系统能够支持多进程和提供多处理的结构。当操作系统做进程切换时,它会执行两步操作,一是中断当前处理器中的进程,二是执行下一个进程。不管是中断还是执行,进程控制块中的程序计数器、上下文数据和进程状态都会发生变化。当进程中断时,操作系统会把程序计数器和处理器寄存器(对应进程控制块中的上下文数据)保存到进程控制块中的相应位置,进程状态也会有所变化,可能进入阻塞状态,也有可能进入就绪态。当执行下一个进程时,操作系统按规则将下一个进程设置为运行态,并加载即将要执行进程的程序上下文数据和程序计数器等。
## 线程[]()
进程有两个特性部分:资源所有权和调度执行。资源所有权是指进程包括了进程运行所需要的内存空间、I/O等资源。调度执行是指进程执行过程中间的执行路径,或者说程序的指令执行流。这两个特性部分是可以分开的,分开后,拥有资料所有权的通常称为进程,拥有执行代码的可分派部分的被称之为线程或轻量级进程。
线程有“执行的线索”的意思在里面,而进程在多线程环境中被定义为资源所有者,其还是会存储进程的进程控制块。线程的结构与进程不同,每个线程包括:
- 线程状态: 线程当前的状态。
- 一个执行栈
- 私有的数据区: 用于每个线程局部变量的静态存储空间
- 寄存器集: 存储处理器的一些状态
每个进程都有一个进程控制块和用户地址空间,每个线程都有一个独立的栈和独立的控制块,都有自己一个独立执行上下文。其结构如图8.1所示。
![图8.1 进程模型图](http://box.kancloud.cn/2015-07-06_559a632f7956c.jpg)
图8.1 进程模型图
线程在执行过程中与进程有一些不同。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在于进程之中,由进程提供多个线程执行控制。从逻辑角度来看,多线程的意义在于一个进程中,有多个执行部分可以同时执行。此时,进程本身不是基本运行单位,而是线程的容器。
线程较之进程,其优势在于一个快,不管是创建新的线程还是终止一个线程;不管是线程间的切换还是线程间共享数据或通信,其速度与进程相比都有较大的优势。
## 并发及并行[]()
并发又称共行,是指能处理多个同时性活动的能力,并发事件之间不一定要同一时刻发生。比如,现代计算机系统可在同一段时间内以进程的形式将多个程序加载到存储器中,并借由处理器的时分复用,以在一个处理器上表现出同时运行的感觉。
并行是指同时发生的两个并发事件,具有并发的含义,而并发则不一定并行。
并发和并行的区别就是一个处理器同时处理多个任务和多个处理器或者是多核的处理器同时处理多个不同的任务。前者是逻辑上的同时发生(simultaneous),而后者是物理上的同时发生。
### PHP的各种并发模型[]()
## 参考资料[]()
《操作系统精髓与设计原理》
- 第一章 准备工作和背景知识
- 第一节 环境搭建
- 第二节 源码结构、阅读代码方法
- 第三节 常用代码
- 第四节 小结
- 第二章 用户代码的执行
- 第一节 生命周期和Zend引擎
- 第二节 SAPI概述
- Apache模块
- 嵌入式
- FastCGI
- 第三节 PHP脚本的执行
- 词法分析和语法分析
- opcode
- opcode处理函数查找
- 第四节 小结
- 第三章 变量及数据类型
- 第一节 变量的结构和类型
- 哈希表(HashTable)
- PHP的哈希表实现
- 链表简介
- 第二节 常量
- 第三节 预定义变量
- 第四节 静态变量
- 第五节 类型提示的实现
- 第六节 变量的生命周期
- 变量的赋值和销毁
- 变量的作用域
- global语句
- 第七节 数据类型转换
- 第八节 小结
- 第四章 函数的实现
- 第一节 函数的内部结构
- 函数的内部结构
- 函数间的转换
- 第二节 函数的定义,传参及返回值
- 函数的定义
- 函数的参数
- 函数的返回值
- 第三节 函数的调用和执行
- 第四节 匿名函数及闭包
- 第五节 小结
- 第五章 类和面向对象
- 第一节 类的结构和实现
- 第二节 类的成员变量及方法
- 第三节 访问控制的实现
- 第四节 类的继承,多态及抽象类
- 第五节 魔术方法,延迟绑定及静态成员
- 第六节 PHP保留类及特殊类
- 第七节 对象
- 第八节 命名空间
- 第九节 标准类
- 第十节 小结
- 第六章 内存管理
- 第一节 内存管理概述
- 第二节 PHP中的内存管理
- 第三节 内存使用:申请和销毁
- 第四节 垃圾回收
- 新的垃圾回收
- 第五节 内存管理中的缓存
- 第六节 写时复制(Copy On Write)
- 第七节 内存泄漏
- 第八节 小结
- 第七章 Zend虚拟机
- 第一节 Zend虚拟机概述
- 第二节 语法的实现
- 词法解析
- 语法分析
- 实现自己的语法
- 第三节 中间代码的执行
- 第四节 PHP代码的加密解密
- 第五节 小结
- 第八章 线程安全
- 第二节 线程,进程和并发
- 第三节 PHP中的线程安全
- 第九章 错误和异常处理
- 第十章 输出缓冲
- 第十六章 PHP语言特性的实现
- 第一节 循环语句
- foreach的实现
- 第二十章 怎么样系列(how to)
- 附录
- 附录A PHP及Zend API
- 附录B PHP的历史
- 附录C VLD扩展使用指南
- 附录D 怎样为PHP贡献
- 附录E phpt测试文件说明
- 附录F PHP5.4新功能升级解析
- 附录G:re2c中文手册