码迷,mamicode.com
首页 > 其他好文 > 详细

操作系统问题解答

时间:2018-10-05 17:22:26      阅读:118      评论:0      收藏:0      [点我收藏+]

标签:描述符   影响   效率   实践   地理   获得   分数   集合   通信   

1.进程线程,什么是线程和进程?区别是啥?

程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程。程序和进程的区别就在于:程序是指令的集合,它是进程运行的静态描述文本;进程是程序的一次执行活动,属于动态概念。

进程是操作系统资源分配的基本单位(cpu、内存、文件、网络端口),进程是应用程序的执行实例,比如电脑里运行着浏览器进程、QQ客户端进程、邮件进程还有其他操作系统的一些基础进程;线程是调度和程序执行的基本单位。为什么是调度的基本单位

 

 

并发 != 并行

 

进程:多个程序的并发执行;线程:程序中多个任务的并发执行。

同一个进程内的线程共享进程的资源,进程拥有独立的地址空间,线程共享进程的地址空间

 

 

 

计算机能在我写博客的时候收取邮件还能发送QQ消息,当然对于cpu来讲,某一个时刻只会运行一个进程,但是我们的操作系统有任务调度程序,让cpu根据调度来在这些进程之间不断的切换。在一秒钟之内,操作系统就会在不同的进程中切换很多次,这也是对于我们人来讲,感觉就像是计算机在同时做这几件事情,但对于cpu来讲他是在不同进程之间的执行来回切换。

进程调度算法

之所以会有线程,是因为在进程中运行多种活动时,当进行某一项活动时比如读取磁盘数据,此时进程就处于阻塞状态,整个事情的进展就处于暂时的停止状态,如果我们将进程中的多种工作分派给不同的线程去处理,比如一个线程在向内存中写入数据,一个线程在分析数据,这样就不会在读取数据的时候无法分析数据了。这就是为什么会有线程的概念。

     其次线程可以共享进程中的资源比如打开的文件、全局变量等公共资源,另外线程比进程更轻量级,创建和销毁比进程要快10-100倍。这两个也是线程之所以存在的原因。

     线程在进程的内存空间中有自己的内存空间用来临时保存自己的堆栈或寄存器内容或程序计数器,用来恢复继续运行,进程中不同的线程不像不同的进程之间存在着很大的独立性,所有线程都有完全一样的地址空间,这意味着线程之间共享全局变量。由于各个线程都可以访问进程地址空间中的任意内存地址,所以一个线程可以修改读取甚至删除另一线程的堆栈,线程之间是没有保护的。因为不同的线程肯定来自同一进程也就是同一用户,他们之间不会有敌意,他们之间还可以共享打开的文件集、子进程、以及相关信号。而不同的线程之间的通信就复杂的多,同一进程中的多个线程是相互信任的,而不同的进程之间是不信任的。

 

 

 线程间共享进程的所有资源,每个线程有自己的堆栈和局部变量。线程由CPU独立调度执行,在多CPU环境下就允许多个线程同时运行。同样多线程也可以实现并发操作,每个请求分配一个线程来处理。

 

进程和线程都可以认为是并发执行程序,但是只有多处理器下的多线程才可以真正实现并发(多个线程在同一个时间片同时运行),其他的实际上并不是真正的并发,都是交替在cpu上运行,只是每个程序运行的时间很短(时间片),快速的交替,所以看上去就是同时在运行(并发)。

  几乎是同样的效果,为什么又分为进程和线程呢?进程和线程最大的区别在于,进程与进程间互不影响,他们拥有各自的完整的虚拟内存,是一个完整的个体。而线程存在于进程中,一个进程可以有很多线程,同一个进程下的线程具有很多共享的内存,比如文件描述符,全局变量等,也有他们私有的数据,如栈区的内存等。所以创建一个线程的开销(占有的资源)远远小于一个进程,这也就是为什么分进程和线程的原因 。

  所以总结一下程序,进程线程的关系吧。一个运行的程序可以有多个进程,一个进程下面可以有多个线程。这就是这三者的关系。要想更加深入地理解这个概念,还是得通过编程去理解。因为理论和实践的关系,马克思已经讨论地不要不要的。

 

