For investors
股价:
5.36 美元 %For investors
股价:
5.36 美元 %认真做教育 专心促就业
软件编程开发技术的学习与应用是目前许多人都比较看好的一个职业发展方向,而本文我们就通过案例分析来简单了解一下,程序员需要掌握哪些线程与进程管理方法。
进程、线程管理
进程和线程基础知识
进程:进程是系统进行资源分配和调度的一个独立单位,是系统中的并发执行的单位。
线程:线程是进程的一个实体,也是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位,有时又被称为轻权进程或轻量级进程。
进程
运行中的程序,就被称为「进程」(Process)。
在一个进程的活动期间至少具备三种基本状态,即运行状态、就绪状态、阻塞状态。
运行状态(Running):该时刻进程占用CPU;
就绪状态(Ready):可运行,由于其他进程处于运行状态而暂时停止运行;
阻塞状态(Blocked):该进程正在等待某一事件发生(如等待输入/输出操作的完成)而暂时停止运行,这时,即使给它CPU控制权,它也无法运行;
当然,进程还有另外两个基本状态:
创建状态(new):进程正在被创建时的状态;
结束状态(Exit):进程正在从系统中消失时的状态;
挂起状态可以分为两种:
阻塞挂起状态:进程在外存(硬盘)并等待某个事件的出现;
就绪挂起状态:进程在外存(硬盘),但只要进入内存,即刻立刻运行;
PCB进程控制块是进程存在的标识
PCB具体包含什么信息呢?
进程描述信息:
进程标识符:标识各个进程,每个进程都有一个并且的标识符;
用户标识符:进程归属的用户,用户标识符主要为共享和保护服务;
进程控制和管理信息:
进程当前状态,如new、ready、running、waiting或blocked等;
进程优先级:进程抢占CPU时的优先级;
资源分配清单:
有关内存地址空间或虚拟地址空间的信息,所打开文件的列表和所使用的I/O设备信息。
CPU相关信息:
CPU中各个寄存器的值,当进程被切换时,CPU的状态信息都会被保存在相应的PCB中,以便进程重新执行时,能从断点处继续执行。
线程
线程是进程当中的一条执行流程。
同一个进程内多个线程之间可以共享代码段、数据段、打开的文件等资源,但每个线程各自都有一套独立的寄存器和栈,这样可以确保线程的控制流是相对独立的。
线程的实现
主要有三种线程的实现方式:
用户线程(*UserThread*):在用户空间实现的线程,不是由内核管理的线程,是由用户态的线程库来完成线程的管理;
内核线程(*KernelThread*):在内核中实现的线程,是由内核管理的线程;
轻量级进程(*LightWeightProcess*):在内核中来支持用户线程;
一种关系是多对一的关系,也就是多个用户线程对应同一个内核线程
二种是一对一的关系,也就是一个用户线程对应一个内核线程
三种是多对多的关系,也就是多个用户线程对应到多个内核线程
用户线程的整个线程管理和调度,操作系统是不直接参与的,而是由用户级线程库函数来完成线程的管理,包括线程的创建、终止、同步和调度等。
线程的优点:
一个进程中可以同时存在多个线程;
各个线程之间可以并发执行;
各个线程之间可以共享地址空间和文件等资源;
线程的缺点:
当进程中的一个线程崩溃时,会导致其所属进程的所有线程崩溃(这里是针对C/C++语言,Java语言中的线程奔溃不会造成进程崩溃
内核线程是由操作系统管理的,线程对应的TCB自然是放在操作系统里的,这样线程的创建、终止和管理都是由操作系统负责。
进程/线程上下文切换
进程
一个进程切换到另一个进程运行,称为进程的上下文切换。
进程的上下文切换到底是切换什么呢?
进程是由内核管理和调度的,所以进程的切换只能发生在内核态。
所以,进程的上下文切换不仅包含了虚拟内存、栈、全局变量等用户空间的资源,还包括了内核堆栈、寄存器等内核空间的资源。
通常,会把交换的信息保存在进程的PCB,当要运行另外一个进程的时候,我们需要从这个进程的PCB取出上下文,然后恢复到CPU中,这使得这个进程可以继续执行
发生进程上下文切换有哪些场景?
为了保证所有进程可以得到公平调度,CPU时间被划分为一段段的时间片,这些时间片再被轮流分配给各个进程。这样,当某个进程的时间片耗尽了,进程就从运行状态变为就绪状态,系统从就绪队列选择另外一个进程运行;
进程在系统资源不足(比如内存不足)时,要等到资源满足后才可以运行,这个时候进程也会被挂起,并由系统调度其他进程运行;
当进程通过睡眠函数sleep这样的方法将自己主动挂起时,自然也会重新调度;
当有优先级更高的进程运行时,为了保证高优先级进程的运行,当前进程会被挂起,由高优先级进程来运行;
发生硬件中断时,CPU上的进程会被中断挂起,转而执行内核中的中断服务程序;
线程
线程上下文切换的是什么?
这还得看线程是不是属于同一个进程:
当两个线程不是属于同一个进程,则切换的过程就跟进程上下文切换一样;
当两个线程是属于同一个进程,因为虚拟内存是共享的,所以在切换时,虚拟内存这些资源就保持不动,只需要切换线程的私有数据、寄存器等不共享的数据;
所以,线程的上下文切换相比进程,开销要小很多。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请加danei456学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。