线程、进程面试题

来源:互联网 发布:计量软件有哪些 编辑:程序博客网 时间:2024/05/22 03:50

1. 线程与进程的差别

进程是应用程序的一个实体;子进程获得父进程数据空间,堆和栈的复制器;
线程是进程内的一个执行单元,也是进程内的可调度实体;
并发性:一个应用程序可以有多个进程并发执行,而一个进程内可以并发执行多个线程;
拥有资源:进程拥有独立的系统资源,而线程不拥有,但线程隶属于进程的资源;多线程不利于资源的管理和保护,使用公共变量/内存时要用同步;
系统开销:进程的创建与撤销都要系统分配与回收资源,因此开销比进程大;线程执行开销小,切换速度快;


2. 如何让应用程序只打开一个进程

利用互斥对象;打开一个互斥对象,如果其句柄为0则说明对象不存在,创建对象并运行进程,如果存在则直接退出;
if OpenMutex(MUTEX_ALL_ACCESS,True,'Mutex')=0 thenbeginCreateMutex(nil,True,'Mutex');Application.Initialize;Application.CreateForm(TForm1, Form1);Application.Run;CloseHandle(OpenMutex(MUTEX_ALL_ACCESS,True,'Mutex'));end; 


3. 网络编程中设计并发服务器,使用多进程与多线程有什么区别?

这个区别就是线程与进程的区别。
速度:线程产生、通信、切换速度快;
资源利用率:线程资源利用率好;
同步问题:当线程间要访问公共资源时,要用到同步;


4. 同步与互斥

互斥是指对于某个资源的访问存在唯一性与排它性,同时只能有一个线程访问他;
同步是指线程间通过相互合作完成任务;如线程A的运行依赖于线程B的运行结果,因此如果B没有运行完,则A要等待;
因此同步可以看成是复杂的互斥


5. 线程/进程的同步机制

同步机制:临界区、互斥对象、事件对象、信号量4种方式;
Critical Section, Mutex, Event, Semaphore之间的区别:
1. Critical Section
通过对多线程的串行化访问公共资源来实现,速度快;每次只能有一个线程访问临界区,只有临界区被释放后才能由其它线程使用;

临界区与互斥量很相似,但互斥量可以命名,因此可以通过名字来打开,同时也可以实现跨越进程使用,实现不同进程间线程的同步;
而临界区只在同一进程内使用,会带来速度与资源占用上的优势;

2. Mutex
采用互斥对象机制,只有拥有互斥对象的线程才能访问公共资源;因为只有一个互斥对象,所以保证只有一个线程访问该资源;互斥对象不仅能在同一应用程序不同的线程间实现资源共享还能用于不同应用程序间实现资源共享;



3. Event
通过通知操作的方式来保持线程的同步,还可以方便实现对多个线程的优先级比较;

4. Semaphore
信号量可以允许多个线程在同一时间访问同一资源,但会限制线程的最大数量;
PV操作: P申请资源,-1, V操作释放资源,+1

互斥量、事件、信号量都可以实现跨越进程来进行同步数据操作;


6. 进程间的通信

进程间的通信是在不同进程间传递与交换数据;进程间的用户空间是相互独立的,不能直接相互访问,只能通过共享内存区;另系统空间是公共的,可以提供通信条件,还有就是都可以访问的外设
进程间的通信有:
管道、系统(消息队列、信号量、共享存储)、SOCKET

管道:有名与无名,无名只能用于父子进程间通信;
消息队列:也是用于同一台机器上的进程间通信,与管道相似;
共享内存:通常由一个进程创建,其它进程对这块内在进行读写;
信号量:本质上是一个计数器,来记录对某个资源(如共享内在)的存取状况。进程获取资源时要测试控制该资源的信号量,>0则可以,信号量-1, <0则不可以,进程等待;当进程退出访问时,+1;


7. 进程/线程间的通信的区别

进程:信号量、共享内存、消息队列(事件)、管道、SOCKET
线程:信号量、消息(事件)、互斥、临界区;

相同的是:信号量、消息(事件)

消息队列:
一个进程中创建消息队列,然后消息队列发往另一个接收进程;消息队列是以文件的形式建立的,如果一个进程向某个消息队列中写了数据后,另一个进程并没有完全取出,即使写数据的进程已经结束,但消息队列中的数据仍在,以后取消息时读的就是上次的数据;










0 0
原创粉丝点击