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

进程与线程学习笔记

2013年09月04日 ⁄ 综合 ⁄ 共 1777字 ⁄ 字号 评论关闭

1、系统调用

在程序状态字(Program Status Word, PSW)寄存器中有一个二进制位控制CPU的两种工作模式(内核态和用户态)。在内核态运行时,CPU可以执行指令集中的每一条指令,操作系统在内核态下运行,从而可以访问整个硬件。用户程序在用户态下运行,仅允许执行整个指令集中的一个子集。一般而言,在用户态中有关I/O和内存保护的所有指令都是禁止的。为了从操作系统中获得服务,用户程序使用系统调用(system call)陷入内核,TRAP(陷阱)指令把用户态切换成内核态,并启用OS,当有关工作完成之后,在系统调用后面的指令把控制权返回给用户程序。在Unix中,系统调用和系统调用所使用的库过程之间几乎是一一对应的关系。且进程之间存在层次关系,称为进程树,所有进程都属于以init(OS启动进程)为根的一棵树。在Windows中,我们通过API获得操作系统的服务,但大部分API和系统调用不存在对应关系。且不存在父进程和子进程的概念,进程创建之后,创建者和被创建者是平等的。

注意:fork()创建一个原有进程的精确副本,子进程可以通过execve()替换不同的映像文件,从而执行不同的程序;waitpid()用于挂起调用进程,直到其它(特定的)进程退出。kill()供用户进程发送信号,若一个进程准备好捕捉一个特定的信号,那么,在信号到来时,运行一个信号处理程序,如果该进程没有准备好,那么信号的到来会杀死该进程。

2、进程

进程(process)本质上是正在执行的一个程序,是容纳运行一个程序所需要所有信息的容器。与一个进程相关的是进程的地址空间(address space)和进程表(process
table
)。进程的
地址空间包括代码段、数据段、堆栈段。

在多任务系统中,CPU使用某种调度算法在不同进程间来回快速切换,就好像这几个进程在并发执行一样。进程间的切换是通过中断(interrupt)来实现的。OS维护一张表格,即进程表,每个进程占用一个进程表项(也称进程控制块),该表项包含了进程状态的重要信息,包括程序计数器(保存了下一条指令的内存地址)、堆栈指针、内存分配状况、所打开文件的状态、账号和调度信息,以及其他在进程由运行态转换到就绪态或阻塞态时必须保存的信息,从而保证该进程随后能再次启动,就像从未被中段过一样。

线程是把进程的两项功能——独立分配资源与被调度分派执行分离开来。进程作为系统资源分配和保护的独立单位,不需要频繁地切换。线程作为系统调度和分派的基本单位,能轻装运行,会被频繁地调度和切换。

3、线程(thread)

在传统的操作系统中,进程有一个地址空间和一个控制线程;而在多线程系统中,一个进程的地址空间中同时运行多个控制线程。

多线程的优点:

(1)
应用程序中往往同时发生着多种活动,其中某些活动随时间的推移会被阻塞。通过将这些应用程序分解成可以准并运行的多个顺序线程,程序设计模型会变得更加简单。

(2)
线程比进程更轻量级,更容易创建和撤销。

(3)
如果应用程序中存在大量的计算和I/O处理,拥有多个线程允许这些活动彼此重叠进行,从而会加快程序执行的速度。

(4)
在多CPU系统中,多线程可以实现真正的并行运算。

在同一个进程中并行运行多个线程,是对在同一台计算机上并行运行多个进程的模拟。因此,线程也被称为轻量级进程(lightweight process)。与进程调度类似,CPU在线程之间快速切换,制造了线程并行运行的假象。不同的进程之间有独立的地址空间,而线程之间有完全一样的地址空间,这意味着它们共享同样的全局变量。

由于各个线程都可以访问进程地址空间的每一个内存地址,所以一个线程可以读、写,甚至清除另一个线程的堆栈。也就是说,线程之间是没有保护的。我们知道,不同的进程可能属于不同的用户所拥有,它们之间可能存在敌意。但用户创建多线程是为了它们之间的合作而不是彼此争斗。除了共享地址空间外,所有线程还共享同一个打开的文件集、子进程、报警以及相关信号等。但要注意的是,每个线程都有自己的堆栈、程序计数器、寄存器等信息,这些不是共享的。

与进程不同的是,无法利用时钟中断强制线程让出CPU,所以我们设法使线程行为高尚起来,并且随着时间的推移自动交出CPU,以便让其他线程有机会运行,这正是Pthread_yield系统调用的作用。

 

抱歉!评论已关闭.