操作系统基础之进程管理

进程相关概念

1.Process

  A process is just an instance of an executing program, including the current values of the program counter, registers, and variables. 
  简单来说,进程就是正在执行的程序。但要注意进程与程序有着本质上的区别。

  进程与程序的主要区别: 

  • 程序是永存的;进程是暂时的,是程序在数据集上的一次执行,有创建有撤销,存在是暂时的;
  • 程序是静态的观念,进程是动态的观念;
  • 进程具有并发性,而程序没有;
  • 进程是竞争计算机资源的基本单位,程序不是。
  • 进程和程序不是一一对应的: 一个程序可对应多个进程即多个进程可执行同一程序; 一个进程可以执行一个或几个程序。

  进程的特征:

  • 动态性:是程序的一次执行;
  • 并发性:进程是可以并发执行;
  • 独立性:是系统进行资源分配和调度的一个独立单位;
  • 异步性:进程间的相互制约,使进程执行具有间隙;
  • 结构性:进程是具有结构的。

  导致进程创建的事件:

  • 系统初始化
  • 执行了正在运行的进程所调用的进程创建系统调用
  • 用户请求创建一个新进程
  • 一个批处理作业的初始化

     从技术上看,所有情形中,新进程的创建都是由于一个已存在的进程执行了一个用于创建进程的系统调用而创建的。这个进程可以是一个运行的用户进程,一个由鼠标或者键盘启动的系统或者一个批处理管理进程。这个进程所做的工作是,执行一个用来创建新进程的系统调用。这个系统调用通知系统创建一个新进程,并且直接或者间接地指定该进程中运行的程序。

  在UNIX系统中,只有一个系统调用可以用来创建新进程:fork。这个系统调用会创建一个与调用进程相同的副本。在调用了fork后,这两个进程用了相同的存储映像,同样的环境字符串和同样的打开文件。而在windows系统中,是由一个win32函数调用CreateProcess既处理进程的创建,也负责把正确的程序装入新的进程。不论是UNIX还是WINDOWS系统,父进程和子进程都有各自不同的地址空间。

 

  进程的终止

  进程创建以后,它开始运行,完成其工作。但并不是一直驻留内存。进程终止,通常由以下事件所引起的:

    1) 正常退出。多数进程是由于完成了所需要完成的工作而退出

    2) 出错退出。例如:打开一个不存在的文件而引起的出错退出

    3) 严重错误。例如:执行了一条非法指令、引起不存在的内存等等

    4) 被其他进行杀死 。某个进程执行一个系统调用通知操作系统杀死其他进程。在UNIX系统中,这个系统调用是kill,而在win32系统中,这个系统调用是TerminateProcess。在这两种情形中,“杀手”都必须获得确定的授权才能执行相应的动作。

 

  进程的三态:

                

     使用进程模型使我们易于想象系统内部的操作情况。例如,当发生一个磁盘中断时,系统会做出决定,停止运行当前进程,转而运行磁盘进程,该进程在次之前因等待中断而处于阻塞状态。这样,我们就可以不在考虑中断,而只是考虑用户进程、磁盘进程等。

  

 

  操作系统的最底层是调度程序,在它上面有许多进程。

2.Thread

  首先来想象为什么在进程中还要有一类“进程”?

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

  第二个原因:由于线程比进程更轻量级,所以它比进程更容易创建,也更容注销。

  第三个原因:  若多个线程都是CPU密集型的,那么并不能获得性能上的提升。但是,如果存在大量的计算和I/O处理,拥有多个线程允许这些活动重叠进行,从而加快应用程序执行的速度。

 

3.进程间的通信

  关于进程间通信有三个问题:

    第一,一个进程如何把信息传递给另外一个?

    第二,如何确保两个或者多个进程在关键活动中不会出现交叉?

    第三,如何保证各个进程通信的顺序问题?

    对于同一进程中的不同线程来说,这个很好解决。但是对于不同进程间是如何通信,目前主要有以下几种方式:

       1.管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信;

        2信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数);

    3报文(Message)队列(消息队列):消息队列是消息的链接表,包括Posix消息队列system V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。

  4共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。
5信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。
6套接口(Socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其它类Unix系统上:Linux和System V的变种都支持套接字。

 

 

 

 

posted @ 2017-05-20 16:34  看雪。  阅读(277)  评论(0编辑  收藏  举报