多线程

(1)windows下的C++多线程:C++本身并没有提供多线程编程功能的接口或者库,但windows系统下的c++多线程编程还是可以通过<windows.h>库中的相关多线程接口实现。

7.多线程的优点?

(1)多线程技术使程序的响应速度更快,因为用户界面可以在进行其他工作的同时一直处于活动状态;

(2)占用大量处理时间的任务使用多线程可以提高CPU利用率,即占用大量处理时间的任务可以定期将处理处理器时间让给其他任务

(3)多线程可以分别设置优先级以优化性能。

8.多线程的缺点?

(1)等候使用共享资源时造成程序的运行速度变慢。这些共享资源主要是独占性的资源,如打印机。

(2)对线程进行管理要求额外的cpu开销,线程的使用会给系统带来上下文切换的额外空间

(3)线程的死锁,即对共享资源加锁实现同步的过程中可能会死锁;

(4)对公有变量的同时读和写,可能会造成脏读

9.什么是进程 什么是线程

进程:运行着的程序,是系统进行资源分配和调度的基本单位,是操作系统的基础。

线程:有时候被称为轻量级进程,是程序执行流的最小单元;线程是进程中的一个实体,是被系统独立调度和分配的基本单位;线程不拥有系统资源,只拥有在运行中一种必不可少的资源,但他可与同属一个进程的其他线程共享进程所拥有的资源。

10.进程和线程的区别?

(1)调度:在传统的操作系统中,拥有资源和独立调度的基本单位是进程,在引入线程后,线程是独立调度的基本单位,进程是拥有资源的基本单位;

在同一进程中,线程的切换不会引起进程的切换;在不同进程中进行线程的切换,则会引起进程的切换

(2)拥有资源:进程是拥有资源的基本单位;线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可以与同属于一个进程的其他线程共享进程所拥有的资源

(3)并发性:在引入线程的操作系统中,不仅进程可以并发进行,统一进程内的多个线程也可以并发进行,从而使操作系统可以更好的并发性,大大提高了系统的吞吐量。

(4)系统开销:创建和撤销进程时,系统都要为之分配或者回收资源,因此操作系统所付出的开销远大于创建和销毁线程的开销。

在进行进程切换时,涉及当前的cpu环境的保存以及新调度的进程cpu环境的设置;而线程切换时只需保存少量的寄存器内容,因此开销很小;

由于同一进程中内多个线程共享进程的地址空间,因此这些线程之间二点同步和通信比较容易实现,其他无需操作系统的干预。

(5)地址空间和其他资源(打开文件):进程的地址空间相互独立同一进程的各线程之间共享进程的资源某进程内的线程对于其他进程不可见;

(6)通信方面:进程间的通信需要借助操作系统,而线程间可以直接读/写进程数据段(如全局变量)来进行通信。

11.什么时候使用进程,什么时候使用线程?

(1)需要频繁创建和销毁的时候优先使用线程;因为对于进程来说,创建和销毁一个进程的代价很大。

(2)线程的切换速度快,所以在需要大量计算,切换频繁时用线程,还有耗时的操作使用线程可以提高应用程序的响应

(3)因为对cpu系统的效率使用上线程更占优,所以可能要发展到多机分布的用进程,多核分布用线程

(4)并行操作时使用线程,如c/s架构的服务器端并发线程响应用户的请求

(5)需要更稳定安全时,适合选择进程;需要速度时,选择线程更好。

13.进程和线程之间的通信方式

(1)进程间的通信方式

管道及有名管道:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用;有名管道克服了管道没有名字的限制,因此除具有管道的功能外,它还允许无亲缘关系进程间的通信。

信号量:信号量是一个计数器,可以用来控制多个进程对共享资源的访问;它常作为一种锁机制,防止某位进程正在访问共享资源时,其他进程也访问该资源。因此主要作为进程间以及统一进程内不同线程之间的同步手段。

消息队列:消息队列时消息的链表,存放在内核中并由消息队列标识符标识;消息对列克服了信号传递信息少,管道只能承载无格式字节流以及缓冲区大小受限等缺点

共享内存:使多个进程可以访问统一内存空间,是最快的IPC形式。是针对其他进程间通信方式运行效率低而专门设计的。他往往与其他通信机制,如信号量配合使用,来实现进程间的同步和通信。

信号量:主要作为进程间以及同一进程不同线程之间的同步手段。

套接口:更为一般的进程间的通信机制,可以用于不同机器之间的进程间通信。

(2)线程间的通信:(线程间同步方式)

  • Linux:互斥体、信号量、条件变量

a)   互斥锁和读写锁:提供对临界资源的保护,当多线程试图访问临界资源时,都必须通过获取锁的方式来访问临界资源。(题外话:①当读写线程获取锁的频率差别不大时,一般采用互斥锁;②如果读线程访问临界资源的频率大于写线程,采用读写锁较为合适。③读写锁允许多个读线程同时访问临界资源,读写线程必须互斥访问临界资源。读写锁的实现采用了互斥锁,所以在读写次数差不多的情况下采用读写锁性能没有直接采用互斥锁来的高。)

