1.进程和线程
进程
进程是具有一定功能的程序关于某一个数据集合上的一次运行活动,进程是系统进行资源调度和分配的一个独立单位。
线程
线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。
进程和线程的区别与联系
线程与进程的联系
(1)一个进程可以有多个线程,但至少拥有一个线程,一个线程只能属于一个进程,线程是CPU执行和调度的最小单位。
(2)进程将自身拥有的资源分配给线程,同一进程的所有线程共享该进程的资源,共享代码段(代码和常量)、数据段(全局变量和静态变量)、扩展段(堆存储),但每一个线程又有自己的栈段(运行时段)用来存储临时变量和局部变量。
(3)进程的CPU资源分配给线程,真正在CPU上运行的是线程。
(4)线程在执行中需要协助同步,而不同进程中的线程需要消息通信的方法进行同步。
线程与进程的区别
(1)进程有自己独立的地址空间,线程没有。
(2)进程是系统资源分配的最小单位,线程是CPU调度执行的最小单位。
(3)进程和线程的通信方式不同。
(4)进程上下文切换开销大,线程开销小。
(5)一个进程挂掉了不会影响其他进程的运行,而一个线程挂掉了会影响进程中其它线程的执行。
(6)对进程进行相关操作开销较大,线程开销较小。
2.进程的常见状态和转换
进程最常见的三种状态为:阻塞状态、就绪状态、运行状态。
三种状态之间的转换如下图:
阻塞状态:进程等待某种条件,在条件出现之前无法执行。
就绪状态:进程已经获得除CPU以外的所有运行资源,等待CPU资源分配。
运行状态:进程在CPU上运行,此状态的进程数小于CPU数。
3.进程同步
进程同步主要是为了让多个进程在执行次序上进行协调,使并发执行的进程能有效的进行资源共享与合作,从而使程序的执行具有可再现性。
进程同步机制遵循的原则:
(1)忙则等待(保证对临界区互斥访问)。
(2)空闲让进。
(3)有限等待(避免饥饿现象)。
(4)让权等待(进程无法进入自己的临界区时应该让出CPU处理资源,以免陷入忙等状态)。
4.线程同步
实现线程同步的三种常用方法:互斥量、信号量、事件。
(1)互斥量:采用互斥对象机制,只有获得互斥量的线程才能访问临界资源,因为互斥对象只有一个,所有可以防止多个线程同时访问临界资源。
(2)信号量:允许多个线程同时访问公共资源,但是需要限制同时访问公共资源的最大线程数。
(3)事件:通过通知操作来保持多线程的同步,还可以方便的实现多线程的优先级比较。
5.进程的通信方式
进程的通信方式有管道、系统IPC(消息队列、共享存储,信号量),socket。
管道又分为:普通管道、流管道、命名管道。
- 管道是一种半双工通信方式,数据只能单向流动,而且数据只能在具有亲缘关系的进程间流动,通常在父子进程之间流动。
- 命令管道也是一种半双工通信方式,但是它允许非亲缘关系进程通过管道进行通信。
- 信号量相当于计数器,用于同时访问公共资源的进程数。
- 消息队列是消息链表,存放在内核中由消息队列标识符标识。
- 信号是一种比较复杂的通信方式,用于通知某一个进程事件发生。
- 共享存储是映射一段能被其它进程访问的内存空间,这段空间由一个进程创建,但是多个进程可以访问。
6.死锁
在两个或多个并发进程中,如果每一个进程持有某种资源而又等待其它进程释放它或他们现在保持着的资源,在未改变这种状态之前不能向前推进,称这一组进程产生了死锁。通俗来说就是两个或多个进程无限期的阻塞并互相等待的一种状态。
死锁产生的四个必要条件(只要破坏一个就可以避免死锁的产生)
1.互斥资源条件,一个资源一次只能被一个进程使用。
2.请求与保持条件,一个进程因请求资源被阻塞时,对已持有的资源保持不放。
3.不剥夺条件,进程已持有的资源在未完全使用之前不能强行剥夺。
4.循环等待条件,若干进程之间形成一种首尾相接的环形等待资源关系。
7.小结
内容编写参考于这两篇博客:
https://www.cnblogs.com/inception6-lxc/p/9073983.html
https://blog.csdn.net/gui951753/article/details/79489748
以上是一些操作系统中的常见概念和知识重点,在很多面试或考试中经常出现。虽然曾经学过但是有些概念记得不是很清楚,现在重新回顾一遍受益匪浅,在这里总结出来供大家学习参考,如有不对的地方请大神指正。