简述
进程与线程在程序设计中是非常重要的两种机制。在程序设计中如何确定是采用线程还是采用进程来编程是一个值得研究的问题
两种机制的差异
一个程序中的所有线程都在同一个运行空间中执行,而一个程序的子进程则是运行在另外的执行空间。同一个进程中的某个线程的故障可以影响其他线程,因为所有的线程共享同一个虚拟内存空间以及其他资源。创建新的进程需要进行内存的拷贝操作,这就额外增加了系统负担,而线程则不需要这个拷贝过程。线程通常用在某些需要比较好的同步操作的场合。
Q:简述进程与线程的异同点。线程是否具有相同的堆栈?动态链接库(DLL)是否有独立的堆栈?
A:(1)进程只是一些资源的集合。真正的程序执行都是由线程来完成的,程序启动的时候操作系统就创建一个主线程。每个线程都有自己的 堆栈。(2)DLL中有没有独立的堆栈,这个问题不好回答,或者说这个本身就有问题。因为DLL中的代码是被某些线程所执行的,只有线程有用堆栈,如果DLL中的代码是exe中的线程所调用,那么这个时候是不是说这个DLL没有自己独立的堆栈?如果DLL中的代码是有DLL中的代码自己创建的线程所执行,那么是不是说DLL有独立的堆栈?从上讲的堆栈,如果对于堆来说,每个DLL有自己的堆,那么从DLL中动态分分配的内存最好是从DLL中删除。如果从DLL中分配内存,然后再EXE中或者另外一个DLL中删除,很可能导致程序崩溃。
Q:进程和线程有哪些区别?
A:线程是进程内的一个执行单元,也是进程内的可调度实体。线程与进程的区别如下:
(1)可调度性:线程作为调度和分配的基本单位;进程作为拥有资源的基本单位。
(2)并发性:多个进程可以并发执行,同一个进程中的多个线程也可以并发执行。
(3)所拥有的资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源。
(4)系统开销:在创建或撤销进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤销线程时的开销。
Q:在网络编程中设计并发服务器,使用多进程与多线程,并说明其区别。
A:(1)多进程:子进程是父进程的复制品。子进程获得父进程数据空间、堆和栈的复制品。
(2)多线程:相对于进程而言,线程是一个更加接近于执行体的概念,它可以与同一进程的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。
两者都可以提高程序的并发度,他高程序运行效率和响应时间。线程和进程在使用上各有优缺点:线程执行开销小,但不利于资源管理和保护;而进程正相反。同时,线程适合于在SMP机器上运行;而多进程则可以跨机器迁移。
Q:程序什么时候应该使用线程,什么时候单线程效率高?
A:(1)耗时操作使用线程,以提高应用程序响应。
(2)并行操作时使用线程,入C/S架构的服务器端并发线程响应用户的请求。
(3)多CPU系统中,使用线程提高CPU的利用率。
(4)改善程序结构。一个既长且复杂的进程可以考虑分多个线程,成为几个独立或半独立的运行部分,这样的程序会利于理解和修改。其他情况都使用单线程。
Q:Linux是否支持内核级的多线程?
A:线程有两种类型:用户级线程和内核级线程。
用户线程是指不需要内核支持而在用户程序中实现的线程,它不依赖于操作系统核心,应用进程使用线程库提供创建、同步、调度和管理线程的函数来控制用户线程。内核级线程则需要内核的参与,由内核完成线程的调度,它依赖于操作系统核心,由内核的内部需求进行创建和撤销。这两种线程各有其优缺点。用户线程不需要额外的内核开支,并且其实现方式可以被定制或修改以适应特殊应用的需求。但是当一个线程因I/O而处于等待状态时,整个进程就会被调度程序切换为等待状态,其他线程得不到运行的机会;而内核线程没有各个限制,有利于发挥多处理器的并发优势,但却占用了更多的系统开支。Wundows NT 和OS/2支持内核线程,Linux支持内核级地多线程。
Q:在使用线程时如何防止出现大的波峰?
A:意思是如何防止同时产生大量的线程,方法是使用线程池,线程池可以同时提高调度效率和限制资源使用,当线程池中的线程达到最大数时,其他线程就会排队等候。
Q:什么是程序?什么是进程?
A:程序是一个包含可以执行代码的文件,是一个静态的文件。而进程是一个开始执行但还没有结束的程序在内存中的实例化。
Q:进程和线程的最主要区别在于()(多选)
A.进程是UNIX下的概念,线程是Windows下的概念。
B.进程的效率比线程低。
C.在进程中可以创造线程,但线程中不能生成进程。
D.进程有自己的运行空间,线程的运行空间是共享的。
A:选择BCD。线程是程序中最小的执行单位,它相对于进程拥有更高的执行效率。进程可以包含多个线程,并可以对线程进行统一的调度和控制。进程有自己的运行空间,线程的运行空间是共享的。