进程和线程(单CPU)

分时操作系统:

         时间片:是把计算机的系统资源(尤其是 CPU时间)进行时间上的分割,每个时间段称为一个时间片,每个用户依次轮流使用时间片。

分时技术:把处理机的运行时间分为很短的时间片,按时间片轮流把处理机分给各联机作业使用。

将系统处理机时间与内存空间按一定的时间间隔,轮流地切换给各终端用户的程序使用。由于时间间隔很短,每个用户的感觉就像他独占计算机一样。分时操作系统的特点是可有效增加资源的使用率。    

 

进程/线程(单CPU

进程:

程序本身只是数据、指令及其组织形式的描述,进程才是程序的真正执行实体。在早期面向进程设计的计算机结构中(如早期的UNIXLinux 2.4及更早的版本),进程是程序的基本执行实体;在当代面向线程设计的计算机结构中(如当代多数操作系统、Linux 2.6及更新的版本),进程是线程的容器。

使用者下达执行程序的命令后,就会产生进程。同一程序可产生多个进程(一对多关系),以允许同时有多位使用者执行同一程序而不产生冲突。

 

狭义定义:进程是正在运行的程序的实例(an instance of a computer program that is being executed)。

广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。

 

进程的概念主要有两点:

第一,进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region。文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量

第二,进程是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时(操作系统执行之),它才能成为一个活动的实体,我们称其为进程。

进程需要一些资源才能完成工作:

如程序的可运行机器码的一个在存储器的映像。 分配到的存储器(通常包括虚拟内存的一个区域)。存储器的内容包括可运行代码、特定于进程的数据(输入、输出)、调用堆栈、堆栈(用于保存运行时运数中途产生的数据)。 分配给该进程的资源的操作系统描述符,诸如文件描述符(Unix术语)或文件句柄(Windows)、数据源和数据终端。 安全特性,诸如进程拥有者和进程的权限集(可以容许的操作)。 处理器状态(内文),诸如寄存器内容、物理存储器寻址等。当进程正在运行时,状态通常储存在寄存器,其他情况在存储器。

进程的切换:从正在运行的进程中回收处理器,然后再由待运行进程来占用处理器。

实质就是把进程存放在处理嚣的寄存器中的中间数据、进程状态及堆栈中的内容存放在进程的私有堆栈。让进程来占用处理嚣实质上就是把某个进程存放在私有堆栈中寄存嚣的数据再恢复到处理嚣寄存嚣中去,并把待运行进程的断点送入处理嚣的程序指针。

在切换时,一个进程存储在处理器各寄存器中的中间数据叫做进程的上下文,所以进程切换就是被中止运行进程与待运行进程上下文的切换。

         进程的状态:

1.       ready:就绪态;等待cpu时间片来运行;一个进程要想运行,他的所有条件实现得满足;例如:他所需要打开的某几个硬盘的文件,加载至内存,再分cpu时间片等;他的准备工作都做好了,就等待内核分配给他cpu时间片来运行了,这个状态就叫ready

就绪进程可以按多个优先级来划分队列。例如,当一个进程由于时间片用完而进入就绪状态时,排入低优先级队列;当进程由I/O操作完成而进入就绪状态时,排入高优先级队列。

2.       running:运行态;这个进程正在cpu上运行;运行过程中也有可能被其他进程抢占cpu,被切换出去;也可能与其他进程正常上下文切换。

3.       ready:这是另一种ready;在运行中,cpu时间片到了;被切换出来等待下一个cpu时间片,这种状态也叫ready

4.       sleeping:睡眠态;例:1个进程被分配到5msCPU时间片,运行到2ms时需要从硬盘加载一个文件到内存中,大约需要等待30ms,那剩下的3ms也就不要了,进入睡眠态(这是因为一些外部事件未得到满足而切换出去的进程)

运行态转睡眠态分为两种类型:1)等待IO完成才能从睡眠态中醒来(uninterruptable sleeping)(2)与IO无关,程序运行过程中自己需要终止一段时间这也是一种睡眠态(interruptable sleeping)

进程等待条件满足才能被叫醒,这种状态被称为非可中断睡眠态,如需要从硬盘上加载一个文件到内存,进程要等待文件被加载完才可被唤醒。

而可中断睡眠态可能只要等待一次键盘的输入(例如),就可以唤醒进程。

