进程和线程的区别

此问题也是面试中的一大俗题,可以发散引申出很多。下面记录几点关键点。

1.进程是操作系统资源分配的最小单位,线程是CPU调度的最小单位(后半句是因为多线程的OS中,进程不是一个可执行的实体)。

2.线程是依附于进程,比进程的创建销毁切换都更省资源,所以多线程的程序有更好的并发。

这里有可能被追着问到线程和进程都包括哪些信息

2.1 进程的PCB(进程控制块)

包括进程ID,内存指针,寄存器,状态,优先级,程序计数器,IO状态信息。

  这里可能会被问到具体的进程状态,一共五种。新建,就绪,执行,阻塞,退出。

2.1.1.进程的三种基本状态:就绪状态,执行状态,阻塞状态。

2.1.2.进程三种状态间的转换

 (1) 就绪→执行 当前运行进程阻塞,调度程序选一个优先权最高的进程占有处理机;

 (2) 执行→就绪 当前运行进程时间片用完;

 (3) 执行→阻塞 当前运行进程等待键盘输入,进入了睡眠状态。

 (4) 阻塞→就绪 I/O操作完成,被中断处理程序唤醒。

2.2 线程信息包括堆栈,局部变量,程序计数器

2.2.1 线程状态:以JAVA线程的状态为例,将阻塞状态进行了扩展,包括:阻塞等待(线程执行了wait()),同步阻塞(线程尝试进入synchronized方法内受保护的区域,但是没有获得同步锁)

   

3.进程间的crash不会相互影响,但是一个线程的crash会使整个进程都crash,其他线程也跟着都挂了。

4.线程间的通信是通过进程中共享的全局变量,不需要通过系统调用就可以通信,更加高效。

4.1 这里八成会被引申出进程间通信的方式

管道消息队列共享内存信号量,套接字 如果再往下具体,就看具体链接吧。不过再往后面就太发散了。

4.2 线程间的同步于互斥(也勉强算是线程间的一种通信吧)---同步:线程间按顺序执行,同步肯定是基于互斥的,是一种更复杂的互斥;互斥:一个线程执行的时候,其他线程要等待。

4.2.1 临界区,只有一个线程可以执行的代码块。用于互斥操作。在JAVA中就是synchronized(object){//code}一段代码块。

4.2.2 互斥量,一个二元信号,只有拿到锁和释放锁两种状态。也只用于互斥操作。类似于JAVA中的LOCK对象,他可以实现临界区的所有功能,比临界区更加灵活,可以自己定义什么时候释放锁。

4.2.3 信号量,一个资源计数器,取资源的时候,如果没有了就需要等待。JAVA中有Semaphore对象,初始化资源数量后,有acquire和release方法。

4.2.4. 事件,用来通知线程有一些事件已发生,从而启动后继任务的开始。好像没怎么听过=。=

原文地址:https://www.cnblogs.com/23lalala/p/3576752.html