第一:因为进程拥有独立的堆栈空间和数据段,所以每当启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这对于多进程来说十分“奢侈”,系统开销比较大,而线程不一样,线程拥有独立的堆栈空间,但是共享数据段,它们彼此之间使用相同的地址空间,共享大部分数据,比进程更节俭,开销比较小,切换速度也比进程快,效率高,但是正由于进程之间独立的特点,使得进程安全性比较高,也因为进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。一个线程死掉就等于整个进程死掉。

第二:体现在通信机制上面,正因为进程之间互不干扰,相互独立,进程的通信机制相对很复杂,譬如管道,信号,消息队列,共享内存,套接字等通信机制,而线程由于共享数据段所以通信机制很方便。。

 

进程至少有 5 种基本状态,它们是:初始态,执行态,等待状态,就绪状态,终止状态。

 

线程,在网络或多用户环境下,一个服务器通常需要接收大量且不确定数量用户的并发请求,为每一个请求都创建一个进程显然是行不通的,——无论是从系统资源开销方面或是响应用户请求的效率方面来看。因此,操作系统中线程的概念便被引进了。线程,是进程的一部分,一个没有线程的进程可以被看作是单线程的。线程有时又被称为轻权进程或轻量级进程,也是 CPU 调度的一个基本单位。

 

进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。

 

进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。

进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率

 

总线程数<= CPU数量:并行运行

  总线程数> CPU数量:并发运行

 

Why: 由于CPU与其他PC资源之间速度的不协调,人们想提高资源利用率,所以人们提出了多任务系统。得益于CPU的计算速度,我们可以“同时”运行多个任务,实质上是多个任务之间轮流使用CPU资源,由于速度超快,给用户的感觉就是连续的。

How: 1)任务的执行需要依赖各个PC资源,我们可以称为计算机执行的上下文环境。要实现“同时执行”,就需要不断轮换,为了后来继续从当前状态执行下去,计算机需要保存切换前的程序上下文。所以有了进程:用进程去描述程序当前上下文的状态信息----内存位置、变量值、任务ID……所以,进程是资源分配的单位。一般来说宏观上可以看做是一个软件的运行,例如一个word文档的打开。

2)多个任务之间切换因为要保存上下文、调入上下文,一旦多了的时候,还是有一定的时间消耗的。为了进一步提高资源利用率,人们在进程中,引入了线程,线程只是CPU轮流调度的单位,其他上下文信息用所在进程中的。这样上下文切换的耗时就降了下来。同样的,宏观上来可以看做是一个软件中的多个处理功能,例如上述打开word中拼写检查功能、字体加粗……



 
技术分享图片
 
 
技术分享图片

 

 

 

 

 

操作系统按照一定的规则来分配什么时候由谁来获得CPU的计算资源,比如分时间片

 

 

在开销方面:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。

所处环境:在操作系统中能同时运行多个进程(程序);而在同一个进程(程序)中有多个线程同时执行(通过CPU调度,在每个时间片中只有一个线程执行)

内存分配方面:系统在运行的时候会为每个进程分配不同的内存空间;而对线程而言,除了CPU外,系统不会为线程分配内存(线程所使用的资源来自其所属进程的资源),线程组之间只能共享资源。

包含关系:没有线程的进程可以看做是单线程的,如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。

https://blog.csdn.net/kuangsonghan/article/details/80674777

https://blog.csdn.net/zsl091125/article/details/52540348

https://www.cnblogs.com/azheng007/p/3581696.html

 

操作系统问题解答

标签:描述符   影响   效率   实践   地理   获得   分数   集合   通信   

原文地址:https://www.cnblogs.com/ymjyqsx/p/9745020.html

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