进程和线程在面试中经常被问到,或者在实际开发中经常遇到。那么什么是进程呢?什么是线程?你对他们了解多少?我们常说:1.一个应用程序运行在内存中。每个进程都有自己独立的内存空间,一个进程可以有多个线程。2、进程是资源分配的独立单位,线程是资源调度的独立单位。过程。下图是4个程序创建4个进程,可以并发执行。线。QQ和浏览器是两个进程。浏览器进程中有很多线程,如HTTP请求线程、事件响应线程、渲染线程等,线程的并发执行使得在浏览器中点击一个新链接发起HTTP请求成为可能。浏览器还可以响应来自用户的其他事件。如果你只在这里回答,也许一个大学毕业生可以这样回答,那我们是否需要深入,再深入。例如:1.资源开销。在线程和进程之间切换的资源开销如何?2.内存分配。进程/线程内存分配如何?3.影响程度。进程/线程崩溃会造成什么样的影响?4.在执行过程方面。进程/线程执行是什么样的?5、我们没说进程之间能不能通信?线程之间可以通信吗?他们如何沟通,他们如何沟通?6、什么是进程同步?1.资源开销(1)每个进程都有独立的代码和内存空间,在多个进程之间切换会消耗比较大的资源。进程切换如下图所示:说明:就绪态(ready):等待被调度运行态(running)阻塞态(waiting):等待资源如果接着说进程调度算法,对于例子:先来先服务(FCFS)、短作业优先(SJF)、最短剩余时间优先、时间片轮换、优先级调度、多级反馈队列等。(2)同类型线程共享代码和内存空间,每个线程都有独立的运行栈和程序计数器,多线程切换消耗比较小。2.内存分配(1)进程间的地址空间和资源是相互独立的。(2)同一进程的线程共享进程的地址空间和资源。3.影响程度(1)一个进程一旦崩溃,只有影响该进程的程序崩溃,其他进程不受影响。(2)线程一旦崩溃,会影响到使用该线程的进程。(3)进程比线程更健壮。4.执行过程(1)每个进程都有独立的运行入口、执行顺序和程序出口。提供线程控制,进程可以并发执行。(2)线程不能单独运行,必须在进程内执行。线程可以并发执行。五、进程间通信(1)管道(PIPE)著名的管道:一种半双工通信方式,允许无关进程之间进行通信。优点:可以实现任意关系进程间的通信缺点:长期存在于系统中,使用不当容易出错。缓冲区有限。无名管道:一种半双工通信方式,只能用于具有亲缘关系的进程(父子进程)之间。优点:简单方便。缺点:仅限于单向通信。只能在其进程与其相关进程之间创建。缓冲区有限。(2)信号量(Semaphore):一个计数器,可以用来控制多个线程对共享资源的访问。优点:可以同步进程。缺点:信号量有限。(3)信号(Signal):一种更复杂的通信方式,用于通知接收进程有事件发生。(4)消息队列(MessageQueue):是消息的链表,存储在内核中,由消息队列标识符标识。优点:可以实现任意进程之间的通信,通过系统调用函数实现消息发送和接收的同步,不需要考虑同步问题,方便。缺点:信息的复制需要额外的CPU时间,不适合信息量大或操作频繁的场合。(5)共享内存:映射一段内存,可以被其他进程访问。此共享内存由一个进程创建,但多个进程可以访问它。优点:无需复制,速度快,信息量大。缺点:1.通信是通过直接将共享空间缓冲区附加到进程的虚拟地址空间来实现的,所以进程间读写操作的同步2.使用内存缓冲区直接交换信息,内存的实体存在在一台计算机中,只能由同一计算机系统中的多个进程共享,不利于网络通信。(6)套接字(Socket):可用于不同计算机之间的进程通信。优点:传输数据为字节级,传输数据可定制,数据量小,效率高。数据传输时间短,性能高。适用于客户端和服务器之间的实时信息交互。可加密,数据安全性强。缺点:传输的数据需要分析转换成应用级数据。6.线程间通信(1)锁机制:包括互斥锁/量(mutex)、读写锁(reader-writerlock)、自旋锁(spinlock)、条件变量(condition)。Mutex/Volume(互斥量):提供防止数据结构以独占方式被并发修改的方法。读写锁(reader-writerlock):允许多个线程同时读取共享数据,而写操作是互斥的。自旋锁(spinlock)类似于互斥量,都是为了保护共享资源。mutex是当资源被占用,申请者进入休眠状态;而自旋锁循环检查持有者是否释放了锁。条件变量(condition):一个进程可以被原子地阻塞直到某个条件为真。条件测试是在互斥锁的保护下完成的。条件变量总是与互斥量一起使用。(2)信号量机制(Semaphore)。无名线程信号量有名线程信号量(3)信号机制(Signal):类似于进程间的信号处理。(4)屏障:屏障允许每个线程等待,直到所有协作线程都到达某个点,然后从该点继续执行。7.Comparison/ProsandCons/Selection选择需要频繁创建和销毁的优先级线程。需要大量计算的线程是首选。线程用于强关联处理,进程用于弱关联处理。可以扩展为使用进程进行多机分发,使用线程进行多核分发。当所有要求都满足时,使用你最熟悉、最擅长的方法。
