Chinaunix首页 | 论坛 | 博客
  • 博客访问: 36090
  • 博文数量: 8
  • 博客积分: 1482
  • 博客等级: 上尉
  • 技术积分: 90
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-18 13:55
文章分类

全部博文(8)

文章存档

2011年(1)

2008年(7)

我的朋友

分类:

2008-11-03 01:30:10

引:
    最近面试的时候被问到一些操作系统的东西,有些之前理解得比较好,比如说进程线程的,有些之前本来就没注意,自然回答得不好。现在重新拿起《现代操作系统》,反正时间相对比较多,写写学习笔记,总结一下。

第2章 线程与进程
   进程是操作系统中最重要的概念。操作系统几乎其他所有的东西都是围绕着进程来展开的,所以进程是操作系统中最核心的概念了。就好比人的心脏一样,什么心脏,人体内所有其他部位还能正常运作吗?人还能进行其他活动吗?

A. 进程

1. 进程的概念
   其实,对于许多东西,包括现在说的进程,都没有一个绝对的概念。比如说,操作系统的概念,到现在也没有一个确切的概念。简单地说,进程就是一个正在运行的程序。关键字“运行”,就是在活动的东西啊。所以,进程跟程序的区别,就体现在这个地方了。程序是静态的,不会动的,但是进程是会动的,是动态的。程序好比一张纸,纸上面写了你计划要做什么东西,怎么做等等;而进程就是你具体执行的动作了,你要按照计划一点一点地做,但是,可能过程中会出现意外的情况导致你不得不放弃做这件事。不熟悉操作系统的朋友可能要问什么,这后面会提到进程的退出的几种情况。
   在Linux下面,我们用ps命令可以看到许多进程正在运行,在单CPU的情况下,其实这是“伪并行”。顾名思义,也就是说,不是真的这么多东西在同一个时间一起做各自的事情。CPU好比人的大脑,你可以一边听歌一边写代码,但是在某一个时刻,你的大脑只能处理一件事,但是你可能是这样的:你分一点精神听歌,然后又分一点精神写代码,这样看起来貌似你同时听歌同时编程,等到差不多了,程序你写完了,或者歌听完了,看起来你完成了两件事,而且这两件事是在同一个时间段内完成的。进程的运行也是同样的道理,不用多说了吧。

2. 进程的创建
   进程不可能无缘无故就突然出来了。这个世界所有东西也是一样道理,一种东西一件事不可能没有原因就这样出现了。那么,进程是怎么创建的呢?一般可以通过下面几种方法创建:
   1) 系统初始化
   系统初始化一般会建立一些必要的进程,一些在前台,一些在后台。什么是前台? 那些用来跟用户打交道的就是前台的啊,想想那些整天站在公司柜台上打电话的MM们啊。什么是后台? 那些具有专门功能的,一般不用来和客户打交道的就是后台进程。说得有点模糊。比如说,一个用来接受电子邮件的程序是一个后台进程,一般情况下,他会一直在睡眠状态,等到有邮件来了,发一个信号跟他说有邮件到了,他就醒了,开始干活。他是怎么醒的?一会会稍微提到。
   2) 执行了一个从事创建进程的API,这个API被正在运行的进程调用;
   注意,后面的约束是必须的,必须是被正在运行的进程调用;这个倒很好理解;
   3) 用户请求创建一个新进程;
   4) 一个批处理作业的初始化;
   这个我想跟第1点是类似道理的,不多说;

   那么,这4种情况看,我们可以看出所有的新进程的创建都是由一个已经在运行的进程创建的。而这个创建进程的进程做了什么?就是执行一个创建进程的API而已。在Unix/Linux系统,就一个fork()。简单吗?没错,就fork()这样,没有参数。比起windows,简单多了,windows下那个CreateProcess,我记得参数有好几个呢!UNIX中,子进程的初始地址空间是父进程的一个副本,但是注意,这里是两个不同的地址空间,只不过子进程继承了父进程的一些东西而已,当然也有一些东西是共享的,比如说:不可写的内存空间,这可能是出于节省不必要的空间浪费的原因,因为既然不可写了,那要两份干嘛?
   这里顺便说一下Linux的进程层次结构吧,就几句话:父进程创建子进程,子进程又可以创建自己的子进程,这样循环下去,直到资源耗尽。所以,Linux下进程的有层次结构的。而在Linux中,所有进程都有一个共同的祖先,叫做:init.

3. 进程的终止
   有生必有死。进程也是一样,总会有终止的时刻。通常是以下几种情况:
   1) 正常退出(自愿)
   进程完成任务后开开心心地自己退出了;
   2) 出错退出(自愿)
   进程运行到一半发现有问题,有问题得解决后再说,所以自己退出;
   3) 严重错误(非自愿)
   执行过程发现了程序中的错误,比如说:除数是0,操作系统给进程发送了一个信号,叫他走;
   4) 被其他进程杀死(非自愿)
   你正很开心呢地做着事,其他人突然间要你别做,你愿意吗?

4. 进程的状态
   进程主要分为三种状态:
   1) 运行态(该时刻进程占用CPU)
   2) 就绪态(可运行,但是还没轮到他运行)
   3) 阻塞态(除非某种外部事件发生唤醒他,不然不能运行)

   这里不知道怎么上传图片,是一张状态转换图。简单地说下,有以下几种情况:
   1) 运行 ——> 阻塞: 进程为等待输入而阻塞
   2) 运行 ——> 就绪: 调度程序选择了另外一个进程
   3) 就绪 ——> 运行: 调度程序选择了这个进程
   4) 阻塞 ——> 就绪: 出现了有效的输入,这里要注意的是,阻塞是不能直接进入运行状态的,得重新
                     排队,等到CPU空闲并且轮到它运行了才能运行


  


阅读(1843) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~