现在的位置: 首页 > 综合 > 正文

linux应用程序记录

2012年09月19日 ⁄ 综合 ⁄ 共 2282字 ⁄ 字号 评论关闭

进程:一个其中运行着一个或多个线程的地址空间和这些线程所需要的系统资源。进程有自己的栈空间,用于保存函数中的局部变量
和控制函数的调用与返回。进程还有自己的环境空间,包含专门位这个进程建立的环境变量。进程必须维护自己的程序计数器,这个
计数器用来记录它执行到的位置,即在执行线程中的位置。在使用线程时,进程可以有不止一个执行线程。                      

Linux进程表就像一个数据结构,它把当前加载在内存中的所有进程的有关信息保存在一个表中,其中包括进程的PID、进程的状态、
命令字符串和其它一些ps命令输出的各类信息。

子进程终止时,它与父进程之间的关联还会保持,直到父进程也正常的终止或父进程调用wait才告结束。因此,进程表中代表子进程
的表项不会被立刻释放。虽然子进程已经不再运行,但它仍然存在与系统中,因为它的退出码还需要保存起来以备父进程今后的wait调用使用。这时它将成为一个死(defunct)进程或僵尸(zombie)进程。

Linux系统中的进程可以互相协作、互相发送消息、互相中断、甚至可以共享内存段。但从本质上来说。它们时操作系统内各自独立>的实体,要想在它们之间共享变量并不是很容易。在Linux系统中有一类进程叫做线程(thread)。涉及线程的编程是比较困难的,>但它在某些应用软件(如多线程服务器)中又有很大的用处。在Linux系统中编程线程并不想编写多线程程序那么常见,因为Linux中的进程都是非常轻量级的,而且编程多个互相协作的进程比编写线程要容易的多。

信号是Linux系统响应某些条件而产生的一个事件。用术语“生成”(raise)表示一个信号的生成,用属于“捕获”(catch)表示接收>到一个信号。信号是由于某些错误条件而生成的,如内存段冲突、浮点协处理器错误或非法指令等。信号还可以做为进程间传递消息或修改行为的一种方式,明确地由一个进程发送给另外一个进程。

异常终止进程:进程将以_exit调用方式退出(它类似exit,但是在返回内核之前不作任何清理工作)。但是进程的结束状态会传递>到wait和waitpid函数中去,从而表明进程是因某个特定的信号而异常终止的。

用fork调用来创建新进程的代价太高,在这种情况下,如果能让一个进程同时做两件事情或至少看起来是这样将会非常有用。而且,
我们可能希望有两件或更多的事情以一种非常紧密的方式同时发生。这就需要线程发挥作用。

在一个程序中的多个执行路线就叫线程(thread)。更准确的定义是:线程是一个进程内部的一个控制序列。所有的进程都至少有一
个执行线程。

当进程执行fork调用时,将创建出该进程的一份新的拷贝。这个新进程拥有自己的变量和自己的PID,它的时间调度也是独立的,它>的执行(通常)几乎完全独立于父进程。但在进程中创建一个新线程时,新的执行线程将拥有自己的栈(因此也有自己的局部变量),但与它的创建着共享全局变量、文件描述符、信号句柄和当前目录状态。

在某些环境下,创建新线程要比创建新进程有更明显的优势。新线程的创建代价要比新进程小得多。一般而言,线程之间的切换需要
操作系统做的工作要比进程之间的切换小得多,因此多个线程对资源的需求要远小于多个进程。如果一个程序在逻辑上需要有多个执
行线程,那么在单处理器系统上把它运行为一个多线程才更符合实际情况。缺点:(1)编写多线程程序需要非常仔细的设计。在多>线程程序中,因时序上的细微偏差或无意造成的变量共享而引发错误的潜在可能性很大;(2)对多线程程序的调试要比对单线成程>序的调试困难的多,因为线程之间的交互非常难于控制。(3)将大量计算分成两个部分,并把这两个部分作为两个不同的线程来运>行的程序在一台单处理器机器上并不一定运行的更快。

除局部变量外,所有其它变量都将在一个进程中的所有线程之间共享。

信号量是特殊的变量,它只取正整数并且只允许对这个值进行两种操作:等待(wait)和信号(signal)。因为在Linux和UNIX编程中>,“等待”和“信号"都已具有特殊的含义,所以我们将用原先定义的符号来标示这两种操作,它们是:(1)P(信号量变量):用于等待>。(2)V(信号量变量):用于信号。这两个字母来自于荷兰语单词passeren(传递,就好像位于进入临界区域之前的检查点)和vrijgeven(给予或释放,就好像放弃对临界区域的控制权)。在与信号量关联的内容中,你可能还会看到术语”开“(up)和”关“(down>),它们取自开、关信号标志的用法。假设有一个信号量变量sv,则这两种操作的定义下所述:P(sv)如果sv的值大于零,就给它减>去1;如果它的值等于零,就挂起该进程的执行;V(sv)如果有其它进程因等待sv而被挂起,就让它恢复运行;如果没有进程因等待sv而被挂起,就给它加1。

内核依靠设备驱动程序(device driver)来与它可能遇到的各种不同类型的设备进行沟通。这使得内核可以向应用程序提供一个统>一的接口,而不需考虑底层的技术。文件系统就是一个明显的例子,无论文件是保存在IDE硬盘、SCSI硬盘、CD-ROOM光盘、软盘或甚
至是RAM盘上,你对文件进行操作的命令都是一样的。这就是设备驱动程序的作用。

设备驱动程序并不一定控制着某个实际的物理硬件外设,比如/dev/random(用于产生随机数据)和/dev/vcs(当前虚拟控制台)。这
些设备与真实的硬件没有什么联系,但它们却是从内核获取数据再送往应用程序的一种手段,它们通常称为软件设备(software device)。

抱歉!评论已关闭.