操作系统之进程那些事

来源:互联网 发布:mysql字段不区分大小写 编辑:程序博客网 时间:2024/05/20 06:50

这篇博客主要讲解进程、线程的概念,包括进程、线程的同步、通信等方法。

进程是一个程序及其数据在处理机上顺序执行时所发生的活动。进程是进程实体(包括二进制文件、数据和进程控制块PCB)的运行过程,是系统进行资源分配和调度的一个独立单位。
我觉得可以这样理解进程,比如你写了一个echo程序(打印用户从键盘输入的字符),编译以后变成了可执行文件,然后执行它,这时操作系统会将可执行文件调入内存中,并且创建新的进程(新建一个进程控制块),然后等待用户输入字符(数据),然后程序停止运行。上面整个过程就是进程。

进程的特征

  • 结构性:它由程序段、数据段和进程控制块组成。
  • 动态性:进程可以被动态地创建、执行和撤销。
  • 并发性:一个时间段内,有多个进程运行过。
  • 独立性:进程是操作系统进行资源分配和调度的基本单位。
  • 异步性:我的理解是进程它不是你新建以后就直接运行到结束的,而是进入就绪状态,随后可能进行多次的状态的切换(阻塞->运行->阻塞->运行),最后这个进程才运行结束。就是你的进程不会马上能够执行,而是随后在某个恰当的时机再执行(操作系统说:好的,我已经知道了,我会放到to do list里,稍后再处理你的事情)。

进程的结构

(1)代码段:描述进程所完成的功能。其实就是一系列的指令。
(2)数据集合:程序运行时所需要的数据区。
(3)进程控制块(PCB):进程控制块是进程的标识,它是一种能 够刻画进程状态的数据结构。操作系统就是通过PCB来控制和管理进程的。比如,你的个人档案就相当于PCB,是社会了解你的标识。
PCB的具体内容包括:

  • 进程标识符信息:包括唯一的进程id,以及创建者设立的进程名字。
  • 处理机的状态:包括寄存器、指令计数器、用户堆栈指针等信息。
  • 进程调度信息:进程的状态、优先级、阻塞的原因等。
  • 进程控制信息:程序和数据的地址、资源清单、链接指针等。
    此外还包括进程其他的信息,比如进程关系树等。

进程的状态及转换

进程包括三种基本状态:

  1. 就绪状态:
    进程获得了除CPU以外的所有资源,万事具备,只欠CPU我就可以火烧赤壁了。
  2. 执行状态:
    进程已经获得CPU资源在处理机上跑了。
  3. 阻塞状态:
    进程在执行过程中因为自身需要,发生了某事件(比如等待用户输入)而暂停执行的状态。

进程三个基本状态之间的转换图如下:
进程状态转换图

此外,由于终端用户或者父进程希望子进程同步的需要,以及操作系统可能为了减轻负荷,进程还可能有挂起状态:
挂起状态是一种静止状态,包括静止就绪状态和静止阻塞状态。该状态下的进程可以存放到外存保留以便回收部分包括内存、外设在内的资源。
包括挂起状态的转移图如下:
这里写图片描述

并发执行的特征

在操作系统上,有很多进程同时在内存上运行,其特征表现为:
(1)间断性:多个进程相互制约,出现你运行一下,我运行一下的情况。
(2)不可再现性:进程的执行结果跟CPU有关,也跟其他进程有关。
(3)失去封闭性:多个进程共享资源。

进程通讯方式

在操作系统上,只要数据能突破进程空间的隔离,完成数据在进程间的传递就可以实现进程间的通信。狭义上来讲,进程间主要有以下三种通讯方式(广义上还可以包括socket以及利用磁盘文件通信):
(1)管道(单向传输):管道实质上内核管理的一个缓冲区,一边由一个进程写入,另一边有进程读出。管道满了将会阻塞写入进程,管道内部没有显示的格式和边界。管道分两种:无名管道和命名管道。无名管道一般用于父子进程的通信。而命名管道则可用于任意进程之间。
(2)消息队列:跟邮箱类似,有信封和内容,各类消息通过类型来进行区分。
(3)共享内存:有内核提供的一段内存,可以映射在多个进程的虚存空间上,从而可以通过内存上的读写操作完成进程间的数据共享,非常方便。
(4)信号量:一个计数器。具有P/V等原子操作,通过标识来访问。

进程同步

为什么要同步:主要是为了保证数据的一致性以及活动按序进行。
进程同步一般用POSIX有名信号量来做。该信号量有P操作(加1操作)和V操作(减1操作),当信号量的值为0时,将会阻塞,因此可以实现同步。
参考链接

孤儿进程和僵尸进程

孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将会被init进程所收养,并由init进程对它们完成状态收集工作。
僵尸进程:一个子进程在其父进程还没有调用wait或者waitpid的情况下退出,这个子进程就是僵尸进程。
孤儿进程不会浪费空间,但是僵尸进程会浪费空间。

线程

为什么要线程?
考虑下面的场景,一个网络服务器服务于N个客户端,需要N个独立的进程,但是此时每个进程实体(功能)都是一样的,只是执行的状态不相同(有的已经响应到客户端,一个正在建立连接,有的正处理请求)。那么,就需要N个PCB。这无疑十分耗费空间。
于是线程出现了,它能够有效减少上述应用场景的开销并提高计算机系统的并发执行能力。有了线程,进程成为了CPU调度和资源分配的基本单位,而线程则是任务调度和执行的基本单位。
线程和进程的关系与区别
1、线程是调度的基本单位,进程是资源分配的基本单位。
2、进程是比较大的概念,一个进程至少包括一个线程,线程是进程的一个执行流。
3、在创建、撤销、切换等操作上,线程的开销小于进程的开销。
4、线程只拥有程序计数器、自己的堆栈、TCB,它共享进程资源。

线程同步手段

  1. 临界区:通过对多线程的串行化来访问公共资源或者一段代码,速度快,适合控制数据访问。
  2. 互斥量:采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限,因为互斥对象只有一个,所以可以保证公共资源不会同时被多个线程访问。
  3. 信号量:它允许多个线程同一时刻访问同一资源,但是需要限制同一时刻访问此资源的最大线程数目。信号量对象对线程的同步方式与前面几种方法不同,信号允许多个线程同时使用共享资源。
  4. 事件:通过通知操作的方式来保持多线程的同步,还可以方便的实现多线程的优先级比较操作。

    参考链接

0 0
原创粉丝点击