操作系统相关知识

什么是操作系统

操作系统是运行在计算机上最重要的一种软件,它管理计算机的资源和进程以及所有的硬件和软件。它为计算机硬件和软件提供了一种中间层。
通常情况下,计算机上会运行着许多应用程序,它们都需要对内存和CPU进行交互,操作系统的目的就是为了保证这些访问和交互能够准确无误的进行。

操作系统的主要目的是什么

管理计算机资源
提供一种图形界面,它提供了用户和计算机之间的桥梁
为其他软件提供服务,操作系统与软件进行交互,以便为其分配进行所需的任何必要资源

什么是线程,线程和进程的区别

进程是正在运行的程序的实例,而线程其实就是进程中的单条流向,因为线程具有进程中的某些属性,所以线程又被称为轻量级的进程。游览器如果是一个进程的话,那么游览器下面的每个tab页面可以看作一个的线程。

线程和进程持有资源的区别
在这里插入图片描述
进程中的内容:地址空间,全局变量,打开文件,子进程,即将发生的定时器,信号与信号处理程序,账号信息
每个线程中的内容:程序计数器,寄存器,堆栈,状态

线程不像进程那样有很强的独立性,线程之间会共享数据。
创建线程的开销比进程的开销要小的多。

使用多线程的好处是什么

能够提高对用户的响应顺序
在流程中的资源共享
比较经济实用
能够对多线程架构有深入的理解

什么是 RR 调度算法

主要针对分时系统,RR的调度算法会把时间片以相同的部分并循环的分配给每个进程,RR调度算法没有优先级的概念。这种算法的实现比较简单,而且每个线程都会占有时间片,而不存在线程饥饿的问题。

多线程编程的好处是什么

提高程序的并发能力,多线程在某些情况下哪个使你的程序运行的更快。而且,多线程编程能够提高程序员的编程能力和编程思维and管理能力。

进程间的通信方式

通信概念
竞态条件:即两个或多个线程同时对一共享数据进行修改,从而影响程序运行的正确性时,这种就被称为竞态条件
临界区:不仅共享资源会造成竞态条件,实际上,共享文件、共享内存也会造成竞态条件。避免方法:禁止一个或多个进程在同一时刻对共享资源进行读写。这就是说,我们需要一种互斥条件,如果一个进程在某种方式下使用共享变量和文件的话,除该进程之外的其他进程就禁止做这种事。

一个好的解决方案,应该包含下面四个条件:
1.任何时候两个进程不能同时处于临界区
2.不应对CPU的速度和数量做任何假设
3.位于临界区外的进程不得阻塞其他进程
4.不能使任何进程无限等待进入临界区

忙等互斥:当一个进程在对资源进行修改时,其他进程必须进行等待,进程之间要具有互斥性。这些解决方案,都是基于互斥性提出的

管道/匿名管道(pipe)

  • 管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道
  • 只能用与父子进程或者兄弟进程之间(具有亲缘关系的进程)
  • 单独构成一种独立的文件系统,并且存在于内存中。(管道对于管道两端的进程而言,就是一个文件)
  • 数据的读出和写入:一个进程向管道中写的内容被管道另一端的进程读出。写出的内容每次都添加在管道缓冲区的尾部,并且每次都是从缓冲区的头部读出数据

在这里插入图片描述
管道的实质
管道的实质是一个内核缓冲区,进程以先进先出的方式从缓冲区存储数据,管道一端的进程顺序的将数据写入缓冲区,另一端的进程则顺序的读出程序。

该缓冲区可以看做是一个循环队列,读和写的位置都是自动增长的,不能随意改变,一个数据只能被读一次,读出来以后在缓冲区就不复存在了

当缓冲区读空或者写满时,有一定的规则控制相应的读进程或者写进程进入等待队列,当空的缓存区有新数据写入或者满的缓冲区有数据读出来时,就唤醒等待队列中的进程进行读写。

管道的局限

  • 只支持单向数据流
  • 只能用于具有亲缘关系的进程之间
  • 没有名字
  • 管道的缓冲区是有限的(管道制存在于内存中,在管道创建时,为缓冲区分配一个页面大小)
  • 管道所传送的是无格式字节流,这就要求管道的读出方和写入方必须事先约定好数据的格式,比如多少字节算作一个消息(或命令、或记录)等等

