300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > c++ 等待子线程结束_进程和线程

c++ 等待子线程结束_进程和线程

时间:2019-08-31 12:12:20

相关推荐

c++ 等待子线程结束_进程和线程

1.进程的基本概念

进程简单说就是运行中的可执行文件。代码经过编译后生成二进制可执行文件,当运行该可执行文件时,代码被装载到内存中,然后CPU会执行程序中的指令。

有关进程调度,例如进程A,进程B,CPU不需要阻塞等待进程A数据的返回,而是去执行进程B。当进程A数据返回时,CPU会收到一个中断,然后CPU继续运行A进程,即多个进程交替进行。

1.1.进程的并发和并行有什么区别?

如下图所示,并发是进程交替运行,而并行则是两个进程同时运行。

1.2.进程的状态

运行状态:当前占用CPU;

就绪状态:可以运行,但是当前CPU正在运行其它进程而暂停;

阻塞状态:正在等待某一事件,而暂时停止运行。

1.3.进程的控制结构

操作系统使用进程控制结构PCB(process control block)数据结构来描述进程,PCB是进程存在的唯一标识,随着进程消失,相应的PCB信息也将消失。

那么PCB是如何组织的呢?一种方式是链表,把具有相同状态的进程链在一起,组成各种队列,如就绪队列,阻塞队列等;另外一种方式是索引,将同一状态的进程组织在一个索引表中,索引表项指向相应的PCB,不同状态对应不同的索引表。进程创建、销毁等调度导致的进程状态会变化,由于链表较索引更灵活处理插入和删除,所以一般选链表。

1.4.进程的控制

a) 进程创建

一个进程可以创建多个进程,子进程可以继承父进程所拥有的资源,当子进程被终止时,其在父进程处继承的资源均还给父进程,当父进程终止时,子进程也会同时终止。进程创建时,会分配一个唯一的进程标识号,并申请并初始化一个PCB, 然后根据进程的调度队列,将新进程插入到相应的队列,等待被调度运行。

b) 进程的终止

进程的终止方式可以分为正常结束、异常结束、外界干预(调用kill命令)。终止进程过程:

首先查找要终止的进程PCB;

如果处于执行状态,立即终止该进程包括所有子进程的执行,然后将CPU资源分配给其它进程;

将其从PCB所在的队列中删除;

1.5.进程的上下文切换

进程是共享CPU资源的,根据资源调度的需要,进程之间会进行切换,即进程的上下文切换。CPU根据寄存器和程序计数器,来确定任务从哪儿加载以及从哪儿开始运行。CPU寄存器是一个容量小,速度快的内存;程序计数器是用来存储CPU正在执行或者即将执行的指令位置。CPU寄存器和程序计数器构成了CPU上下文。CPU上下文切换就是把前一个任务的CPU上下文保存起来,然后加载新任务的上下文到CPU寄存器和程序计数器,最后再跳转到程序计数器所指的新位置,运行新任务。系统内核会保存上下文信息,当此任务再次被分配给CPU运行时,CPU会重新加载该上下文。

进程的上下文切换包括用户空间资源如虚拟内存、栈、全局变量等,以及内核的堆栈、寄存器等内核空间的资源。通常会把交换的信息保存在进程的PCB,当运行另外一个进程的时候,从该进程的PCB取出上下文,然后恢复到CPU中,使得这个进程可以继续执行。如下图所示:

上下文切换包含以下部分:

a)CPU时间被划分为一段段的时间片,这些时间片被轮流分配给各个进程,当某个进程的时间片耗尽后,就会被系统挂起,切换到其它正在等待的进程运行;

b)当进程通过sleep函数主动将自己挂起时,CPU也会重新调度;

c)当有优先级更高的进程运行时,当前低优先级的进程会被挂起,从而先运行高优先级的进程;

d)当发生硬件中断时,CPU的进程会被中断挂起,然后执行内核中的中断服务程序。

2.线程

早期进程为独立运行的基本单位,由于进程之间通信、共享数据、维护等开销较大,特别是进程创建时,分配资源、建立PCB;终止进程时,回收资源,撤销PCB;进程切换时,保存当前进程的状态信息等。所以后面引入了更小且独立运行的基本单位线程。线程是进程中的一条执行流程,具有如下特点:

a)实体之间可以并发运行

b)实体之间可以共享相同的地址空间

c)如果进程中的一个线程崩了,会导致整个进程的线程崩掉;

d)进程是资源分配的基本单位,线程是CPU调度的基本单位,线程只独享寄存器和栈;

e)线程与进程的基本状态相同,同样具有状态之间的转换关系;

f)线程能降低并发执行的时间和空间开销,如线程创建和终止时间快,线程切换快,线程间的数据交换快;

同一个进程内,多个线程之间可以共享代码段、数据段、打开的文件等资源,但每个线程都有独立一套寄存器和栈,这样可以确保线程的控制流是相对独立的。

操作系统的任务调度的对象就是线程,而进程只是给线程提供了虚拟内存、全局变量等资源。当进程只有一个线程时,进程就是线程;当进程包含多个线程时,线程会共享相同的虚拟内存和全局变量资源。线程也有自己独立的数据,比如栈和寄存器等,当上下文切换时需要保存的。

线程上下文切换是发生在同一个进程中的不同线程,切换的是属于线程独立的数据,如寄存器、私有数据等;

线程的实现方式,包含以下三种:

a)用户线程,在用户空间实现的线程,是由用户态的线程库来完成线程管理;每个进程都有线程控制块TCB列表,用来跟踪记录线程状态信息

b)内核线程,在内核中实现的线程,是由操作系统管理,

c)轻量级进程,在内核中来支持用户线程;

内核线程和用户线程存在一定的对应关系,

a) 多个用户线程对应一个内核线程;

b) 一个用户线程对应到一个内核线程;

c) 多个用户线程对应到多个内核线程;

综上,简单总结了部分进程和线程的相关知识。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。