当前位置: 首页 > article >正文

计算机基础-操作系统(1)

计算机基础-操作系统

目录

计算机基础-操作系统

系统调用是什么,你用过哪些系统调用,和库函数有什么区别?

进程有几种状态?画一下进程状态转换图?

LINUX进程间通信方式有哪些?有什么优缺点?

进程调度算法

进程和线程有什么区别?

内核线程和用户线程的区别?

进程同步的方法

死锁的四个必要条件是什么?

如何预防死锁?


系统调用是什么,你用过哪些系统调用,和库函数有什么区别?

-- 系统调用

系统调用是操作系统提供给应用程序的一组接口,用于访问底层系统资源(如文件、网络、进程等)。应用程序通过系统调用请求操作系统执行某些特定的操作,例如创建进程、读取文件、发送数据等。

-- 常见的系统调用包括:

  • 文件系统操作:打开文件、读取文件、写入文件、关闭文件等。
  • 进程控制:创建进程、终止进程、等待进程结束等。
  • 网络通信:建立连接、发送数据、接收数据等。
  • 内存管理:分配内存、释放内存等。
  • 设备控制:读取设备、写入设备等。

不同的操作系统可能会提供不同的系统调用,但通常都会提供以上基本的功能。应用程序通过系统调用与操作系统进行交互,从而实现对底层系统资源的访问。

-- 库函数

库函数 库函数(Library function)是把函数放到库里,供别人使用的一种方式。方法是把一些常用到的函数编完放到一个文件里,供不同的人进行调用。一般放在.lib文件中。库函数调用则是面向应用开发的,库函数可分为两类,一类是C语言标准规定的库函数,一类是编译器特定的库函数。

  • 区别

1、库函数在用户地址空间执行,系统调用是在内核地址空间执行,库函数运行时间属于用户时间,系统调用属于系统时间,库函数开销较小,系统调用开销较大
2、库函数是有缓冲的,系统调用是无缓冲的
3、库函数并不依赖平台,库函数调用与系统无关,不同的系统,调用库函数,库函数会调用不同的底层函数实现,因此可移植性好。系统调用依赖平台

进程有几种状态?画一下进程状态转换图?

  • 创建状态: 一个应用程序从系统上启动,首先就是进入创建状态,需要获取系统资源创建进程控制块(PCB)完成资源分配。

  • 就绪状态: 在创建状态完成之后,进程已经准备好,但是还未获得处理器资源,无法运行。

  • 运行状态: 获取处理器资源,被系统调度,开始进入运行状态。如果进程的时间片用完了就进入就绪状态。

  • 阻塞状态: 在运行状态期间,如果进行了阻塞的操作,如耗时的I/O操作,此时进程暂时无法操作就进入到了阻塞状 态,在这些操作完成后就进入就绪状态。

  • 终止状态: 进程结束或者被系统终止,进入终止状态

LINUX进程间通信方式有哪些?有什么优缺点?
  • 管道:用来实现进程间相互发送非常短小的、频率很高的消息,通常适用于两个进程间的通信。

  • 无名管道(内存文件):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程之间使用。进程的亲缘关系通常是指父子进程关系。半双工速度慢,利用内核中的一串缓存,容量有限。只有具有亲缘关系的进程间通讯。面向字节流。

  • 有名管道(FIFO文件,借助文件系统):有名管道也是半双工的通信方式,但是允许在没有亲缘关系的进程之间使用,管道是先进先出的通信方式,克服了管道没有名字的限制。但速度慢。

  • 流管道(s_pipe): 去除了第一种限制,可以双向传输(全双工),或者用两个管道实现全双工也行。 共享内存:共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的IPC方式,它是针对其他进程间通信方式运行效率低而专门设计的。但需要进程自行解决进程同步和互斥问题,往往与信号量,配合使用来实现进程间的同步和通信。共享内存用来实现进程间共享的、非常庞大的、读写操作频率很高的数据。

  • 消息队列:消息队列是有消息的链表数据块,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。是一种异步的通信方式可以使多个进程之间传递数据块。消息队列通常用于进程间的同步,进程可以从队列中读取数据,或者向队列中写入数据。进行通信时不再需要考虑同步问题,使用方便, 但是信息的复制需要额外消耗CPU的时间,通信不及时,不适宜于信息量大或操作频繁的场合。

  • 套接字:是一种基于网络协议的通信方式,适用于不同机器间进程通信,在本地也可作为两个进程通信的方式。

  • 信号:信号是一种异步通信方式,可以向进程发送一个软件中断请求。用于通知接收进程某个事件已经发生,比如按下ctrl + C就是信号。主要作为进程间以及同一进程不同线程之间的同步手段。

  • 信号量:信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。实现进程、线程对临界区的同步及互斥访问。主要作为进程间以及同一进程内不同线程之间的同步手段。不能用来传递复杂消息,只能用来同步。

  • 总结来说:管共消,套两信。

