浙江省建设监理协会官方网站,网站建设及报价方案,应聘ui设计师自我介绍,有哪些做特卖的网站重新认识一下进程
在之前写过的与进程相关的博文中#xff0c;都把进程看作是只有一个PCB的进程。如图#xff1a; 而实际上#xff0c;在Linux中#xff0c;进程不止一个执行流#xff0c;而是可能会有几个或很多个。同一个进程中#xff0c;每一个执行流都指向同一个虚…重新认识一下进程
在之前写过的与进程相关的博文中都把进程看作是只有一个PCB的进程。如图 而实际上在Linux中进程不止一个执行流而是可能会有几个或很多个。同一个进程中每一个执行流都指向同一个虚拟地址空间由操作系统创建。即在完整的进程中进程包括若干个执行流虚拟地址空间页表以及存在物理内存中属于该进程的数据和代码。
我们透过进程虚拟地址空间可以看到进程的大部分资源将进程资源合理分配给每个执行流。当CPU调度进程的时候只看执行流PCB。 通过上述对进程的重新认识我们可以知道了一个进程内可以有1个执行流也可以有多个。
线程的概念
首先我们得知道一件事在Linux中没有专门为线程设计的TCB而是使用进程的PCB来模拟线程。
在教科书上面对线程的概念是在进程内部运行的一个执行流属于进程的一部分粒度要比进程更加细和轻量化。
我们可以对这句话进行解析在进程内部运行即线程在地址空间中运行。所谓执行流即对于CPU来说它只看PCB而在进程中的每一个PCB都被分配了若干资源CPU可以直接调度它们按照一定的序列去调度。
因此我们可以理解线程是一个进程内部的控制序列。
了解了什么是线程后我们来看看在Linux中进程和线程的关系。 进程和线程
因为Linux中的线程是进程的PCB模拟出来的因此不用维护线程和进程的复杂关系不用单独为线程设计任何算法而是直接使用进程的的一套相关的方法即可。OS只需聚焦在线程的资源分配上就可以了。
从内核视角看进程和线程的关系 进程是承担分配系统资源的基本实体。线程是CPU调度的基本单位承担进程资源的一部分的基本实体。也就是说线程是向进程要资源进程向OS要资源CPU调度进程中的执行流即线程。 看待Linux线程和接口
Linux进程是轻量级的进程在进程中OS创建线程CPU调度线程。Linux没有给一般用户提供直接操作线程的接口而是提供了在同一个地址空间内创建PCB的方法和分配资源给指定PCB的接口。
进程和线程的共享和私有
其实在Linux中没有线程这个东西我的意思是没有真正独特设计出来的线程。因此在Linux中所谓的线程是轻量级的进程。所有的轻量级进程可能是“线程”都是在进程内部运行的地址空间。
对于进程它大部分是具有独立性的而有部分是共享资源管道ipc资源。
对于线程大部分资源都是共享的有部分资源是“私有”的线程ID、一组寄存器、栈、errno、信号屏蔽字、调度优先级等等。
进程的多个线程共享 同一地址空间,因此Text Segment、Data Segment都是共享的,如果定义一个函数,在各线程中都可以调用,如果定义一个全局变量,在各线程中都可以访问到,除此之外,各线程还共享以下进程资源和环境:文件描述符表、每种信号的处理方式(SIG_ IGN、SIG_ DFL或者自定义的信号处理函数)、当前工作目录、用户id和组id。
线程的优点 ①创建一个新线程的代价要比创建一个新进程小得多 ②与进程之间的切换相比线程之间的切换需要操作系统做的工作要少很多 ③线程占用的资源要比进程少很多 ④能充分利用多处理器的可并行数量 ⑤在等待慢速I/O操作结束的同时程序可执行其他的计算任务 ⑥计算密集型应用为了能在多处理器系统上运行将计算分解到多个线程中实现 ⑦I/O密集型应用为了提高性能将I/O操作重叠。线程可以同时等待不同的I/O操作 线程的缺点 ①性能损失一个很少被外部事件阻塞的计算密集型线程往往无法与共它线程共享同一个处理器。如果计算密集型线程的数量比可用的处理器多那么可能会有较大的性能损失这里的性能损失指的是增加了额外的同步和调度开销而可用的资源不变。 ②健壮性降低编写多线程需要更全面更深入的考虑在一个多线程程序里因时间分配上的细微偏差或者因共享了不该共享的变量而造成不良影响的可能性是很大的换句话说线程之间是缺乏保护的。 ③缺乏访问控制进程是访问控制的基本粒度在一个线程中调用某些OS函数会对整个进程造成影响。 ④编程难度提高编写与调试一个多线程程序比单线程程序困难得多 线程异常 ①单个线程如果出现除零野指针问题导致线程崩溃进程也会随着崩溃 ②线程是进程的执行分支线程出异常就类似进程出异常进而触发信号机制终止进程进程终止该进程内的所有线程也就随即退出 合理的使用多线程能提高CPU密集型程序的执行效率能提高IO密集型程序的用户体验如生活中我们一边写代码一边下载开发工具就是多线程运行的一种表现。
Linux下线程和进程的关系图
可以看到线程是进程的每一个执行流一个进程中可以包含多个线程也可以只有一个线程。