操作系统知识汇总--进程与线程

来源:互联网 发布:行知学校招生简章 编辑:程序博客网 时间:2024/05/16 11:19

声明:本篇为个人原创,欢迎读者们提出修改和指正,也欢迎分享,分享请注明作者和链接。

一、        进程的引入

  计算机运行的是程序,程序是指令的序列,指令涉及CPU运算的指令和I/O指令。

计算机的发展历程:手工操作,简单批处理,多道批处理,分时系统,UNIX,DOS,WINDOWS,Linux。

这里关注两个过程:简单批处理和多道批处理。

简单批处理:计算机能够识别并自动运行一个作业,并且连续执行。

多道批处理:计算机的主要运行部件是CPU,但CPU在简单批处理中的使用效率比较低,原因是 I/O指令运行过程中CPU被占用但是没有实际工作,在等待I/O结束。多道批处理中DMA的出现改进了这一点,使得CPU在不同的并发执行程序之间切换,提高CPU利用率。

这里需要提醒:执行程序是一个动态过程,它和程序本身不同。进程这个概念有效区分了这一点。以下是两点不同:

位置:程序在磁盘(外存),进程在内存。

时间:进程随着时间而变化(从创建到收回),程序可能被进程修改,但本身没有动态的过程,是静态的。

程序与进程(程序的运行过程):

程序源代码(就是程序猿们的心血)à 编译连接 à 可执行程序(windows里面常见的 .exe文件,Linux中的 .out文件等,此时还是程序)à 运行程序,内存里创建进程。

我们日常生活中在电脑里运行的程序都是进程,对用户来讲,进程是最直观的,可以交互的客体。

说了这么多,总结一下:进程和程序是不同的,进程描述了执行程序的状态,进程概念à多进程切换à提高CPU利用率。

二、       进程在计算机里是个啥

  说了进程的引入,目前对进程的了解,也就是一个概念,它具体是个什么呢。

  这个需要用数据结构来描述它,虽然不同操作系统对进程有不同的定义,但基本的内容不会变(就像程序猿虽然薪酬公司不一样,但也都是猿,一个种族)。进程基础结构为:数据,代码,上下文。

  其中,数据指的是在程序运行过程中的一些局部变量,全局变量,堆栈,缓冲区等),代码就是正在运行的代码了(一般不会把所有代码都放到内存里,要不内存利用率太低了,这个是内存管理的内容,以后会说。),上下文的全称是PCB(process control block),也是进程的核心部分。PCB中记录的内容大体如下:

1.   pid,这是进程的唯一标示,可以看做是一个特殊的编号,和学生学号差不多。

2.   进程状态描述,进程优先级,程序地址范围,占有资源清单等。

3.   与其他进程的联系:父进程pid(可理解为血缘关系),进程队列指针(进程使用队列存储,这个指针指向下一个进程),与其他进程的通信信息。

 

三、       进程的状态

  进程是一个动态的概念,所以区分进程的状态就是学习进程的必经之路。进程一个五个主要的状态:新建,就绪,运行,阻塞,退出,也很好理解,创建和退出就不用多说了,进程存在时的主要状态就是就绪态,运行态和阻塞态。这几种状态的转化如下图所示:

 

 在这个过程中主要发生变化的是进程的队列,根绝进程的状态,操作系统中有三类进程的队列:运行队列,就绪队列和等待队列。进程状态的改变就是由进程数据结构中的标志变量和所在队列改变体现的。比如,一个进程因为等待I/O而被阻塞,这时,进程就会把自己放入等待队列中,然后从就绪队列中挑一个运行,挑选的过程由调度算法操纵,这个在进程调度那里说。切换的过程中会有上下文切换,就是把上一个进程的相关数据(如变量,堆栈,缓冲区等)存起来,把下一个运行的进程的数据调出来。

四、       进程通信的两种形式

进程通信有两种形式,一种是共享内存,一种是消息传递,这两种通信方式确保了进程之间能够相互协作。两者都有相应的系统调用支持。

五、       线程

  线程可以看做是进程的细分,一个进程中有许多可以并行的代码序列,举个例子:在浏览器运行一个网页的过程中,获取文本信息并且显示和获取图片信息并且显示就是可以并行的,由于文字数据量相对较小,可以先获取文字,然后显示文字和获取图片可以同时进行。

  因此,引入线程可以进一步提高某一个进程的运行效率。另一种想法也许是:可以把进程直接拆分成子进程,这是一个不错的想法,但是线程比子进程更好,这就涉及线程切换和进程切换的比较:

1.   线程存在资源共享,子进程之间的资源无法共享,如果使用子进程,势必造成空间浪费。

2.   线程线程切换代价小,只需要切换进寄存器和栈,而进程切换代价大,时间耗费也更高。

3.   多线程为多CPU处理一个进程提供了良好的渠道。

六、       线程的分类

  线程可以分成用户态和内核态两种(是不是很熟悉,代码也可以这么划分的),并且由此可以有三种模型来实现线程:多对一,一对一和多对多。

  多对一模型中,多个线程对应一个进程,内核直接管理进程,不管线程的管理,线程的管理是由程序猿决定的。内核中只有进程表,没有线程表。线程表在用户空间中。

  一对一模型中,用户态一个线程对应内核态一个线程,可以说这时的线程就是内核级线程,内核会管理每一个创建出来的线程,但由于过多的线程会影响系统的性能,所以操作系统会限制线程的数量。内核中会设立线程表来管理。用户空间没有线程表。

  多对多模型中,多个线程对应内核中的一个线程,线程被划分为用户态和内核态。内核态的线程完成内核的任务。

 


0 0
原创粉丝点击