面试集锦(七)操作系统

操作系统

https://blog.csdn.net/justloveyou_/article/details/78304294

1. 进程、线程

1.1 进程

进程是具有一定功能的程序关于某个数据集合上的一次运行活动,是系统进行资源调度和分配的一个独立单位,实现了操作系统的并发。

保存在硬盘上的程序运行以后,会在内存空间里形成一个独立的内存体,这个内存体有自己独立的地址空间,有自己的堆,上级挂靠单位是操作系统。操作系统会以进程为单位,分配系统资源(CPU时间片、内存等资源),进程是资源分配的最小单位。


什么是多进程:

在同一时间里,同一个计算机系统中如果允许两个或两个以上的进程处于运行状态,这就是多任务,也就是多进程。

多进程的优点:

  1. 每个进程相互独立,不影响主程序的稳定性,一个进程崩了,也不会影响其他进程;
  2. 通过增加CPU,可以很容易扩充性能;
  3. 可以减少线程加锁、解锁的影响,极大提高性能。

多进程的缺点:

  1. 逻辑控制复杂,需要和主程序交互;
  2. 需要跨进程边界,如果有大数据量传送,就不太好,适合小数据量传送、密集运算,所以进程开销比较大;
  3. 最好是多进程和多线程结合,即根据实际的需要,每个CPU开启一个子进程,这个子进程开启多线程可以为若干同类型的数据进行处理。

进程有哪几种状态?

  • 就绪状态:进程已获得除处理机以外的所需资源,等待分配处理机资源;
  • 运行状态:占用处理机资源运行,处于此状态的进程数小于等于CPU数;
  • 阻塞状态: 进程等待某种条件,在条件满足之前无法执行。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fFOvwZbg-1602775942025)(C:\Users\vocyd\AppData\Roaming\Typora\typora-user-images\image-20200910120920054.png)]

1.2 线程

线程,有时被称为轻量级进程(Lightweight Process,LWP),是操作系统调度(CPU调度)执行的最小单位。线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,但是所有同属进程下线程共享进程所拥有的全部资源。

同一个进程中可以有多个线程,线程不能独立存在,必须依附于进程,一个进程至少有一个线程,如果只有一个线程,那就是程序本身。


什么是多线程:

进程内一个独立的、库调度的执行单元,是系统独立调度和分派CPU的基础单位。在单个程序中同时运行多个线程完成不同的工作,就是多线程。

多线程的优点:

  1. 无需跨进程边界;
  2. 程序逻辑和控制方式简单;
  3. 所有线程可以直接共享内存和变量等;
  4. 线程方式消耗的总资源比进程方式好。

多线程缺点:

  1. 每个线程与主程序共用地址空间,受限于2GB地址空间;
  2. 线程之间的同步和加锁控制比较麻烦;
  3. 一个线程的崩溃可能影响到整个程序的稳定性;
  4. 到达一定的线程数程序后,即使再增肌CPU也无法提升性能;
  5. 线程能提高的总性能优先,而且线程多了之后,线程本身的调度也是一个麻烦事儿,需要消耗较多的CPU。

1.3 协程

协程,是一种比线程更加轻量级的存在,协程不是被操作系统内核所管理,而完全是由程序所控制(也就是在用户态执行)。这样带来的好处就是性能得到了很大的提升,不会像线程切换那样消耗资源。

子程序,或者称为函数,在所有语言中都是层级调用,比如A调用B,B在执行过程中又调用了C,C执行完毕返回,B执行完毕返回,最后是A执行完毕。所以子程序调用是通过栈实现的,一个线程就是执行一个子程序。子程序调用总是一个入口,一次返回,调用顺序是明确的。而协程的调用和子程序不同。

协程在子程序内部是可中断的,然后转而执行别的子程序,在适当的时候再返回来接着执行

协程拥有自己的寄存器上下文的栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈。因此协程能保留上次调用时的状态,每次过程重入时,就相当于上一次调用的状态。

协程需要用户自己编写调度逻辑,对于CPU来说,协程其实就是单线程,CPU不需要考虑怎么去调度、切换上下文,这样就省去了CPU的切换开销,因此协程在一定程度上要好于多线程。


协程的优点:

  1. 无须线程上下文切换的开销,因为子程序切换不是线程切换,而是由程序自身控制,和多线程比,线程数量越多,协程的性能优势就越明显;
  2. 无须原子操作锁定及同步的开销,原子操作就死一个最小的操作;
  3. 方便切换控制流,简化编程模型;
  4. 高并发性、高扩展性、低成本;

协程的缺点:

  1. 无法利用多核资源:协程的本质就是单线程,它不能同时将单个CPU的多核用上,协程需要配合进程才能运行在多核CPU上;
  2. 进程堵塞操作会堵塞掉整个程序。

