2. 进程-线程
2.1
进程
专业:进程(
Process
)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当
代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。
实际:什么是进程,所谓进程其实就是操作系统中一个正在运行的程序,我们在一个终端当中,通过
php
,运行一个
php
文件,这个时候就相当于我们创建了一个进程,这个进程会在系统中驻存,申请属于它自己的内
存空间系统资源并且运行相应的程序
组成:进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(
text region
)、数据区域(
data region
)和堆栈(
stack region
)。文本区域存储处理器执行的代码;数据区域存储变量和进程
执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。
特征
动态性:进程的实质是程序在多道程序系统中的一次执行过程,进程是动态产生,动态消亡的。
并发性:任何进程都可以同其他进程一起并发执行
独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位;
异步性:由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推进
结构特征:进程由程序、数据和进程控制块三部分组成。
多个不同的进程可以包含相同的程序:一个程序在不同的数据集里就构成不同的进程,能得到不同的结果;但是执行过程中,程序不能发生改变。
状态
对于一个进程来说,它的核心内容分为两个部分,一个是它的内存,这个内存是这进程创建之初从系统分配的,它所有创建的变量都会存储在这一片内存环境当中
一个是它的上下文环境我们知道进程是运行在操作系统的,那么对于程序来说,它的运行依赖操作系统分配给它的资源,操作系统的一些状态。
在操作系统中可以运行多个进程的,对于一个进程来说,它可以创建自己的子进程,那么当我们在一个进程中创建出若干个子进程的时候那么可以看到如图,子进程和父进程一样,拥有自己的内存空间和上下文环境
为什么需要子进程?
父进程:用来管理 子进程:用来工作
正常来说父进程停止了子进程也会停止运行
如何区分父进程和子进程呢??
线程,有时被称为轻量级进程
(Lightweight Process
,
LWP
),是程序执行流的最小单元。一个标准的线程由线程
ID
,当前指令指针
(PC
),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度
和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。
线程是程序中一个单一的顺序控制流程。进程内有一个相对独立的、可调度的执行单元,是系统独立调度和分派
CPU
的基本单位指令运行时的程序的调度单位。在单个程序中同时运行多个线程完成不同的工作,称为多
线程。
特点
在多线程
OS
中,通常是在一个进程中包括多个线程,每个线程都是作为利用
CPU
的基本单位,是花费最小开销的实体。线程具有以下属性。
1
)轻型实体
线程中的实体基本上不拥有系统资源,只是有一点必不可少的、能保证独立运行的资源。
线程的实体包括程序、数据和
TCB
。线程是动态概念,它的动态特性由线程控制块
TCB
(
Thread Control Block
)描述。
TCB
包括以下信息:
(
1
)线程状态。
(
2
)当线程不运行时,被保存的现场资源。
(
3
)一组执行堆栈。
(
4
)存放每个线程的局部变量主存区。
(
5
)访问同一个进程中的主存和其它资源。
用于指示被执行指令序列的程序计数器、保留局部变量、少数状态参数和返回地址等的一组寄存器和堆栈。
2
)独立调度和分派的基本单位。
在多线程
OS
中,线程是能独立运行的基本单位,因而也是独立调度和分派的基本单位。由于线程很
“
轻
”
,故线程的切换非常迅速且开销小(在同一进程中的)。
3
)可并发执行。
在一个进程中的多个线程之间,可以并发执行,甚至允许在一个进程中所有线程都能并发执行;同样,不同进程中的线程也能并发执行,充分利用和发挥了处理机与外围设备并行工作的能力。
4
)共享进程资源。
在同一进程中的各个线程,都可以共享该进程所拥有的资源,这首先表现在:所有线程都具有相同的地址空间(进程的地址空间),这意味着,线程可以访问该地址空间的每一个虚地址;此外,还可以访问进程所拥有
的已打开文件、定时器、信号量机构等。由于同一个进程内的线程共享内存和文件,所以线程之间互相通信不必调用内核。
2.3
协程
协程与子例程一样,协程(
coroutine
)也是一种程序组件。相对子例程而言,协程更为一般和灵活,但在实践中使用没有子例程那样广泛。协程源自
Simula
和
Modula-2
语言,但也有其他语言支持。
协程不是进程或线程,其执行过程更类似于子例程,或者说不带返回值的函数调用。 一个程序可以包含多个协程,可以对比与一个进程包含多个线程,
dtrzw
因而下面我们来比较协程和线程。我们知道多个线程相对独立,有自己的上下文,切换受系统控制;而协程也相对独立,有自己的上下文,但是其切换由自己控制,由当前协程切换到其他协程由当前协程来控制。 协程
和线程区别:协程避免了无意义的调度,由此可以提高性能,但也因此,程序员必须自己承担调度的责任,同时,协程也失去了标准线程使用多
CPU
的能力。
2.4
进程和线程的关系与区别
1.
地址空间
:
进程内的一个执行单元
;
进程至少有一个线程
;
它们共享进程的地址空间
;
而进程有自己独立的地址空间
;
因此线程可以读写同样的数据结构和变量,便于线程之间的通信。相反,进程间通信(
IPC
)很困难且
消耗更多资源。
2.
资源拥有
:
进程是资源分配和拥有的单位
,
同一个进程内的线程共享进程的资源
3.
进程是资源的分配和调度的一个独立单元,而线程是
CPU
调度的基本单元
4.
二者均可并发执行
.
5.
进程的创建调用
fork
或者
vfork
,而线程的创建调用
pthread_create
,进程结束后它拥有的所有线程都将销毁,而线程的结束不会影响同个进程中的其他线程的结束
6.
线程有自己的私有属性
TCB
,线程
id
,寄存器、硬件上下文,而进程也有自己的私有属性进程控制块
PCB
,这些私有属性是不被共享的,用来标示一个进程或一个线程的标志
2.5
简单理解
计算机的核心是
CPU
,它承担了所有的计算任务。它就像一座工厂,时刻在运行。
假定工厂的电力有限,一次只能供给一个车间使用。也就是说,一个车间开工的时候,其他车间都必须停工。背后的含义就是,单个CPU一次只能运行一个任务。
进程就好比工厂的车间,它代表
CPU
所能处理的单个任务。任一时刻,
CPU
总是运行一个进程,其他进程处于非运行状态
一个车间里,可以有很多工人。他们协同完成一个任务
线程就好比车间里的工人。一个进程可以包括多个线程。
间的空间是工人们共享的,比如许多房间是每个工人都可以进出的。这象征一个进程的内存空间是共享的,每个线程都可以使用这些共享内存。
可是,每间房间的大小不同,有些房间最多只能容纳一个人,比如厕所。里面有人的时候,其他人就不能进去了。这代表一个线程使用某些共享内存时,其他线程必须等它结束,才能使用这一块内存。
一个防止他人进入的简单方法,就是门口加一把锁。先到的人锁上门,后到的人看到上锁,就在门口排队,等锁打开再进去。这就叫
”
互斥锁
”
(
Mutual exclusion
,缩写
Mutex
),防止多个线程同时读写某一块内存区
域。
还有些房间,可以同时容纳
n
个人,比如厨房。也就是说,如果人数大于
n
,多出来的人只能在外面等着。这好比某些内存区域,只能供给固定数目的线程使用。
这时的解决方法,就是在门口挂
n
把钥匙。进去的人就取一把钥匙,出来时再把钥匙挂回原处。后到的人发现钥匙架空了,就知道必须在门口排队等着了。这种做法叫做
”
信号量
”
(
Semaphore
),用来保证多个线程不会
互相冲突。
不难看出,
mutex
是
semaphore
的一种特殊情况(
n=1
时)。也就是说,完全可以用后者替代前者。但是,因为
mutex
较为简单,且效率高,所以在必须保证资源独占的情况下,还是采用这种设计。
操作系统的设计,因此可以归结为三点:
(
1
)以多进程形式,允许多个任务同时运行;
(
2
)以多线程形式,允许单个任务分成不同的部分运行;
(
3
)提供协调机制,一方面防止进程之间和线程之间产生冲突,另一方面允许进程之间和线程之间共享资源。