码迷,mamicode.com
首页 > 编程语言 > 详细

[操作系统] 进程与线程

时间:2016-05-06 15:48:45      阅读:172      评论:0      收藏:0      [点我收藏+]

标签:

一、进程

      进程的引入 多个程序在执行时,需要共享系统资源,从而导致各程序在执行过程中出现相互制约的关系,程序的执行表现出间断性的特征。
      这些特征都是在程序的执行过程中发生的,是动态的过程,而传统的程序本身是一组指令的集合,是一个静态的概念,无法描述程序在内存中的执行情况,即我们无法从程序的字面上看出它何时执行,何时停顿,也无法看出它与其它执行程序的关系,因此,程序这个静态概念已不能如实反映程序并发执行过程的特征。为了深刻描述程序动态执行过程的性质,人们引入“进程(Process)”概念。

      进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体。它不只是程序的代码,还包括当前的活动,通过程序计数器的值和处理寄存器的内容来表示。
      进程是操作系统中最基本、重要的概念。是多任务程序系统出现后,为了刻画系统内部出现的动态情况,描述系统内部各道程序的活动规律引进的一个概念,所有多道程序设计操作系统都建立在进程的基础上。

进程的组成


  • 进程ID,进程组ID,用户ID,组ID
  • 环境
  • 工作目录
  • 程序指令
  • 寄存器
  • 堆栈(Stack)
  • 堆(Heap)
  • 文件描述符
  • 信号操作
  • 共享库
  • 进程间通信工具 : 消息队列、管道、信号量、共享内存

动态性:进程的实质是程序的一次执行过程,进程是动态产生,动态消亡的。
并发性:任何进程都可以同其他进程一起并发执行
独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位;
异步性:由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推进
结构特征:进程由程序、数据和进程控制块三部分组成。

进程与程序


  • 程序是指令的有序集合,其本身没有任何运行的含义,是一个静态的概念。而进程是程序在处理机上的一次执行过程,它是一个动态的概念。
  • 程序可以作为一种软件资料长期存在,而进程是有一定生命期的。程序是永久的,进程是暂时的。
  • 进程更能真实地描述并发,而程序不能;进程是由程序和数据两部分组成的。
  • 进程具有创建其他进程的功能,而程序没有。
  • 在传统的操作系统中,程序并不能独立运行,作为资源分配和独立运行的基本单元都是进程。

进程的基本状态及状态之间的关系


状态:运行、阻塞、挂起阻塞、就绪、挂起就绪
状态之间的转换:

  • 准备就绪的进程,被CPU调度执行,变成运行态;
  • 运行中的进程,进行I/O请求或者不能得到所请求的资源,变成阻塞态;
  • 运行中的进程,进程执行完毕(或时间片已到),变成就绪态;
  • 将阻塞态的进程挂起,变成挂起阻塞态,当导致进程阻塞的I/O操作在用户重启进程前完成(称之为唤醒),挂起阻塞态变成挂起就绪态,当用户在I/O操作结束之前重启进程,挂起阻塞态变成阻塞态;
  • 将就绪(或运行)中的进程挂起,变成挂起就绪态,当该进程恢复之后,挂起就绪态变成就绪态;

技术分享

进程间的通信方式


  1. 管道(pipe)及有名管道(named pipe):管道可用于具有亲缘关系的父子进程间的通信,有名管道除了具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。
  2. 信号(signal):信号是在软件层次上对中断机制的一种模拟,它是比较复杂的通信方式,用于通知进程有某事件发生,一个进程收到一个信号与处理器收到一个中断请求效果上可以说是一致的。
  3. 消息队列(message queue):消息队列是消息的链接表,它克服了上两种通信方式中信号量有限的缺点,具有写权限得进程可以按照一定得规则向消息队列中添加新信息;对消息队列有读权限得进程则可以从消息队列中读取信息。
  4. 共享内存(shared memory):可以说这是最有用的进程间通信方式。它使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据得更新。这种方式需要依靠某种同步操作,如互斥锁和信号量等。
  5. 信号量(semaphore):主要作为进程之间及同一种进程的不同线程之间得同步和互斥手段。
  6. 套接字(socket):这是一种更为一般得进程间通信机制,它可用于网络中不同机器之间的进程间通信,应用非常广泛。

二、线程

      线程(thread)是进程上下文(context)中执行的代码序列,是进程中的一个实体,是被系统独立调度和分派的基本单位 ,又被称为轻量级进程(light weight process)。在支持多线程的系统中,进程成为资源分配和保护的实体,而线程是被调度执行的基本单元。
      线程只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。
      一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。
      线程是程序中一个单一的顺序控制流程。在单个程序中同时运行多个线程完成不同的工作,称为多线程。