5.       stopped:停止态;不让进程运行也不让进程退出;只有等用户手动唤醒进程。例如:在前台运行进程时,按下ctrl+z组合键,即可停止该进程。

6.       zombie:僵死态;每个进程通过系统调用来fork()自身来创建子进程,创建完以后开始时子进程与父进程指向的是同一个内存空间,直到子进程修改了一部分内容以后才会复制一份到新内存空间,拥有自己的内存空间,这叫COWcopy on write)机制;当一个子进程完成了,占用的内存资源收回来,打开的文件关闭起来,这都是由父进程来做的工作,此时子进程就处于僵死态,这是正常的僵死态,一旦父进程帮他收尸就真正结束了;非正常僵死态是子进程死的时候父进程早已死了,没有父进程为他收尸,因此进程一直存在,内存无法释放----这就叫内存泄漏!!!如果父进程先结束了子进程就成了孤儿进程(设计好的软件会在父进程结束时由父进程将子进程委托给init进程作为子进程)

如果僵死进程多的话系统上可以内存将越来越少!

 

线程:

         进程能够进行运算调度的最小单位。包含在进程之中,是进程实际运算的单位。一条线程指的是进程中一个单一顺序的控制流,一個进程中可以并行多个线程,每条线程并行执行不同的任务。

同一进程中的多条线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等。但同一进程中的多个线程有各自的调用栈(call stack),自己的寄存器环境(register context),自己的线程本地存储(thread-local storage)。

线程间通信比使用进程间通信更有效和更容易。因为进程中的所有线程共享相同的地址空间,他们不需要使用共享内存。使用互斥对象或者其他同步工具保护共享数据不被并发访问。

线程库提供的同步工具易于实现灵活而强大的同步工具。这些工具能够替换传统的进程间通信工具,例如消息队列。管道可用作线程间通信路径。

一个进程可以有很多线程,每条线程并行执行不同的任务。

 

线程的状态:

         由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也有就绪、阻塞和运行三种基本状态。

就绪状态:线程具备运行的所有条件,逻辑上可以运行,在等待处理机

运行状态:线程占有处理机正在运行

阻塞状态:线程在等待一个事件(如某个信号量),逻辑上不可执行。

线程的特点:

1.       轻型实体

包括程序、数据和TCB。线程的动态特性由TCB描述,TCB包括以下信息:

1)   线程状态

2)   线程不运行时,被保存的现场资源

3)   执行堆栈

4)   存放每个线程的局部变量主存区

5)   访问同一进程中的主存和其它资源

TCB用于指示被执行指令序列的程序计数嚣、保留局部变量、少数状态参数和返回地址等的一组堆栈嚣和堆栈

2.       独立调立和分派的基本单位

线程是能独立运行的基本单位,因而也是独立调派和分派的基本单位。由于线程非常轻量级,故线程的切换非常迅速且开销小。

3.       可并发执行

在一个进程的多个线程之间,可并发执行,甚至允许在一个进程中所有线程都能并发执行;同样,不同进程中的线程也能并发执行,充分利用和发挥了处理机与外围设备并行工作的能力。

4.       共享进程资源

在同一进程中的各个线程,都可以共享该进程所拥有的资源,这首先表现在:所有线程都具有相同的地址空间(进程的地址空间),这意味着,线程可以访问该地址空间的每一个虚地址;此外,还可以访问进程所拥有的已打开文件、定时器、信号量机构等。由于同一个进程内的线程共享内存和文件,所以线程之间互相通信不必调用内核

进程与线程比较:

1.       进程拥有独立的地址空间和其它资源,同一进程内的线程共用相同进程上下文

2.       若一个文件有多个进程都需要访问,则该文件就会被打开多次。而线程是共享资源的,故线程对系统资源的消耗会少些。

3.       进程间通讯需要通过IPC机制,同一进程内的线程可通过共享内存和文件进行。

4.       线程上下文切换速度较快

线程的缺点:

1.       因同一进程的线程间共用进程的上下文,线程间会发生资源争用,进而引起阻塞,影响性能。

2.       同一进程的线程间共享进程内存,故任何一个线程挂掉就会造成整个进程的崩溃。

3.       线程调度时,要保存线程状态,若调度频繁,需要占用大量CPU时钟周期。


猜你喜欢

转载自blog.51cto.com/11975865/2173271