b)   信号量:提供对临界资源的安全分配。如果存在多份临界资源,在多个线程争抢临界资源的情况下,向线程提供安全分配临界资源的方法。如果临界资源的数量为1,将退化为锁。

c)   条件变量:提供线程之间的一种通知机制,当某一条件满足时,线程A可以通知阻塞在条件变量上的线程B,B所期望的条件已经满足,可以解除在条件变量上的阻塞操作,继续做其他事情。

  • Windows:临界区、互斥量、信号量、事件

a)   临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。在任意时刻只允许一个线程对共享资源进行访问,如果有多个线程试图访问公共资源,那么在有一个线程进入后,其他试图访问公共资源的线程将被挂起,并一直等到进入临界区的线程离开,临界区在被释放后,其他线程才可以抢占。

b)   互斥量:采用互斥对象机制。 只有拥有互斥对象的线程才有访问公共资源的权限,因为互斥对象只有一个,所以能保证公共资源不会同时被多个线程访问。互斥不仅能实现同一应用程序的公共资源安全共享,还能实现不同应用程序的公共资源安全共享

c)   信号量:它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目

d)   事 件: 通过通知操作的方式来保持线程的同步,还可以方便实现对多个线程的优先级比较的操作

  1. 临界区和互斥量的区别:

答:(1)临界区只能用来同步本进程内的线程,而不可用来同步多个进程内的线程;互斥量、事件和信号量都可以跨越进程来进行同步数据操作。(2)临界区是非内核对象,只在用户态进行锁操作,速度快;互斥体是内核对象,在核心态进行锁操作,速度慢。(3)临界区和互斥体在Windows平台都可用,Linux下只有互斥体可用。

  1. 进程和程序的区别?

答:(1)①进程是程序及其数据在计算机上的一次运行活动,是一个动态的概念。②程序是一组有序的指令集合,是一种静态的概念。(2)①进程是程序的一次执行过程,它是动态的创建和消亡的,具有一定的生命周期,是暂时存在的;②程序是一组代码的集合,它是永久存在的,可以长期保存。(3)一个进程可以执行一个或几个程序,一个程序也可以构成多个进程。进程可以创建进程,而程序不可能形成新的程序。(4)进程和程序的组成不同:进程由程序、数据和进程控制块(PCB)三部分组成;程序是一组有序的指令集合。

  1. 线程有那几种状态?

答:和进程的状态基本一样。

  1. 进程有哪几种状态?

答:(1)创建:进程正在被创建,尚未转到就绪状态;

(2)就绪状态:进程已处于准备运行的状态,即进程获得了除处理器之外的一切所需资源,一旦得到处理器即可运行。

(3)运行状态:进程正在处理器上运行。在单处理器环境下,每一时刻最多只有一个进程处于运行状态。

(4)阻塞状态:进程正在等待某一事件而暂停运行,如等待某资源为可用(不包括处理器)或等待输入/输出完成。即使处理器空闲,该进程也不能运行。

(5)结束状态:进程正从系统中消失,可能是进程正常结束或其他原因中断退出运行。

  1. 线程同步和线程互斥

答:(1)同步:是指散步在不同任务之间的若干程序片断,它们的运行必须严格按照规定的某种先后次序来运行,这种先后次序依赖于要完成的特定的任务。最基本的场景就是:两个或两个以上的进程或线程在运行过程中协同步调,按预定的先后次序运行。比如 A 任务的运行依赖于 B 任务产生的数据。

(2)互斥:是指散步在不同任务之间的若干程序片断,当某个任务运行其中一个程序片段时,其它任务就不能运行它们之中的任一程序片段,只能等到该任务运行完这个程序片段后才可以运行。最基本的场景就是:一个公共资源同一时刻只能被一个进程或线程使用,多个进程或线程不能同时使用公共资源。

(3)区别与联系:

a)   同步是一种更为复杂的互斥,而互斥是一种特殊的同步。也就是说互斥是两个任务之间不可以同时运行,他们会相互排斥,必须等待一个线程运行完毕,另一个才能运行,而同步也是不能同时运行,但他是必须要安照某种次序来运行相应的线程(也是一种互斥)!;

b)   互斥具有唯一性和排它性,但互斥并不限制任务的运行顺序,即任务是无序的,而同步的任务之间则有顺序关系。

  1. 进程通信与同步的目的?

答:(1)数据传输:一个进程需要将她的数据发送给另一个进程

(2)共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应立即看到。

(3)通知事件:一个进程需要向另一个或者一组进程发送消息,通知它(他们)发生了某种事件(如进程终止时要通知父进程)。

(4)资源共享:多个进程之间共享同样的资源。为了实现这一点,需要内核提供锁和同步机制。