有名管道(FIFO)
匿名管道,由于没有名字,只能用于亲缘关系的进程间通信。为了克服这个缺点,提出了有名管道(FIFO)

有名管道不同于匿名管道之处在于它提供了一个路径名与之关联,以有名管道的文件形式存在于文件系统中,这样,即使与有名管道的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够彼此通过有名管道相互通信,因此,通过有名管道不相关的进程也可以交换数据。值得注意的是,有名管道严格遵循先进先出(类似于队列),对匿名管道及有名管道的读总是从开始处返回数据,对它们的写则把数据添加到末尾。它们不支持诸如lseek()等文件定位操作。有名管道的名字存在于文件系统中,内容存放在内存中。

匿名管道和有名管道总结

  1. 管道是特殊类型的文件,在满足先入先出的原则条件下可用进行读写,都不能进行定位读写。
  2. 匿名管道是单向的,只能在有亲缘关系的进程间通信;有名管道以磁盘文件的方式存在,可以实现本机任意两个进程通信。
  3. 无名管道阻塞问题:无名管道无需显示打开,创建时直接返回文件描述符,在读写时需要确定对方的存在,否则将退出。如果当前进程向无名管道的一端写数据,必须确定另一端有某一进程。如果写入无名管道的数据超过其最大量,写操作将阻塞,如果管道中没有数据,读操作将阻塞,如果发现管道的另外一端断开,将自动退出。
  4. 有名管道阻塞问题:有名管道在打开时需要确实地方的存在,否则将阻塞。即以读方式打开某管道,在此之前必须一个进程以写方式打开管道,否则阻塞。此外,可以以读写模式打开有名管道,即当前进程读,当前进程写,不会阻塞。

信号(Signal)

  • 信号是Linux系统中用于进程间互相通信或者操作的一种机制,信号可以在任何时候发给某一进程,而无需知道该进程的状态
  • 如果该进程当前并未处于执行状态,则该信号就由内核保护起来,直到该进程回复执行并传递给它为止
  • 如果一个信号被进程设置为阻塞,则该信号的传递被延迟,直到其阻塞被取消时才被传递给进程

信号来源
信号是软件层次上对中断机制的一种模拟,是一种异步通信模式,信号可以在用户空间进程和内核之间直接交互,内核可以利用信号来通知用户空间发送了哪些系统事件,信号事件主要有两个来源:

  • 硬件来源:用户按键输入Ctrl+C退出、硬件异常如无效的存储访问等
  • 软件终止:终止进程信号、其他进程调用kill函数、软件异常产生信号

信号生命周期和处理流程

  1. 信号被某个进程产生,并设置此信号传递的对象,然后传递给操作系统
  2. 操作系统根据接收进程的设置(是否阻塞)而选择性的发送给接收者,如果接收者阻塞该信号(且该信号是可以阻塞的),操作系统将暂时保留该信号,而不传递,直到该进程解除了对此信号的阻塞(如果对应进程已经退出,则丢弃此信号),如果对应进程没有阻塞,操作系统将传递此信号
  3. 目的进程接收到此信号后,将根据当前进程对此信号设置的预处理方式,暂时终止当前代码的执行,保护上下文(主要包括临时寄存器数据、当前程序位置以及当前CPU的状态)、转而执行中断服务程序,执行完成后在回复到中断的位置。当然,对于抢占式内核,在中断返回时还将引发新的调度。

在这里插入图片描述

消息(Message)队列

  • 消息队列是存放在内核当中的消息链表,每个消息队列由消息队列标识符表示。
  • 与管道(无名管道:只存在于内存中的文件;命名管道:存在于实际的磁盘介质或者文件系统)不同的是消息队列存放在内核中,只有内核重启(即,操作系统重启)或者显示地删除一个消息队列时,该消息队列才会被真正的删除。
    注:内核(Kernel)是操作系统最基本的部分,用来管理软件发出的数据I/O要求的计算机程序,并将这些要求转译为数据处理的指令并交由中央处理器(CPU)及计算机中其他电子组件进行处理。
  • 另外与管道不同的是,消息队列在某个进程往一个队列写入消息之前,并不需要另外某个进程在该队列上等待消息的到达。