技术分享

进程内的线程


  • 一个线程对共享的系统资源进行修改,在这个进程内的其它线程也可以见到这种修改。
  • 对于同一个数据,可能有两个值相同的指针指向这个数据。
  • 进程内的多个线程可以对同一个内存单元进行读和写操作,所以必须要采取显式同步机制。
  • 在同一个进程的地址空间下,线程间的通信消耗更小。

  • 程序在操作系统中作为进程方式存在、获取资源、运行。
  • 在一个进程内,线程可以创建其它线程。每个线程有各自的栈(stack)。
  • 一个进程内所有的线程共享代码段和数据段。

线程的生命周期


  • 线程的标识:通常用一个整数来标识一个线程
  • 线程的创建:自动创建从main函数开始的主线程,调用函数库接口创建一个新的线程(pthread_create)
  • 线程的终止:执行完毕,或者调用了pthread_exit,主线程退出导致整个进程会终止

线程的状态


  • 就绪(ready):线程等待可用的处理器。
  • 运行(running):线程正在被执行。
  • 阻塞(blocked):线程正在等待某个事件的发生(比如I/O的完成,试图加锁一个被上锁的互斥量)。
  • 终止(terminated):线程从起始函数中返回或者调用pthread_exit。
    技术分享

多线程的优点


  • 创建一个线程比创建一个进程的代价要小
  • 线程的切换比进程间的切换代价小
  • 充分利用多处理器
  • 数据共享
  • 数据共享使得线程之间的通信比进程间的通信更高效
  • 快速响应特性
  • 在系统繁忙的情况下,进程通过独立的线程及时响应用户的输入

线程的同步与互斥


      当有多个线程的时候,经常需要去同步这些线程以访问同一个数据或资源。例如,假设有一个程序,其中一个线程用于把文件读到内存,而另一个线程用于统计文件中的字符数。当然,在把整个文件调入内存之前,统计它的计数是没有意义的。但是,由于每个操作都有自己的线程,操作系统会把两个线程当作是互不相干的任务分别执行,这样就可能在没有把整个文件装入内存时统计字数。为解决此问题,你必须使两个线程同步工作。
      所谓同步,是指散步在不同进程之间的若干程序片断,它们的运行必须严格按照规定的某种先后次序来运行,这种先后次序依赖于要完成的特定的任务。如果用对资源的访问来定义的话,同步是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源。
      所谓互斥,是指散布在不同进程之间的若干程序片断,当某个进程运行其中一个程序片段时,其它进程就不能运行它们之中的任一程序片段,只能等到该进程运行完这个程序片段后才可以运行。如果用对资源的访问来定义的话,互斥某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。

由于线程共享同一进程的内存空间,多个线程可能需要同时访问同一个数据。如果没有正确的保护措施,对共享数据的访问会造成数据的不一致和错误。
常用的同步机制:

  • 临界区(critical section)
  • 信号量(simphore)
  • 互斥量(mutex)
  • 管程(monitor)

信号量(simphore)
信号量被定义为一个整数变量,用两个原子的操作wait和signal来操作信号量
wait:当执行wait时,如果信号量的值大于0,wait操作把信号量的值减1并返回;如果当前信号量的值为非正数则wait会等待。
signal : signal操作对信号量的值加1,并唤醒哪些等待的进程

互斥量(mutex)
在同一时刻只能有一个线程能够对互斥量加锁 ,线程用互斥量对共享变量counter的互斥访问:

pthread_mutex_t  count_mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_lock(  &count_mutex ) ;
    counter++ ;
pthread_mutex_unlock( &count_mutex );

三、进程与线程的区别与联系

  • 子进程和父进程有不同的代码和数据空间,而多个线程则共享数据空间,每个线程有自己的执行堆栈和程序计数器为其执行上下文.
  • 多线程主要是为了节约CPU时间,发挥利用,根据具体情况而定. 线程的运行中需要使用计算机的内存资源和CPU

进程和线程的关系:
(1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。
(2)资源分配给进程,同一进程的所有线程共享该进程的所有资源。
(3)处理机分给线程,即真正在处理机上运行的是线程。
(4)线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。线程是指进程内的一个执行单元,也是进程内的可调度实体.

进程与线程的区别:
(1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位
(2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行
(3)拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源.
(4)系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。

[操作系统] 进程与线程

标签:

原文地址:http://blog.csdn.net/wangjianyu0115/article/details/51318668

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!