操作系统面试

操作系统面试day1

今天投递了一家大厂的简历,申请的是嵌入式开发工程师(Linux)的岗位
于是想着把操作系统的知识先复习一下,首先想到操作系统我的第一反应肯定是有关进程和线程的区别。

进程和线程都是操作系统最基本的概念,但是比较抽象,不容易掌握。

  1. 首先计算机的核心肯定是cpu,他承担了所以的计算任务,就像一座工厂,在不停的 工作,运行
  2. 假定工厂的电力有限吧,一次只能给一个车间使用,也就是一个车间工作的时候,其他车间都停止工作,在电脑中也就是cpu一次只能运行一次任务
  3. 进程就好比工厂的车间,任一时刻,cpu总是运行一个进程,切断其他进程
  4. 一个工厂里呢,又会有很多的工人,他们协同工作,完成同一个任务。这时候呢,工人就i是计算机中的线程,协调完成的 任务就是进程
  5. 一个进程可以包含很多的线程
  6. 车间的空间是工人们共享的,比如许多的 房间都i是可以进出的,这象征着进程的 内存空间是可以共享的,每个线程可以使用这些内存共享
  7. 可是呢,虽然一些空间是可以共享的 ,但有些空间是不能共享的,比如厕所,我们假定里面有人上厕所时,其他人就不能进去了,这代表一个线程使用某些共享进程的时候,其他线程得等它使用完毕,才可以使用这块内存
  8. 防止其他人使用这个厕所的一个简单方法,就是在厕所门口加上一把锁,先到的人可以加锁,其他人看见有锁,就会在门口排队,等进去上厕所的人把锁给释放了,才可再进去,这既是“互斥锁”,防止多个线程 同时读写某一块内存区域
  9. 还有些房间,比如厨房,可以容纳很多人 比如n个,当人数大于n的时候,其余人只能在外面等待,好比某些内存区域,只能给固定条目的线程使用
  10. 10.解决方法呢 也很简单,就是在门口挂n把钥匙,进去的人可以取一把钥匙,出来了把钥匙挂回原位,后来的人发现如果钥匙取空了,只能等待。这就是“信号量”做法,保证多个线程不会相互冲突
  11. 因此操作系统的设计可以归结为三点:
    (1)已多进程形式,可以多个任务同时进行
    (2)以多线程形式,单个任务可以运行多个部分进行
    (3)提供协调机制,防止进程之间与线程之间产生冲突,另一方面允许进程与线程之间共享资源。

进程之间的通信方式

  1. 管道(pipe)
    首先我们下来看一条Linux语句

netstart -tulnp | grep 8080

学过Linux的小伙伴一般都知道 | 是指管道的意思,也即是前面命令的输出结果作为后面命令的输入,也即是netstart -tulnp的结果作为grep 8080的输入
如果两个进程进行通信,也可以通过这种管道的方法来通信的,并且 | 是可以没有名字的,也即是匿名管道
当然有匿名管道也意味这有命名管道了,首先可以创建一个命名管道,然后用另一个管道将里面的数据读出来,这个时候如果管道的内容没有被读出,那么会一直停在这里,知道另一个进程讲里面的内容读出来,由此看出,管道的机制类似于缓存,一个进程将数据放在某个缓冲区内部,等待另一个进程去拿出来,并且管道是单向传输的
这个传输方式有什么缺点呢?
显然,它的效率低下,a进程传给b进程,一定要等b进程获取到数据才能返回。使用管道不适合频繁的通信,当然他也有他的优点,那就是真的很简单,能保证我们的数据不被别人拿走,也算是常用。
最后来理解一些他的官方解释:管道可用于具有亲缘关系的父子进程间的通信,有名管道除了具有管道所具有的功能外,它还允许无亲缘关系进程间的通信;
2. 消息队列
消息队列就是对管道通信的改良,消息通信可以将进程的某个数据放在内存后马上让进程返回,无需等待另一个进程接收再返回
例如a进程给b进程发送消息,只需把消息放在相应的消息队列中,就可以了,b在有需要的时候就去取。具有写权限得进程可以按照一定得规则向消息队列中添加新信息;对消息队列有读权限得进程则可以从消息队列中读取信息。
这种方式有什么缺点嘛?答案也是有的,如果a进程发送的数据内存较大,并且通信非常频繁的话,消息队列就不太适合了。因为a消息过大意味着发送和接收消息都需要很长的时间,这种方法也类似于缓存的方法。那么有没有什么方法可以解决呢?
3. 共享内存
它使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据得更新。这种方式需要依靠某种同步操作,如互斥锁和信号量等;
共享内存就很有效的解决了拷贝时间长的问题。那么有人这时候也会问了,不是每个进程都有自己的独立内存吗,两个进程怎么共享访问一块内存呢?
我们都知道,在系统分配进程的时候,并不是分配的实际的物理内存,而是虚拟内存。那么我们让进程各自拿出一块虚拟内存出来,然后映射到相同的物理内存上,就可以完成共享内存的机制啦
4. 信号量—主要作为进程之间及同一种进程的不同线程之间得同步和互斥手段;
共享内存的最大的问题是什么呢?没错,就是 多线程竞争内存 的问题,也即是我们平时所说的线程安全的问题,如何解决呢,那么我们的信号量就派上用途了
信号量的本质是实现进程的互斥与同步。例如信号量的初始值是1,然后进程a来访问内存1的时候,我们把信号量设置为0,这时候进程b也要访问内存1的时候,空间信号量为0,就知道已经有内存来访问内存1了,使用就访问不了内存1了。
5. Socket
这是一种更为一般得进程间通信机制,它可用于网络中不同机器之间的进程间通信,应用非常广泛。

写到这里,时间也很晚了,凌晨夜深了,以前看这些东西的时候,基本都是死记硬背的,效果很不好,等我梳理了他们之间的关系,优缺点,为什么需要这种通信方式,也许对你们也会有帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值