(5)进程控制:有一些进程希望完全控制另一个进程的执行(如DEBUG进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道他的状态的改变。

  1. 线程拥有什么个性才能实现并发性?

答:(1)线程ID:ID在本进程中是唯一的,进程用此来标识线程。

(2)寄存器组的值:由于线程间是并发运行的,每个线程有自己不同的运行线索,当从一个线程切换到另一个线程上时,必须将原有的线程的寄存器集合的状态进行保存,以便将来该线程在被重新切换时得以恢复。

(3)线程的堆栈:堆栈是保证线程独立运行所必需的。线程函数可以调用函数,而被调用的函数中又是可以层层嵌套的,所以线程必须拥有自己的函数堆栈,使得函数调用可以正常执行,不受其他线程的影响。在一个进程的线程共享堆区。

(4)错误返回码;(5)线程的信号屏蔽码(6)线程的优先级

  1. 死锁

答:(1)概念:多个进程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进。

(2)原因:①系统资源的竞争 ②进程推进顺序非法

(3)必要条件:

a)   互斥条件:进程要求对所分配的资源进行排他性控制,即在一段时间内某资源仅为一个进程所占有。此时若有其他进程请求该资源,则请求进程只能等待。

b)   不剥夺条件:进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,即只能由获得该资源的进程自己来释放。

c)   请求和保持条件:又称为部分分配条件。进程每次申请他所需要的一部分资源,在等待新资源的同时,进程继续占有已分配到的资源。

d)   循环等待条件:存在一种进程资源的循环等待链,链中每个进程已获得的资源同时被链中下一个进程所请求。即存在一个处于等待状态的进程集合{P1,P2,P3…,PN},其中Pi等待的资源被Pi+1(i=0,1…,n-1)占有,Pn等待资源被P0占有。

(4)死锁处理策略:

a)   预防死锁:设置某些限制条件,破坏产生死锁的四个必要条件中的一个或几个。

b)   避免死锁:在资源的动态分配过程中,用某种方法防止系统进入不安全状态。银行家算法是著名的避免死锁算法。

c)   死锁的检测及解除:无需采取任何限制性措施,允许进程在运行过程中发生死锁,通过系统的检测机制及时的检测出死锁的发生,然后采取某种措施解除死锁。死锁的检测可利用资源分配图来描述

解除主要方法:资源剥夺法、撤销进程法、进程回退法。

  1. 调度算法?

答:(1)基本准则:1 CPU利用率

2    系统吞吐量:单位时间内CPU完成作业的数量

3    周转时间:作业完成时刻减去作业到达时刻

4    等待时间:进程处于等处理器状态之间的时间之和,等待时间越长,用户满意度越低

5    响应时间:从用户提交请求到系统首次产生响应所用的时间。

(2)包括:先来先服务算法(FCFS)、短作业优先算法(SJF)、优先级调度算法、高响应比优先调度算法、时间片轮转算法、多级反馈队列调度算法。其中SJF的平均等待时间,平均周转时间最少。

10.僵尸进程和孤儿进程

答:(1)孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。

(2)僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵死进程

11.僵尸进程和孤儿进程的危害?

答:(1)孤儿进程:每当出现一个孤儿进程的时候,内核就会把孤儿进程的父进程设置为init,而Init进程会循环的wait()他的已经退出的子进程。因而孤儿进程并不会有什么危害。

(2)僵尸进程:unix提供了一种机制可以保证只要父进程想知道子进程结束时的状态信息, 就可以得到。这种机制就是: 在每个进程退出的时候,内核释放该进程所有的资源,包括打开的文件,占用的内存等。 但是仍然为其保留一定的信息(包括进程号the process ID,退出状态the termination status of the process,运行时间the amount of CPU time taken by the process等)。直到父进程通过wait / waitpid来取时才释放。 但这样就导致了问题,如果进程不调用wait / waitpid的话, 那么保留的那段信息就不会释放,其进程号就会一直被占用,但是系统所能使用的进程号是有限的,如果大量的产生僵死进程,将因为没有可用的进程号而导致系统不能产生新的进程. 此即为僵尸进程的危害,应当避免。

  1. 什么是协程?协程的优缺点?

答:(1)①协程是一种用户态的轻量级线程;②协程拥有自己的寄存器上下文和栈;协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈。因此:协程能保留上一次调用时的状态,每次过程重入时,就相当于进入上一次调用的状态;③线程是抢占式,而协程是协作式。

(2)优点:跨平台;跨体系架构;无需线程上下文切换的开销;无需原子操作锁定及同步的开销;方便切换控制流并简化编程模型;高并发+高扩展性+低成本:一个CPU支持上万的协程都不是问题。所以很适合用于高并发处理。

(3)缺点:①无法利用多核资源:协程的本质是个单线程,它不能同时将单 个CPU 的多个核用上,协程需要和进程配合才能运行在多CPU;②进行阻塞(Blocking)操作(如IO时)会阻塞掉整个程序:这一点和事件驱动一样,可以使用异步IO操作来解决。

主动一点,世界会更大!
原文地址:https://www.cnblogs.com/sweet-li/p/13556703.html