任何线程都能够启动一个进程;唯一的限制就是安全原因的因素,比如文件访问、权限限制等等。实际上,你可以通过系统启动脚本、命令行以及程序调用的方式来启动一个进程。
从命令行启动一个进程
在命令行键入:
$ program1
就会启动一个叫做program1的程序并等待其运行结束。你也可以键入:
$ program2 &
来启动一个叫做program2的程序而不需要等待其运行结束。我们可以称为这个程序在后台运行。
如果你想要在启动一个程序之前先调整这个程序的优先级,你可以使用nice命令,就像在UNIX系统中一样:
$ nice program3
这个指令将在降低的优先级启动这个程序program3。
在程序中启动一个进程
你可能有时会忽略命令行能创建进程,这也是命令行的基本功能。在一些应用程序设计中,可能会用到脚本程序(文件中有批处理指令)来完成某些工作,不过在其他情况下,你需要在程序中自己创建进程。
例如,在一个大型的多进程系统中,你需要一个主进程按照某种配置来启动其他的进程。另外的例子就是当检测到某些操作条件或事件时启动某个进程。
系统提供的能够启动其他进程的函数包括了:
- system()
- exec()
- spawn()
- fork()
- vfork()
你要使用哪个函数取决于两个因素:可移植性与功能性。一般来说,要在这两个因素之间寻找最佳的平衡。
阅读全文…
我们知道一个进程可以有一个或多个线程。如果一个进程有0个线程那就无法作任何事了,就像是没有人在家就不能实际完成任何事情了。而操作系统可以有一个或多个进程在运行中。这里可以同样引用上面的例子,没有任何进程的系统也做不了什么事情的。
那么这些线程与进程都干了些什么?最终它们形成了操作系统,就是为了完成某个目标的线程与进程的集合。
在最高层,系统包含了一定数目的进程。每个进程负责提供某种类型的服务,包括了文件系统、显示驱动、数据采集模块、控制模块等等。
在每个进程中,都有一定数量的线程。这些线程的数目都是不同的。一个设计者只使用一个线程的设计可能能够完成另外一个设计者使用五个线程实现的功能。有些问题由于自身的原因必须使用多线程来解决,而实际上也是相对来说易于解决的,而另外的问题可能只能使用单线程处理,很难使用多线程来解决。
为何使用多个进程?
那么我们为什么不在一个进程使用一亿个线程呢?也许有的系统强迫你按照这种方式编码,不过将这些事物分散到多个进程中的益处也是很多的,这些益处包括了:
这种将问题分解为几个独立的问题的能力是一个非常有用的概念。这也是操作系统的核心。操作系统包含了很多独立的模块,每个模块负责一定的事务。这些独立的模块都是独立的进程。这些模块之间唯一的依赖就是少数完善定义的接口。
由于缺少相互之间的依赖,这种结构就能带来增强的可维护性。每个模块有其自己的特别的定义,这样就很容易来对一个模块进行修补,特别是这个模块不和任何其他模块有联系的时候。
可靠性可能是最重要的一点了。一个进程就像是一个房子一样有着明确的边界定义。房中的一个人可以清晰地分辨出他自己什么时候在房子里面,什么时候在房子外面。一个线程也有同样的情况,只有在其访问进程中的内存时它才能够生存。如果越过了进程地址空间的边界,它就会被杀掉。这就是说,两个运行在不同进程中的线程被有效的相互隔离了。
进程地址空间由操作系统的进程管理模块维护。当一个进程开始的时候,进程管理器就为其分配一定数量的内存并开始一个线程的运行。这块被分配的内存就被标志为归那个进程所有。
这就意味着如果在那个进程中有多个线程,内核就需要在这些线程之间完成环境变量切换,这是一个非常高效的操作,因为我们不需要更换地址空间,所有的线程都在这个地址空间运行。如果我们需要切换到其他进程中的一个线程,进程管理器就会介入并执行地址空间的切换。不过不用担心,虽然增加了一步操作会消耗资源,不过在操作系统中这个操作也是非常快的。
RUNNING
系统的运行状态简单的说就是表示有线程处于活动状态并在使用CPU。在多处理器系统中,可以有多个线程处于运行状态;在单处理器系统中,只能有一个线程处于运行状态。
READY
就绪状态表示线程现在可以运行了,只不过还未运行,因为现在有另外一个线程(同优先级或更高优先级)正在运行。如果有两个线程都有能力使用处理器,其中一个线程的优先级为10而另外一个线程的优先级为7,那么优先级为10的线程将进入运行状态而优先级为7的线程将进入就绪状态。
阅读全文…
我们前面的使用房子做的比喻对于解释同步的概念是非常合适的,但对系统中另一个重要方面就不合适了。在我们的比喻中,多个线程是同时运行的。可是,在实际的系统中,一般只有一个处理器,那么在一个时间点上只能运行一件“事”。
单处理器情况
下面看看在实际系统中的真实运行情况,在较“经济”的情况下,一个系统中只有一个中央处理器。这时,在任何时间点就只能有一个线程可以运行。系统内核使用数种规则来决定让哪个线程运行并运行该线程。
多处理器情况
如果你购买的计算机有多个、相同的CPU,并且这些CPU共享内存与设备,那么就可以说你有了一个SMP系统了(SMP是对称多处理器的简称,指系统中的这些处理器是一样的)。这时,可以同时运行的线程的数量就受限于CPU的个数了。由于一个CPU一次只能运行一个线程,在有多个CPU的情况下,多个线程就可以同步运行。
阅读全文…
信号变量(Semaphores)
现在把场景从卫生间转移到厨房,同一时间在厨房里面有几个人是可以接受的。在厨房里面,你也可能不想让所有的人同时进入。实际上,你可能是想让厨房中的人数保持在你设定的限度之内。
比如你不想在任何时间点厨房中的人数超过两个。这可以使用互斥体来实现么?根据我们的定义,是不行的。为什么不行就是我们的比喻中的一个非常有趣的问题。
计数为1的信号变量
卫生间可能遇到的情况是以下两种情况之一,有两种状态是互相关联的:
- 门是开的并且无人在房间内
- 门被锁住并且有一个人在房间内
阅读全文…
最近评论