进程调度算法

-- 常见的操作系统进程调度策略有哪些?

  • 1、 先来先服务 first-come first-serverd(FCFS)

非抢占式的调度算法,按照请求的顺序进行调度。
有利于长作业,但不利于短作业,因为短作业必须一直等待前面的长作业执行完毕才能执行,而长作业又需要执行很长时间,造成了短作业等待时间过长。
不会导致饥饿

  • 2、 短作业优先 shortest job first(SJF)

非抢占式的调度算法,按估计运行时间最短的顺序进行调度。
有利于短作业,但不利于长作业
会饥饿。长作业有可能会饿死,处于一直等待短作业执行完毕的状态。因为如果一直有短作业到来,那么长作业永远得不到调度。

  • 3、最短剩余时间优先 shortest remaining time next(SRTN)

短作业优先的抢占式版本,按剩余运行时间的顺序进行调度。 当一个新的作业到达时,其整个运行时间与当前进程的剩余时间作比较。
如果新的进程需要的时间更少,则挂起当前进程,运行新的进程。否则新的进程等待。

  • 4、时间片轮转(RR Round-Robin)

按照各进程到达就绪队列的顺序(FCFS 的原则),轮流让各个进程执行一个时间片(如100ms)。若进程未在一个时间片内执行完,则剥夺处理机,将进程重新放到就绪队列队尾重新排队。当时间片用完时,由计时器发出时钟中断,调度程序便停止该进程的执行,并将它送往就绪队列的末尾,同时继续把 CPU 时间分配给队首的进程。
抢占式算法,发出时钟中断告知时间片已到。
优点:公平;响应快,适用于分时操作系统。
缺点:由于高频率的进程切换,因此有一定开销;不区分任务的紧急程度。
不会饥饿

-- 时间片轮转算法的效率和时间片的大小有很大关系:

进程切换都要保存进程的信息并且载入新进程的信息,如果时间片太小,会导致进程切换得太频繁,在进程切换上就会花过多时间。
而如果时间片过长,那么实时性就不能得到保证。

  • 5、优先级调度

为每个进程分配一个优先级,按优先级进行调度。
为了防止低优先级的进程永远等不到调度,可以随着时间的推移增加等待进程的优先级。

抢占非抢占式都有
优点:用优先级区分紧急程度、重要程度,适用于实时操作系统。可灵活地调整对各种作业/进程的偏好程度。
缺点:若源源不断地有高优先级进程到来,则可能导致饥饿
会饥饿

  • 6、最高响应比优先(HRRN)

基于响应比计算的优先级,响应比越高的进程优先执行。响应比的计算公式为等待时间加服务时间/服务时间。