1.4 进程和线程的区别、联系

区别

  • 调度
    • 线程作为调度和分配的基本单位,用于保证程序的 实时性,实现进程内部的并发;
    • 进程作为拥有资源的基本单位,是对运行时程序的封装,实现了操作系统的并发;
  • 并发性不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行
  • 拥有资源进程是拥有资源的一个独立单位,线程不拥有系统资源,多个线程共享进程的内存,可以访问所隶属的进程的资源。进程所维护的是程序所包含的资源(静态资源), 如:地址空间,打开的文件句柄集,文件系统状态,信号处理handler等;线程所维护的运行相关的资源(动态资源),如:运行栈,调度相关的控制信息,待处理的信号集等
  • 系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。但是进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个进程死掉就等于所有的线程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些

联系

  • 一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程
  • 资源分配给进程,同一进程的所有线程共享该进程的所有资源;
  • 处理机分给线程,即真正在处理机上运行的是线程
  • 线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。

1.5 进程同步

https://blog.csdn.net/qq_36136497/article/details/82697128

多进程虽然提高了系统资源利用率和吞吐量,但是由于进程的异步性可能造成系统的混乱。进程同步的任务就是对多个相关进程在执行顺序上进行协调,使并发执行的多个进程之间可以有效的共享资源和相互合作,保证程序执行的可再现性。

1.5.1 信号量

我们用信号量及PV操作来实现进程的同步和互斥。PV操作属于进程的低级通信。

信号量(semaphore)的数据结构为一个值和一个指针,指针指向等待该信号量的下一个进程。信号量的值与相应资源的使用情况有关。当它的值大于0时,表示当前可用资源的数量;当它的值小于0时,其绝对值表示等待使用该资源的进程个数。注意,信号量的值仅能由PV操作来改变。它是用于进程间传递信号的一个整数值。在信号量上只有三种操作可以进行:初始化,P操作(-)和V操作(+),这三种操作都是原子操作。P操作(-)可以用于阻塞一个进程,V操作(+)可以用于解除阻塞一个进程。


PV操作:

由P操作原语和V操作原语组成(原语是不可中断的过程),对信号量进行操作,具体定义如下:

  • P(S):①将信号量S的值减1,即S=S-1;
    ②如果S<0,则该进程继续执行;否则该进程置为等待状态,排入等待队列。
  • V(S):①将信号量S的值加1,即S=S+1;
    ②如果S>0,则该进程继续执行;否则释放队列中第一个等待信号量的进程。

利用信号量和PV操作实现进程互斥的一般模型:

进程P1 进程P2 …… 进程Pn
…… …… ……
P(S); P(S); P(S);
临界区; 临界区; 临界区;
V(S); V(S); V(S);
…… …… …… ……


注意:

  1. 每个程序中用户实现互斥的P、V操作必须成对出现,先做P操作,进临界区,后做V操作,出临界区。若有多个分支,要认真检查其成对性。
  2. P、V操作应分别紧靠临界区的头尾部,临界区的代码应尽可能短,不能有死循环。
  3. 互斥信号量的初值一般为1。

利用信号量和PV操作实现进程同步:
PV操作是典型的同步机制之一。用一个信号量与一个消息联系起来,当信号量的值为0时,表示期望的消息尚未产生;当信号量的值非0时,表示期望的消息已经存在。用PV操作实现进程同步时,调用P操作测试消息是否到达,调用V操作发送消息。
使用PV操作实现进程同步时应该注意:

  1. 分析进程间的制约关系,确定信号量种类。在保持进程间有正确的同步关系情况下,哪个进程先执行,哪些进程后执行,彼此间通过什么资源(信号量)进行协调,从而明确要设置哪些信号量。
  2. 信号量的初值与相应资源的数量有关,也与P、V操作在程序代码中出现的位置有关。
  3. 同一信号量的P、V操作要成对出现,但它们分别在不同的进程代码中。

1.5.2 管程

信号量机制功能强大,但使用时对信号量的操作分散,而且难以控制,读写和维护都很困难。因此后来又提出了一种集中式同步进程——管程。其基本思想是将共享变量和对它们的操作集中在一个模块中,操作系统或并发程序就由这样的模块构成。这样模块之间联系清晰,便于维护和修改,易于保证正确性。

从语言的角度看,管程主要有以下特性:

  1. 模块化。管程是一个基本程序单位,可以单独编译;
  2. 抽象数据类型。管程是中不仅有数据,而且有对数据的操作;
  3. 信息掩蔽。管程外可以调用管程内部定义的一些函数,但函数的具体实现外部不可见。

对于管程中定义的共享变量的所有操作都局限在管程中,外部只能通过调用管程的某些函数来间接访问这些变量。因此管程有很好的封装性。

为了保证

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值