您的位置:首页 > 编程语言 > C语言/C++

多进程多线程总结

2016-05-06 09:59 561 查看
1、进程和线程的区别?

(1)进程是计算机系统进行资源配置和调度的基本单位,线程是计算机系统执行的最小单位

(2)进程是一个独立的运行单位,他可以看做一个程序或一个应用,而线程是进程的一个执行任务

(3)进程可以包含一个或多个线程,同一进程里面的线程共享数据资源,但是各个线程有自己的栈空间,拥有独立的执行序列。

(4)从逻辑的角度看,多线程的意义在于一个应用程序中,有多个止呕性部分可以同时的执行,但是操作系统并没有把多个线程看做是多个独立的应用,来实现进程的调度和分配资源。多进程的话操作系统会看成多个独立应用。

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

2、多线程编程的好处是什么?

(1)在多线程程序中,多个线程并发的执行来提高程序的效率,CPU不会因为某个线程等待资源而进入控线的状态

(2)多线程之间共享资源(堆内存),因此创建一些需要进行资源交互的多个线程比创建进行交互的多个进程要效率高(进程之间因为资源分配的空间不同进行交互时,要有消耗)。

3、线程的状态

状态有5种:运行、阻塞、挂起阻塞、就绪、挂起就绪

状态之间的转换:准备就绪的线程,被CPU调度执行进入运行状态;

                                运行中的线程,进行I/O请求或者得不到请求的资源的时候,编程阻塞状态;

                                运行中的线程,线程执行完毕(或时间片一到),编程就绪状态

                                将阻塞的线程,编程挂起阻塞状态,当导致线程阻塞的I/O操作在用户重启线程前完成(称为唤醒),挂起的阻塞状态变成挂起的就绪状态,当用户I/O操作结 

                                束之前重启贤臣,挂起阻塞变成阻塞状态

                                将就绪(或运行)中的进程挂起,变成挂起就绪态,当该进程恢复之后,挂起就绪态变成就绪态;   

          

4、C++中多线程的实现

CreateThread,linux下则常用pthread库,这些都是最底层的实现,最新的C++11标准里增加了std::thread多线程库,使用第三方库的话就更多了,比如boost的thread等等,不推荐使用vc自家的_beginthread,尤其有跨平台需求的时候。

5、多线程同步和互斥有那些实现的方法,都是什么?

线程间的同步分为两种:用户模式和核模式。内核模式就是指系统内核对象的单一性来进行同步,使用时需要切换内核态与用户态。而用户模式就不需要切换到内核态,只在用户态完成操作。用户模式下的方法:原资材做(例如一个单一的全局变量),临界区。内核模式下方法有:事件,信号量,互斥量。

5、多线程同步和互斥有何异同,在什么情况下分别使用它们?举例说明。

所谓同步,是指散步在不同进程之间的若干程序片断,它们的运行必须严格按照规定的某种先后次序来运行,这种先后次序依赖于要完成的特定的任务。如果用对资源的访问来定义的话,同步是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源。

所谓互斥,是指散布在不同进程之间的若干程序片断,当某个进程运行其中一个程序片段时,其它进程就不能运行它们之中的任一程序片段,只能等到该进程运行完这个程序片段后才可以运行。如果用对资源的访问来定义的话,互斥某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。
6、进程间通信方式

(1)管道(pipe)及有名管道(namepipe):管道可用于亲缘关系的父子进程间的通信。有名管道除了具有管道的功能外,它还允许无亲缘关系的进程进行通信。

(2)信号(signal):信号是在软件层次上对中断机制的一种模拟,它是比较复杂的通信方式,用于通知进程有某个时间发生,一个进程收到一个信号与处理器收到一个中断请求效果上可以说是一致的。

(3)信息队列(message queue)消息队列是消息的链接表,它克服了上两种通信方式中信号量有限的缺点,具有写权限得进程可以按照一定得规则向消息队列中添加新信息;对消息队列有读权限得进程则可以从消息队列中读取信息。

(4)共享内存(shared memory):可以说这是最有用的进程间通信方式。它使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据得更新。这种方式需要依靠某种同步操作,如互斥锁和信号量等。

(5)信号量(semaphore):主要作为进程之间及同一种进程的不同线程之间得同步和互斥手段。

(6)套接字(socket):这是一种更为一般得进程间通信机制,它可用于网络中不同机器之间的进程间通信,应用非常广泛。

    推荐一个博客,写进程线程的文章很全:http://blog.csdn.net/morewindows/article/details/7392749

注释:本文大部分转自该文章所以标注为转载 http://blog.csdn.net/jjj19891128/article/details/24393661
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ 操作系统 线程