非抢占式
综合考虑了等待时间和运行时间(要求服务时间) 等待时间相同时,要求服务时间短的优先(SJF的优点)要求服务时间相同时,等待时间长的优先(FCFS的优点>对于长作业来说,随着等待时间越来越久,其响应比也会越来越大,从而避免了长作业饥饿的问题
不会饥饿

  • 7、多级反馈队列

一个进程需要执行 100 个时间片,如果采用时间片轮转调度算法,那么需要交换 100 次。

多级队列是为这种需要连续执行多个时间片的进程考虑,它设置了多个队列,每个队列时间片大小都不同,例如 1,2,4,8,..。进程在第一个队列没执行完,就会被移到下一个队列。

这种方式下,之前的进程只需要交换 7 次。每个队列优先权也不同,最上面的优先权最高。因此只有上一个队列没有进程在排队,才能调度当前队列上的进程。

可以将这种调度算法看成是时间片轮转调度算法和优先级调度算法的结合。

设置多级就绪队列,各级队列优先级从高到低,时间片从小到大

新进程到达时先进入第1级队列,按FCFS原则排队等待被分配时间片,若用完时间片进程还未结束,则进程进入下一级队列队尾。如果此时已经是在最下级的队列,则重新放回该队列队尾

只有第k级队列为空时,才会为k+1级队头的进程分配时间片

抢占式的算法。在k级队列的进程运行过程中,若更上级的队列( 1~k-1级)中进入了一个新进程,则由于新进程处于优先级更高的队列中,因此新进程会抢占处理机,原来运行的进程放回k级队列入队尾。 对各类型进程相对公平(FCFS的优点)﹔每个新到达的进程都可以很快就得到响应(RR的优点)﹔短进程只用较少的时间就可完成(SPF的优点)﹔不必实现估计进程的运行时间(避免用户作假)﹔可灵活地调整对各类进程的偏好程度,比如cPU密集型进程、I/o密集型进程(拓展:可以将因I/o而阻塞的进程重新放回原队列,这样/o型进程就可以保持较高优先级) 会饥饿

进程和线程有什么区别?
  • 进程是资源分配的最小单位。 线程是程序执行的最小单位,处理器调度的基本单位,两者均可并发执行。
  • 进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,这种操作非常昂贵。而线程是共享进程中的数据,使用相同的地址空间, 因此,CPU切换一个线程的花费远比进程小很多,同时创建一个线程的开销也比进程小很多。
  • 线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据,而进程之间的通信需要以通信的方式(IPC)进行。
  • 进程切换时,消耗的资源大,效率低。所以涉及到频繁的切换时,使用线程要好于进程。同样如果 要求同时进行并且又要共享某些变量的并发操作,只能用线程不能用进程。
  • 执行过程:每个独立的进程有一个程序运行的入口、顺序执行序列和程序入口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
  • 线程执行开销小,但是不利于资源的管理和保护。进程执行开销大,但是能够很好的进行资源管理和保护。如何处理好同步与互斥是编写多线程程序的难点。但是多进程程序更健壮,多线程程序只要有一个线程死掉,整个进程也跟着死掉了,而一个进程死掉并不会对另外一个进程造成影响,因为进程有自己独立的地址空间。
内核线程和用户线程的区别?

-- 什么是内核线程和用户线程?

-- 内核线程和用户线程有什么优缺点?

  • 1、管理:内核线程由操作系统内核来创建和管理的线程,它是由操作系统调度器调度的。用户线程是由用户应用程序自己管理的线程,它是在用户空间中运行。
  • 2、创建和销毁:内核线程是由操作系统内核来调度和管理的,而用户线程则是由用户程序来实现调度。因此,在线程的创建和销毁方面,内核线程比用户线程消耗更多的系统资源和时间。
  • 3、访问资源:由于内核线程是由操作系统内核来管理的,所以它可以直接访问操作系统内核的资源,如系统调用和底层硬件设备等。而用户线程只能访问用户空间的资源,如应用程序的数据和内存等,而无法直接访问操作系统内核的资源。
  • 4、线程切换:由于内核线程是由操作系统内核来管理的,所以线程切换需要从用户态切换到内核态,这个过程需要进行上下文切换,切换代价较高。而用户线程则是在用户态下运行的,线程的切换代价相对较低。
  • 5、并发性:内核线程可以在多个CPU上并发执行,因为内核线程可以被分配到任何一个可用的CPU上。用户线程只能在单个CPU上执行。
进程同步的方法

-- 同步是指在多个进程之间共享资源时,需要协调它们的执行顺序,以避免出现竞态条件等问题。以下是一些常用的进程同步方法:

临界区:

临界区是指一段代码,在同一时刻只能被一个进程执行。为了保证多个进程在访问共享资源时不会产生冲突,可以使用临界区机制对共享资源进行保护。进程需要先获得对应的锁或信号量,才能进入临界区执行代码,执行完后再释放锁或信号量。

互斥锁(Mutex):

互斥锁用于保护共享资源,同一时间只允许一个进程访问共享资源。当进程需要访问共享资源时,它需要先获取互斥锁,如果互斥锁已经被其他进程获取了,那么进程就会被阻塞,直到互斥锁被释放为止。当进程完成对共享资源的访问时,它需要释放互斥锁,这样其他进程就可以访问共享资源了。

信号(Signal):

信号是一种进程间通信机制,用于在多个进程之间传递异步事件。当一个进程需要发送信号时,它可以调用发送函数,这样目标进程就会收到信号,并执行相应的处理函数。信号可以用于中断进程的执行,或者触发进程的某些行为。

信号量(Semaphore):

信号量是一种计数器,它用于保护共享资源。当进程需要访问共享资源时,它需要先获取信号量,如果信号量的值为正数,那么进程可以继续执行,同时信号量的值会减一;如果信号量的值为零,那么进程就会被阻塞,直到信号量的值大于零为止。当进程完成对共享资源的访问时,它需要释放信号量,同时信号量的值会加一,这样其他进程就可以访问共享资源了。

事件(Event):

事件是一种进程同步机制,用于在多个进程之间传递信号。当一个进程需要等待某个事件发生时,它可以调用事件的等待函数,这样进程就会被阻塞,直到事件发生为止。当另一个进程触发了事件后,它可以调用事件的通知函数,这样等待事件的进程就会被唤醒,继续执行。

条件变量(Condition Variable):

条件变量用于在多个进程之间传递信息,以协调它们的执行顺序。当一个进程需要等待某个条件成立时,它可以调用条件变量的等待函数,这样进程就会被阻塞,直到条件成立为止。当另一个进程满足了条件后,它可以调用条件变量的通知函数,这样等待条件的进程就会被唤醒,继续执行。

读写锁(Read-Write Lock):

读写锁用于保护共享资源,允许多个进程同时读取共享资源,但只允许一个进程写入共享资源。当一个进程需要读取共享资源时,它需要先获取读锁,如果没有其他进程持有写锁,那么进程可以获取读锁,同时其他进程也可以获取读锁;如果有进程持有写锁,那么进程就会被阻塞,直到写锁被释放为止。当一个进程需要写入共享资源时,它需要先获取写锁,如果没有其他进程持有读锁或写锁,那么进程可以获取写锁;否则进程就会被阻塞,直到读锁和写锁都被释放为止。

交换(Exchange):

交换是一种进程同步机制,用于在多个进程之间交换数据。当一个进程需要交换数据时,它可以调用交换函数,这样它就会被阻塞,直到另一个进程也调用了交换函数为止。当另一个进程调用了交换函数后,两个进程就会交换数据,并继续执行。

屏障(Barrier):

屏障用于协调多个进程的执行顺序,保证它们在某个点上同时开始执行或同时结束执行。当一个进程到达屏障时,它会被阻塞,直到所有进程都到达屏障为止。当最后一个进程到达屏障时,所有进程都会被唤醒,继续执行。

管程:

管程是一种高级的同步机制,是一种抽象数据类型,提供了一组共享变量和一组操作共享变量的过程,保证多个进程在访问共享资源时的互斥和同步。管程封装了共享资源的访问方法,使得进程只能通过管程提供的接口访问共享资源,从而保证了共享资源的访问顺序和互斥性。管程可以使用条件变量等机制实现进程之间的同步和互斥。

死锁的四个必要条件是什么?

-- 死锁是指在多进程或多线程并发执行时,彼此持有对方需要的资源而陷入无法继续执行的一种状态。发生死锁,必须同时满足以下四个必要条件:

  • 1、互斥条件:每个资源同一时间只能被一个进程使用。
  • 2、请求和保持条件:一个进程因请求资源而阻塞时,已获得的资源保持不放。
  • 3、不可剥夺条件:进程已获得的资源,在未使用完之前不能被其他进程强制性地抢占。
  • 4、循环等待条件:若干进程之间形成一种头尾相连的循环等待资源的关系。

-- 如果这四个条件同时满足,就可能会导致死锁的发生。要避免死锁,就需要采取相应的措施来打破上述条件之一,例如破坏环路等待条件、规定资源请求顺序、设置超时等待、资源剥夺或预防性阻塞等。

如何预防死锁?
  • 1、破坏互斥条件:尽可能地允许多个进程同时访问资源,例如在某些情况下可以采用共享资源的方式,避免只允许一个进程使用资源。
  • 2、破坏请求和保持条件:在一个进程请求新的资源时,要求其释放已经获得的资源,等到新的资源获得后再重新申请之前释放的资源。
  • 3、破坏不可剥夺条件:对于某些资源,应该允许操作系统强制剥夺它们,例如如果某个进程因为某些原因无法继续运行,则系统可以剥夺其已经获得的资源。
  • 3、破坏循环等待条件:对所有的资源进行编号,进程只能按照编号顺序请求资源,避免形成环形等待。另外,可以采用资源分配策略,例如银行家算法,通过计算系统中可用资源的总量和已经分配的资源量,判断某个请求是否会导致死锁,从而避免死锁的发生。

http://www.kler.cn/news/354421.html

相关文章:

  • Github学生包的JetBrains认证过期/idea认证过期如何解决?
  • 基于SpringBoot+Vue+uniapp的诗词学习系统的详细设计和实现
  • 中阳金融市场中的风险管理与投资优化策略
  • redis高级数据类型之HyperLogLog
  • WPF入门_02依赖属性
  • [原创]在Delphi高效率的使用函数指针, TProc和TFunc类型.
  • 什么开放式耳机最好用?推荐开放式蓝牙耳机榜上耳机!
  • 华为CE交换机telnet登录失败故障的排查方法
  • 【专题】关系数据库标准语言SQL
  • 人工智能需要学习哪些语言?
  • NodeJS火锅店点单系统-计算机毕业设计源码86547
  • Jmeter之GET与POST 请求的参数存放位置
  • 基于SpringBoot+Vue+uniapp的海产品加工销售一体化管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
  • 服务器数据恢复—服务器硬盘指示灯亮黄灯,raid崩溃的数据恢复案例
  • 机器学习-决策树详解
  • 携程线下一面,面试内容:
  • 【东方oj题解】1893、1821、1822
  • C++研发笔记2——学习规划概览
  • docker方式k8s环境搭建及pod简介
  • FFmpeg的简单使用【Windows】--- 视频混剪+添加背景音乐