一、软件与程序
可能大部分的人对软件是什么,程序是什么没有一个明确的概念,这里着重说明一下两者的概念。
①软件:广义上我们可以这样理解:软件是计算机程序、方法、规则、相关的文档、以及在计算机上运行时所必需数据的总和。
上述的概念比较抽象,我们一般从狭义上理解软件:
软件=程序+数据+文档(软件不一定包括UI)
②程序:程序是指令或语句的序列,计算机程序则是用计算机语言描述的某一问题的解决步骤。
同样我们可以这样理解程序:
程序=算法+数据结构,或者可以干脆可以理解成可执行的二进制代码。
程序分为解释性程序与直接执行性程序:
解释性程序需要另一个解释程序才能运行。如我们一般的应用程序都是要靠操作系统来解释的。而直接执行性是用机器语言来表述的程序,简单来说就是不依赖其他程序而且可以独立运行在裸机(没有操作系统)上的程序。一般来说就是操作系统的内核程序了。
③应用程序是指为了完成某项或某几项特定任务而被开发运行于操作系统之上的计算机程序。应用程序与软件的概念不同,但常常因为概念相似而被混淆。软件指程序与其相关文档或其他从属物的集合。一般的我们视程序为软件的一个组成部分。
例如:一个游戏软件包括程序(*.exe)和其它图片(*.bmp等)、音效(*.wav等)等附件,那么这个程序(*.exe)称作“应用程序”,而它与其他文件(图片、音效等)在一起合称“软件”。
二、进程与线程
了解上述的概念后就可以更容易的理解进程和线程了
进程:程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程。程序和进程的区别就在于:程序是指令的集合,它是进程运行的静态描述文本;进程是程序的一次执行活动,属于动态概念。
一个程序是可以包含多个进程的。
线程:有时被称为轻量级进程,是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。
三、形象的理解一下进程与线程:
1)计算机的核心是CPU,它承担了所有的计算任务。它就像一座工厂,时刻在运行。
2)假定工厂的电力有限,一次只能供给一个车间使用。也就是说,一个车间开工的时候,其他车间都必须停工。背后的含义就是,单个CPU一次只能运行一个任务。
3)进程就好比工厂的车间,它代表CPU所能处理的单个任务。任一时刻,CPU总是运行一个进程,其他进程处于非运行状态。
4)一个车间里,可以有很多工人。他们协同完成一个任务
5)线程就好比车间里的工人。一个进程可以包括多个线程。
6)车间的空间是工人们共享的,比如许多房间是每个工人都可以进出的。这象征一个进程的内存空间是共享的,每个线程都可以使用这些共享内存。
7)可是,每间房间的大小不同,有些房间最多只能容纳一个人,比如厕所。里面有人的时候,其他人就不能进去了。这代表一个线程使用某些共享内存时,其他线程必须等它结束,才能使用这一块内存。
8)一个防止他人进入的简单方法,就是门口加一把锁。先到的人锁上门,后到的人看到上锁,就在门口排队,等锁打开再进去。这就叫"互斥锁"(Mutual exclusion,缩写 Mutex),防止多个线程同时读写某一块内存区域
9)还有些房间,可以同时容纳n个人,比如厨房。也就是说,如果人数大于n,多出来的人只能在外面等着。这好比某些内存区域,只能供给固定数目的线程使用。
10)这时的解决方法,就是在门口挂n把钥匙。进去的人就取一把钥匙,出来时再把钥匙挂回原处。后到的人发现钥匙架空了,就知道必须在门口排队等着了。这种做法叫做"信号量"(Semaphore),用来保证多个线程不会互相冲突。
不难看出,”互斥锁”是"信号量"的一种特殊情况(n=1时)。也就是说,完全可以用后者替代前者。但是,因为”互斥锁”较为简单,且效率高,所以在必须保证资源独占的情况下,还是采用这种设计。