【亡羊补牢】操作系统灵魂之问 第1期 进程和线程的几个问题,你都明白了吗

引言

通过对面试复盘以及最近自己的心态变化,我觉得还是得一步一步来。最近看到这么一段话:

当你想要开车去周游世界时,并不需要给自己的车装满足够跑完整个世界的油量,而只需要加满第一箱油就可以了,路上有那么多加油站,你随时都可以加油,路上有那么多的人,你也不用所有的事都只靠自己,想要一箱油就跑完整个世界的人遍地都是,但他们可能永远都不会出发,只有那些真正经历过的风景,才会让人真正变得丰富起来,哪怕看风景时的你狼狈不堪。

看完体会是我不应该急着让自己走的更快,而是应该走的更远。而最后的收获,都是需要脚踏实地耕耘的,因此,我会出产一套【亡羊补牢】系列博客。将知识理解透彻,也不掺杂其它东西了,认认真真地写好这一套专栏。觉得不错的小伙伴,可以持续关注哈~

问题引入

这次,就开门见山了,直接先列出几个问题,小伙伴们可以根据自己的知识程度,选择性阅读,同时,也可以检查一下自己某些知识点是否扎实。

  • 操作系统的有哪几个特性?
  • 操作系统的主要功能
  • 进程和线程有什么区别?
  • 谈谈linux文件系统?
  • 进程间有几种通信方式?
  • 什么是死锁?死锁产生的条件?

以上问题都是比较常见的一些问题了,还有一些后续了解了继续整理。

探讨问题

操作系统的有哪几个特性?

  • 并发:同一段时间内多个程序执行(注意区别并行和并发,前者是同一时刻的多个事件,后者是同一时间段内的多个事件)
  • 共享:系统中的资源可以被内存中多个并发执行的进线程共同使用
  • 虚拟:通过时分复用(如多道程序技术,分时系统)以及空分复用(如虚拟内存)技术实现把一个物理实体虚拟为多个
  • 异步:系统中的进程是以走走停停的方式执行的,且以一种不可预知的速度推进

操作系统的主要功能

  • 处理机管理:处理机分配都是以进程为单位,所以处理机管理也被看做是进程管理。包括进程控制,进程同步,进程通信和调度(作业调度和进程调度)
  • 存储器管理(或者内存管理):内存分配,内存保护,地址映射,内存扩充
  • 设备管理:管理所有外围设备,包括完成用户的IO请求;为用户进程分配IO设备;提高IO设备利用率;提高IO速度;方便IO的使用
  • 文件管理:管理用户文件和系统文件,方便使用同时保证安全性。包括:文件存储空间管理,目录管理,文件读写管理以及文件共享和保护
  • 提供用户接口:程序接口(如API)和用户接口(如GUI)

进程和线程有什么区别?

  • 进程是对运行时程序的封装,是系统进行资源调度和分配的的基本单位,实现了操作系统的并发;
  • 线程是进程的子任务,是CPU调度和分派的基本单位,用于保证程序的 实时性,实现进程内部的并发;
  • 一个程序至少有一个进程,一个进程至少有一个线程,线程依赖于进程而存在;
    进程在执行过程中拥有独立的内存单元,而多个线程共享进程的内存。

谈谈linux文件系统?

普通文件(-)

从Linux的角度来说,类似mp4、pdf、html这样应用层面上的文件类型都属于普通文件
Linux用户可以根据访问权限对普通文件进行查看、更改和删除

目录文件(d,directory file)

目录文件对于用惯Windows的用户来说不太容易理解,目录也是文件的一种目录文件包含了各自目录下的文件名和指向这些文件的指针,打开目录事实上就是打开目录文件,只要有访问权限,你就可以随意访问这些目录下的文件(普通文件的执行权限就是目录文件的访问权限),但是只有内核的进程能够修改它们虽然不能修改,但是我们能够通过vim去查看目录文件的内容

符号链接(l,symbolic link)

这种类型的文件类似Windows中的快捷方式,是指向另一个文件的间接指针,也就是我们常说的软链接

块设备文件(b,block)和字符设备文件(c,char)

这些文件一般隐藏在/dev目录下,在进行设备读取和外设交互时会被使用到
比如磁盘光驱就是块设备文件,串口设备则属于字符设备文件
系统中的所有设备要么是块设备文件,要么是字符设备文件,无一例外

FIFO(p,pipe)

管道文件主要用于进程间通讯。比如使用mkfifo命令可以创建一个FIFO文件,启用一个进程A从FIFO文件里读数据,启动进程B往FIFO里写数据,先进先出,随写随读。

套接字(s,socket)

用于进程间的网络通信,也可以用于本机之间的非网络通信
这些文件一般隐藏在/var/run目录下,证明着相关进程的存在

进程间有几种通信方式?

  • 管道(pipe)及命名管道(named pipe):管道可用于具有亲缘关系的父子进程间的通信,有名管道除了具有管道所具有的功能外,它还允许无亲缘关系进程间的通信;
  • 信号(signal):信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生;
  • 消息队列:消息队列是消息的链接表,它克服了上两种通信方式中信号量有限的缺点,具有写权限得进程可以按照一定得规则向消息队列中添加新信息;对消息队列有读权限的进程则可以从消息队列中读取信息;
  • 共享内存:可以说这是最有用的进程间通信方式。它使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据得更新。这种方式需要依靠某种同步操作,如互斥锁和信号量等;
  • 信号量:主要作为进程之间及同一种进程的不同线程之间得同步和互斥手段;
  • 套接字:这是一种更为一般得进程间通信机制,它可用于网络中不同机器之间的进程间通信,应用非常广泛。

什么是死锁?死锁产生的条件?

死锁的概念

在两个或者多个并发进程中,如果每个进程持有某种资源而又等待其它进程释放它或它们现在保持着的资源,在未改变这种状态之前都不能向前推进,称这一组进程产生了死锁。通俗的讲,就是两个或多个进程无限期的阻塞、相互等待的一种状态。

死锁产生的四个必要条件

  • 互斥:至少有一个资源必须属于非共享模式,即一次只能被一个进程使用;若其他申请使用该资源,那么申请进程必须等到该资源被释放为止;
  • 占有并等待:一个进程必须占有至少一个资源,并等待另一个资源,而该资源为其他进程所占有;
  • 非抢占:进程不能被抢占,即资源只能被进程在完成任务后自愿释放
  • 循环等待:若干进程之间形成一种头尾相接的环形等待资源关系

死锁的处理基本策略和常用方法

解决死锁的基本方法主要有 预防死锁、避免死锁、检测死锁、解除死锁 、鸵鸟策略 等

本文参考

Linux文件系统详解

最后

文章产出不易,还望各位小伙伴们支持一波!

往期精选:

小狮子前端の笔记仓库

其次,为方便大家更好阅读仓库笔记,搭建了个人网站(访问超逸の博客),方便小伙伴阅读玩耍~

学如逆水行舟,不进则退

猜你喜欢

转载自blog.csdn.net/weixin_42429718/article/details/108399783