消息队列特点

  1. 消息队列是消息的链表,具有特定的格式,存放在内存中并由消息队列标识符标识
  2. 消息队列允许一个或多个进程向它写入与读取消息
  3. 管道和消息队列的通信数据都是先进先出的原则
  4. 消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按信息的类型读取,比FIFO更有优势
  5. 消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点
  6. 目前主要有两种类型的消息队列:POSIX消息队列以及System V消息队列,系统V消息队列目前被大量使用。

共享内存

  • 使得多个进程可以直接读写同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。
  • 为了在多个进程间交换信息,内核专门留出一块内存去,可以由需要访问的进程将其映射到自己的私有地址空间。进程就可以直接读写这一块内存而不需要进行数据的拷贝,从而大大提高效率
  • 由于多个进程共享一段内存,因此需要依靠某种同步机制(信号量)来达到进程间的同步及互斥

在这里插入图片描述

信号量(semaphore)
信号量是一个计数器,由于多进程对于共享数据的访问。信号量的意图在于进程间的同步。

为了获得共享资源,进程需要执行下列操作:

  1. **创建一个信号量:**这要求调用者指定初始值,对于二值信号量来说,它通常是1,也可是.0
  2. **等待一个信号量:**该操作会测试这个信号量的值,如果小于0,就阻塞
  3. **挂出一个信号量:**该操作将信号量的值加1
    为了正确地实现信号量,信号量值的加一及减一操作应当是原子操作。

信号量与互斥量之间的区别:

(1)互斥量用于线程的互斥,信号量用于线程的同步。这是互斥量和信号量的根本区别,也就是互斥和同步之间的区别。

互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。

同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。

在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源

(2)互斥量值只能为0/1,信号量值可以为非负整数。

也就是说,一个互斥量只能用于一个资源的互斥访问,它不能实现多个资源的多线程互斥问题。信号量可以实现多个同类资源的多线程互斥和同步。当信号量为单值信号量是,也可以完成一个资源的互斥访问。

(3)互斥量的加锁和解锁必须由同一线程分别对应使用,信号量可以由一个线程释放,另一个线程得到。

套接字(socket)
套接字是一种图形机制,凭借这种机制,客户/服务器(即要进行通信的进程)系统的开发工资即可以在本地单机上进行,也可以跨网络进行。也就是说 它可以让不在同一台计算机但通过网络连接计算器上的进程进行通信、
在这里插入图片描述
套接字支持TCP/IP的网络通信的基本操作单元,可以看做是不同主机之间的进程进行双向通信的端点,简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通信过程的。

套接字的特性
套接字的特性由3个属性确定:域、端口号、协议类型

套接字的域
它指定套接字通信中使用的是网络介质,常用的套接字域有两种:

AF_INET 指的是Internet网络。当客户使用套接字进行跨网络的连接时,它就需要用到服务器计算机的IP地址和端口来指定一台联网机器上的某个特定服务,所以在使用socket套接字作为通信的终点,服务器应用程序必须在开始通信之前绑定一个端口,服务器在指定的端口等待客户的连接

AF_UNIX 表示UNIX文件系统,它就是文件输入/输出,而它的地址就是文件名

套接字协议类型
因特网提供三种通信机制,

一是流套接字 流套接字在域中提过TCP/IP连接实现,同时也是AF_UNIX中常用的套接字类型。流套接字提供的是一个有序、可靠、双向字节流的连接,因此发送的数据可以保证不会丢失、重复或乱序到达,而且还有一定的出错之后重新发送的机制

二是数据报套接字它不需要建立连接和维持一个连接,它们在域中通常是通过UDP/IP协议实现的。它可以发送的数据的长度有限制,数据报作为一个单独的网络消息被传输,它可能会丢失。复制或错乱到达,UDP不是一个可靠的协议,但是传输速度快,因为它不需要建立和维持一个连接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值