多线程和多核芯片( 二 )


在UNIX中,进程不能剥夺其子进程的进程权 。
进程状态
每个进程是一个独立的实体,但是一个进程的结果可以作为另一个进程的输入 。
cat chapter1 chapter2 chapter3 | grep tree
第一个进程是 cat,将三个文件级联并输出 。
第二个进程是 grep,从输入中选择具有包含关键字 tree的内容 。
**运行态:**进程实际占用CPU时间片运行时**就绪态:**可运行,但是其他进程正在运行**阻塞态:**除非某种外部事件发生,否则他不能运行 。
进程的实现
线程 为什么需要线程? 多线程之间会共享同一块地址空间和所有可用数据能力 。线程比进程更轻量级,更容易创建,也更容易撤销,创建一个线程要比进程快10-100倍多线程是CPU密集型,虽然不能性能上增强,但是若存在大量计算和I/O处理,则多线程会彼此重叠进行,从而加快应用程序执行速度 。多线程解决方案
web服务器可以把获得大量访问的页面集合保存在内存中,避免到磁盘中调用这些页面,从而改善性能 。
单线程解决方案
在下一个请求到达之前完成工作 。
状态机解决方案
有限状态机:有限状态机,(英语:-state , FSM),又称有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型 。
常见的计算机就是使用有限状态机作为计算模型的:对于内存的不同状态,CPU通过读取内存值进行计算,更新内存中的状态 。CPU还通过消息总线接受外部输入设备(如键盘、鼠标)的指令,计算后更改内存中的状态,计算结果输出到外部显示设备(如显示器),以及持久化存储在硬盘 。
电脑游戏设计中也经常使用有限状态机模型 。以水果忍者游戏为例,游戏中水果的状态是有限状态,其运行轨迹是由模拟物理运动规律的计算公式运算而成的,一个香蕉抛起来后会按照抛物线运行,其每一帧位置变化都是一个状态的改变,状态改变通过计算公式来决定 。当然作为游戏不会仅仅这么简单,如果这么简单就是动画了,游戏还有复杂的人机交互事件,比如用手在屏幕上“切”了水果,水果感知到这个事件后,会按照程序逻辑进入爆炸状态 。
见:
三种方案的对比
经典的线性模型
上图:每个进程都有自己的地址空间和单个控制线程 。每个线程都在不同的地址空间中运行 。
上图:一个进程三个线程;每个线程都在相同的地址空间中运行 。
线程没有强独立性;可以有一样的地址空间,即可以拥有同样的全局变量 。
线程调用描述
创建线程
中止线程
线程调用,用来等待特定线程的终止 。
释放CPU来运行另一个线程的属性结构
线程实现 在用户空间中实现线程;
优势:
效率高、不需要上下文切换、不需要对内存高速缓存刷新,线程调度便捷 。
劣势:
要避免阻塞调用,否则会发生缺页故障 。在内核空间中实现线程;
优势:
内核维护了一张进程表来跟踪系统状态 。
劣势:
在内核中创建或销毁进程开销比较大 。
在用户和内核空间中混合实现线程 。
进程间的通信(Inter,IPC)
主要是三个问题
一个进程如何传递消息给其他进程?
由于共享一个地址空间,所以具有相同的运行环境,可以通过高级语言编写多线程代码解决 。如何确保两个或多个线程之间不会互相干扰,如:抢购最后一个座位 。数据的先后顺序 。A产生数据,B打印数据,那么B要等待A完成后才能进行打印 。竞态条件