进程,线程,互斥锁及信号量

了解过操作系统的大概都听说过进程和线程的概念,那到底什么是进程,什么是线程,它们之间又有什么关系呢?
简单来说,进程是资源分配的最小单位,线程是调度运行的最小单位。一个进程可以包含一个或多个线程,这些线程共享所属进程的资源(内存,CPU等)。
互斥锁:
可以把进程想象成一套房子,房子里的空间类似进程的内存空间,房间里的设施类似进程的CPU处理资源。而线程就像是居住在这个房子里的人们,房子里可能住着一个人或多个人,当房子里住有多个人时,这些人共享房子的空间及设施(浴室,厨房等)。那么问题来了,房子里的资源是有限的,如果有多个人想使用同一个资源,比如只有一间浴室,有两个人在同一时间都想洗澡怎么办?我们一般会让更紧急的那个人先洗,一个人在一个小时之后要去赶飞机,而另一个人没有什么紧急的事情,这种情况就是要赶飞机的人优先级更高。那如果两个人都有紧急的事呢?这个时候一般是让先准备好浴巾和换洗衣服的人去洗(换句话说就是等待最长时间的人)。
回到线程之间的资源竞争情况是怎样的呢?看起来和人们竞争房子里资源的情况颇为相似。我们知道,一个特定时间只能有一个线程占用CPU(多核CPU可以同时执行多个线程,但每个核在特定的时间只能运行一个线程), 线程之间怎么去竞争有限的资源呢?一般情况下有两个原则:
1. 优先级更高的线程先执行
2. 优先级相同的线程,让等待更久的那个
线程先执行
让我们再回到房子里,一个人在浴室洗澡时如何确保不会被另外一个人打断?很简单,在浴室里的人可以把门反锁,只有当他洗完澡打开门锁,另外一个人才能进入浴室。总之浴室的状态有且只有两种,里面没人并且没有上锁;里面有人并且门被上锁。想进入浴室的人必须先确认门锁的状态,当没有上锁的时候才能进入。同样的对于线程来说也是一样,如果某个资源我们不希望被两个或多个线程同时使用(比如两个线程会执行相同的代码段),我们就可以使用互斥锁(Mutex)。当某个线程需要访问该资源时需要先获取锁并把Mutex上锁,等访问完毕再释放Mutex。这样当其他线程想访问该共享资源时需要先获取锁的状态,如果Mutex是上锁的状态,它就需要等Mutex释放后才能获取锁然后访问该资源。
信号量:
让我们考虑另外一种资源,这种资源同一时间可以被多个人使用。比如厨房,假设厨房内同时可以容纳三个人。我们该怎么管理厨房的使用呢?我们可以给厨房配备三把钥匙,并且把三把钥匙挂在厨房门外。当有人要进入厨房时就取下一把钥匙进入厨房,然后把厨房门上锁,出来的时候再把钥匙重新挂到门外。这样以来当有人想进入厨房时需要先看一下门外是否还有钥匙,有的话就可以取下一把钥匙并进入厨房,否则就只能在门外等待直到有人从厨房里出来。如果有多人在门外等待的话,就要看这些人对使用厨房的紧急度以及等待时间的长短。
明眼的同学应该已经看出来了,这种机制在操作系统里称为信号量(或信号灯)。当某个资源可以同时被多个线程访问时我们就可以使用信号量,当一个线程想要访问该资源时需要先看一下信号量的值是否大于0,如果大于0就把信号量的值减1(P操作),然后就可以访问该资源,等访问完后再把信号量的值加1(V操作)。如果当前信号量的值为0,想要访问共享资源的线程只能等待其他线程访问完毕后(执行V操作后)才能访问。
以上就是对进程,线程以及互斥锁和信号量的简单介绍,希望可以帮助大家更好地理解相关概念。
欢迎关注微信公众号“汽车软件后花园”获取更多汽车软件技术知识,以及AUTOSAR等学习资料。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值