【操作系统笔记】

CS基础知识汇总 专栏收录该内容
6 篇文章 0 订阅


2.操作系统

2.1 操作系统包括哪些重要部分。

操作系统的五大功能分别是处理器管理、存储器管理、设备管理、文件管理和作业管理。

  • 处理器管理:处理器管理最基本的功能是处理中断事件,配置了操作系统后,就可对各种事件进行处理。处理器管理还有一个功能就是处理器调度,针对不同情况采取不同的调度策略。处理机调度以进程为基本单位=对进程控制、同步、通信、死锁处理等
  • 存储器管理:存储器管理主要是指针对内存储器的管理。主要任务是分配内存空间,保证各作业占用的存储空间不发生矛盾,并使各作业在自己所属存储区中不互相干扰。(内存地址分配与回收、内存保护、内存扩充与共享)
  • 设备管理:设备管理是指负责管理各类外围设备,包括分配、启动和故障处理等。主要任务是当用户使用外部设备时,必须提出要求,待操作系统进行统一分配后方可使用。*(缓冲管理、设备分配、虚拟设备)
  • 文件管理:文件管理是指操作系统对信息资源的管理。在操作系统中,将负责存取的管理信息的部分称为文件系统。文件管理支持文件的存储、检索和修改等操作以及文件的保护功能。(目录管理、文件读写保护)
  • 作业管理:每个用户请求计算机系统完成的一个独立的操作称为作业。作业管理包括作业的输入和输出,作业的调度与控制,这是根据用户的需要来控制作业运行的。

2.2 OS系统特点

  • 并发:是指两个或多个事件在同一时间间隔内发生。操作系统的并发性是指计算机系统中同时存在多个运行着的程序,因此它应该具有处理和调度多个程序同时执行的能力。在这种多道程序环境下,一段时间内,宏观上有多个程序在同时运行,而每一时刻,单处理器环境下实际仅能有一道程序执行,故微观上这些程序还是在分时地交替执行。操作系统的并发性是通过分时得以实现的。
  • 共享:是指系统中的资源(硬件资源和信息资源)可以被多个并发执行的程序共同使用,而不是被其中一个独占。资源共享有两种方式:互斥访问和同时访问
  • 异步:在多道程序环境下,允许多个程序并发执行,但由于资源有限,进程的执行不是一贯到底。而是走走停停,以不可预知的速度向前推进,这就是进程的异步性。
  • 虚拟:虚拟性是一种管理技术,把物理上的一个实体变成逻辑上的多个对应物,或把物理上的多个实体变成逻辑上的一个对应物的技术。采用虚拟技术的目的是为用户提供易于使用、方便高效的操作环境。

2.2 BIOS是什么,在OS中什么用途。

  • BIOS是英文"Basic Input Output System"的缩略词,直译过来后中文名称就是"基本输入输出系统"。其实,它是一组固化到计算机内主板上一个ROM芯片上的程序,它保存着计算机最重要的基本输入输出的程序、开机后自检程序和系统自启动程序,它可从CMOS中读写系统设置的具体信息。 其主要功能是为计算机提供最底层的、最直接的硬件设置和控制。
  • BIOS主要的功能∶
    1、开机自我测试(Power On Self Test):检查中央处理器 (CPU) 及各控制器之状态是否正常。
    2、初始化动作:针对内存、主板芯片组、显卡及周边装置做初始化动作。
    包括创建中断向量、设置寄存器、对一些外部设备进行初始化和检测
    3、纪录系统设定值:提供各元件的基本设定,如显示器、键盘、处理器、内存等等。
    4、提供常驻程序库:提供操作系统或应用程序呼叫的中断常驻程序,如INT 10H等。
    5、加载操作系统:从储存装置中加载操作系统到随机存取内存。

2.3 微内核是什么。按了开机键后电脑的启动过程。

按下开机键后,电脑都干了些什么?
link
作者:知乎用户
链接:https://www.zhihu.com/question/22364502/answer/21492367
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

一、第一阶段:BIOS上个世纪70年代初,“只读内存”(read-only memory,缩写为ROM)发明,开机程序被刷入ROM芯片,计算机通电后,第一件事就是读取它。这块芯片里的程序叫做"基本輸出輸入系統"(Basic Input/Output System),简称为BIOS。

  • 1.1 硬件自检BIOS程序首先检查,计算机硬件能否满足运行的基本条件,这叫做"硬件自检"(Power-On Self-Test),缩写为POST。如果硬件出现问题,主板会发出不同含义的蜂鸣,启动中止。如果没有问题,屏幕就会显示出CPU、内存、硬盘等信息。
  • 1.2 启动顺序硬件自检完成后,BIOS把控制权转交给下一阶段的启动程序。这时,BIOS需要知道,“下一阶段的启动程序"具体存放在哪一个设备。也就是说,BIOS需要有一个外部储存设备的排序,排在前面的设备就是优先转交控制权的设备。这种排序叫做"启动顺序”(Boot Sequence)。打开BIOS的操作界面,里面有一项就是"设定启动顺序"。

二、第二阶段:主引导记录BIOS按照"启动顺序",把控制权转交给排在第一位的储存设备。
这时,计算机读取该设备的第一个扇区,也就是读取最前面的512个字节。如果这512个字节的最后两个字节是0x55和0xAA,表明这个设备可以用于启动;如果不是,表明设备不能用于启动,控制权于是被转交给"启动顺序"中的下一个设备。这最前面的512个字节,就叫做"主引导记录"(Master boot record,缩写为MBR)。

  • 2.1 主引导记录的结构"主引导记录"只有512个字节,放不了太多东西。它的主要作用是,告诉计算机到硬盘的哪一个位置去找操作系统。主引导记录由三个部分组成:  (1) 第1-446字节:调用操作系统的机器码。  (2) 第447-510字节:分区表(Partition table)。  (3) 第511-512字节:主引导记录签名(0x55和0xAA)。其中,第二部分"分区表"的作用,是将硬盘分成若干个区。
  • 2.2 分区表硬盘分区有很多好处。考虑到每个区可以安装不同的操作系统,“主引导记录"因此必须知道将控制权转交给哪个区。分区表的长度只有64个字节,里面又分成四项,每项16个字节。所以,一个硬盘最多只能分四个一级分区,又叫做"主分区”。每个主分区的16个字节,由6个部分组成:  (1) 第1个字节:如果为0x80,就表示该主分区是激活分区,控制权要转交给这个分区。四个主分区里面只能有一个是激活的。  (2) 第2-4个字节:主分区第一个扇区的物理位置(柱面、磁头、扇区号等等)。  (3) 第5个字节:主分区类型。  (4) 第6-8个字节:主分区最后一个扇区的物理位置。  (5) 第9-12字节:该主分区第一个扇区的逻辑地址。  (6) 第13-16字节:主分区的扇区总数。最后的四个字节(“主分区的扇区总数”),决定了这个主分区的长度。也就是说,一个主分区的扇区总数最多不超过2的32次方。如果每个扇区为512个字节,就意味着单个分区最大不超过2TB。再考虑到扇区的逻辑地址也是32位,所以单个硬盘可利用的空间最大也不超过2TB。如果想使用更大的硬盘,只有2个方法:一是提高每个扇区的字节数,二是增加扇区总数。

三、第三阶段:硬盘启动
这时,计算机的控制权就要转交给硬盘的某个分区了,这里又分成三种情况。3.1 情况A:卷引导记录上一节提到,四个主分区里面,只有一个是激活的。计算机会读取激活分区的第一个扇区,叫做"卷引导记录"(Volume boot record,缩写为VBR)。“卷引导记录"的主要作用是,告诉计算机,操作系统在这个分区里的位置。然后,计算机就会加载操作系统了。3.2 情况B:扩展分区和逻辑分区随着硬盘越来越大,四个主分区已经不够了,需要更多的分区。但是,分区表只有四项,因此规定有且仅有一个区可以被定义成"扩展分区”(Extended partition)。所谓"扩展分区",就是指这个区里面又分成多个区。这种分区里面的分区,就叫做"逻辑分区"(logical partition)。计算机先读取扩展分区的第一个扇区,叫做"扩展引导记录"(Extended boot record,缩写为EBR)。它里面也包含一张64字节的分区表,但是最多只有两项(也就是两个逻辑分区)。计算机接着读取第二个逻辑分区的第一个扇区,再从里面的分区表中找到第三个逻辑分区的位置,以此类推,直到某个逻辑分区的分区表只包含它自身为止(即只有一个分区项)。因此,扩展分区可以包含无数个逻辑分区。但是,似乎很少通过这种方式启动操作系统。如果操作系统确实安装在扩展分区,一般采用下一种方式启动。3.3 情况C:启动管理器在这种情况下,计算机读取"主引导记录"前面446字节的机器码之后,不再把控制权转交给某一个分区,而是运行事先安装的"启动管理器"(boot loader),由用户选择启动哪一个操作系统。Linux环境中,目前最流行的启动管理器是Grub。

四、第四阶段:操作系统
控制权转交给操作系统后,操作系统的内核首先被载入内存。以Linux系统为例,先载入/boot目录下面的kernel。内核加载成功后,第一个运行的程序是/sbin/init。它根据配置文件(Debian系统是/etc/initab)产生init进程。这是Linux启动后的第一个进程,pid进程编号为1,其他进程都是它的后代。然后,init线程加载系统的各个模块,比如窗口程序和网络程序,直至执行/bin/login程序,跳出登录界面,等待用户输入用户名和密码。至此,全部启动过程完成。

【内核】
参考链接link
内核是什么?听起来跟cpu一样,像一个物理硬件。但是恰恰不是。内核是操作系统中的核心部分。那操作系统是硬件?肯定不是,是软件。那么内核也就是软件。
内核还可以分为:微内核和宏内核(单内核)。
如何区分呢?做一个形象的比喻。
宏内核相当于一家公司,然后办公室不划分任何部门,所有的部门都在这里工作。
微内核也是一家公司,但是它把办公室隔成了很多小办公室,每个部门在各自的办公室办公,不会相互影响。
微内核是只提供系统的必要服务,即把必要的服务放在核区。而把其他的服务,包括文件管理、网络服务等服务放到用户模式下。
这样子做的优点和缺点是什么呢?
先讲缺点:会降低速度。这是致命的缺点,所以在很久以前内核基本都是宏内核。很少会有微内核。但是你讲到这?不对呀。华为和谷歌不是有微内核系统吗?华为的鸿蒙这么火?
这就讲讲它的优点:
1.系统稳定。因为把更多的系统服务放到了用户模式,所以微内核里的服务少,所以奔溃的机会就变少了。被放到用户模式的服务崩溃了也不会对系统造成很大的影响。这一点我们回忆下Windows7以前的操作系统,蓝屏的概率是不是比Windows7以后的操作系统更大呢?这是为什么呢?因为Windows从7开始就把微内核的架构放进去了,把更多的服务放在了用户模式。那么现在这些服务出现错误,你也不会蓝屏了,重新开机下又恢复了。
2.系统易维护更新。这个很容易理解,因为改的代码量变少了。
3.安全性能高。
so现在大多数宏内核都加了一点微内核的思想。

2.4 并发&并行

【并发】两个或多个事件同一时间间隔内发生
【并行】需要多流水线或多处理机环境,

2.5 同步&异步

【同步】

  • 同步的定义:是指一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息,那么,这个进程将会一直等待下去,直到收到返回信息才继续执行下去。
    特点:
  • 同步是阻塞模式;
  • 同步是按顺序执行,执行完一个再执行下一个,需要等待,协调运行;

【异步】
是指进程不需要一直等下去,而是继续执行下面的操作,不管其他进程的状态。当有消息返回时系统会通知进程进行处理,这样可以提高执行的效率。
特点:

  • 异步是非阻塞模式,无需等待;
  • 异步是彼此独立,在等待某事件的过程中,继续做自己的事,不需要等待这一事件完成后再工作。线程是异步实现的一个方式。

【同步与异步的优缺点】

  • 同步可以避免出现死锁,读脏数据的发生。一般共享某一资源的时候,如果每个人都有修改权限,同时修改一个文件,有可能使一个读取另一个人已经删除了内容,就会出错,同步就不会出错。但,同步需要等待资源访问结束,浪费时间,效率低。

  • 异步可以提高效率,但,安全性较低。

  • 同步与异步同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication)所谓同步,就是在发出一个调用时,在没有得到结果之前,该调用就不返回。但是一旦调用返回,就得到返回值了。换句话说,就是由调用者主动等待这个调用的结果。

  • 而异步则是相反,调用在发出之后,这个调用就直接返回了,所以没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在调用发出后,被调用者通过状态、通知来通知调用者,或通过回调函数处理这个调用。
    【阻塞&非阻塞】

  • 阻塞与非阻塞阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态.阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。

  • 还是上面的例子,你打电话问书店老板有没有《分布式系统》这本书,你如果是阻塞式调用,你会一直把自己“挂起”,直到得到这本书有没有的结果,如果是非阻塞式调用,你不管老板有没有告诉你,你自己先一边去玩了, 当然你也要偶尔过几分钟check一下老板有没有返回结果。

2.6 进程通信

1)管道

1. 匿名管道

  1. 匿名管道是基于文件描述符的通信方式。实现两个进程间的通信时必须通过fork创建子进程,实现父子进程之间的通信。本质是内核的一块缓存(环形队列)。【个人理解】由于父子进程文件描述符内容相同,则通过int pipe(int pipefd[2])返回的文件描述符内容可被父子进程识别。
  2. 读写规则
    管道内没有数据时,读端(read)发生阻塞,等待有效数据进行读取
    管道容量被数据填满时,写端(write)发生阻塞,等待进程将数据读走再进行写入
    如果所有管道写端对应的文件描述符被关闭,read返回0,但会将之前管道里的数据读完
    如果所有管道的读端对应的文件描述符被关闭,write操作会产生信号,SIGPIPE,进而导致write进程退出
  3. 特点
    只能进行单向通信
    只能够用于血缘关系的进程之间,多用于父子之间
    管道内部自带同步机制:子进程写一条,父进程读一条
    管道在进行通信的时候,对外层提供的服务叫做面向字节流的服务
    当进程退出之时,管道也随之释放,与文件保持一致

2. 命名管道(named pipe 或 FIFO))
1、与管道的区别:提供了一个路径名与之关联,以FIFO文件的形式存储于文件系统中,能够实现任何两个进程之间通信。而匿名管道对于文件系统是不可见的,它仅限于在父子进程之间的通信。
2、FIFO是一个设备文件,在文件系统中以文件名的形式存在,因此即使进程与创建FIFO的进程不存在血缘关系也依然可以通信,前提是可以访问该路径。
3、FIFO(first input first output)总是遵循先进先出的原则,即第一个进来的数据会第一个被读走
4.管道是半双工的,数据只能单向通信。命名管道可在同一台计算机的不同进程之间或在跨越一个网络的不同计算机的不同进程之间,支持可靠的、单向或双向的数据通信。

2)系统IPC(InterProcess Communication):
2.1)消息队列
消息队列是存放在内核中的消息链表,每个消息队列由消息队列标识符表示
与管道不同的是消息队列存放在内核中,只有在内核重启或者显式地删除一个消息队列时,该消息队列才会被真正的删除
消息队列在某个进程往一个队列写入消息之前,并不需要另外某个进程在该队列上等待消息到达
特点:
消息队列是消息的链表,具有特定的格式,存放在内存中并由消息队列标识符标识.
消息队列允许一个或多个进程向它写入与读取消息
管道和消息队列的通信数据都是先进先出的原则。
消息队列可以实现消息的随机查询**,消息不一定要以先进先出的次序读取,也可以按消息的类型读取.**比FIFO更有优势。
消息队列克服了信号承载信息量少,管道只能承载无格式字 节流以及缓冲区大小受限等缺。
目前主要有两种类型的消息队列:POSIX消息队列以及System V消息队列,System V消息队列目前被大量使用。System V消息队列是随内核持续的,只有在内核重起或者人工删除时,该消息队列才会被删除。

2.2)信号量semaphore
信号量(semaphore)与已经介绍过的 IPC 结构不同,它是一个计数器,可以用来控制多个进程对共享资源的访问。信号量用于实现进程间的互斥与同步,而不是用于存储进程间通信数据。
特点:
信号量用于进程间同步,若要在进程间传递数据需要结合共享内存。
信号量基于操作系统的 PV 操作,程序对信号量的操作都是原子操作。
每次对信号量的 PV 操作不仅限于对信号量值加 1 或减 1,而且可以加减任意正整数。
支持信号量组。

2.4)共享内存(Shared Memory)
它使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据得更新。这种方式需要依靠某种同步操作,如互斥锁和信号量等
特点:

共享内存是最快的一种IPC,因为进程是直接对内存进行存取
因为多个进程可以同时操作,所以需要进行同步
信号量+共享内存通常结合在一起使用,信号量用来互斥对共享内存的访问

3)套接字SOCKET:
socket也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同主机之间的进程通信。

挂起态

挂起状态:由于IO的速度慢于CPU的运算速度,经常出现CPU等待I/O的情况。这时OS需要将主存中的进程对换至外存。在进程行为模式中需要增加一个新的挂起(suspend)状态。当内存中所有进程阻塞时,OS可将一进程置为挂起态并交换到外存,再调入另一个进程执行。

2.7 进程和线程区别

  • 地址空间:线程共享本进程的地址空间,而进程之间是独立的地址空间。

  • 资源:线程共享本进程的资源如内存、I/O、cpu等,不利于资源的管理和保护,而进程之间的资源是独立的,能很好的进行资源管理和保护。

  • 健壮性:多进程要比多线程健壮,一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。

  • 执行过程:每个独立的进程有一个程序运行的入口、顺序执行序列和程序入口,执行开销大。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制,执行开销小。

  • 可并发性:两者均可并发执行。

  • 切换时:进程切换时,消耗的资源大,效率高。所以涉及到频繁的切换时,使用线程要好于进程。同样如果要求同时进行并且又要共享某些变量的并发操作,只能用线程不能用进程。

  • 其他:
    线程是处理器调度的基本单位,但是进程不是。

2.8 互斥锁、自旋锁、读写锁

通常有两种处理方式:一种是没有获取到锁的线程就一直循环等待判断该资源是否已经释放锁,这种锁叫做自旋锁,它不用将线程阻塞起来(NON-BLOCKING);还有一种处理方式就是把自己阻塞起来,等待重新调度请求,这种叫做互斥锁。

2.8.1 自旋锁

参考链接link
一个线程尝试去获取某一把锁的时候,如果这个锁此时已经被别人获取(占用),那么此线程就无法获取到这把锁,该线程将会等待,间隔一段时间后会再次尝试获取。这种采用循环加锁 -> 等待的机制被称为自旋锁(spinlock)。
【优缺点】

  • 自旋锁尽可能的减少线程的阻塞,这对于锁的竞争不激烈,且占用锁时间非常短的代码块来说性能能大幅度的提升,因为自旋的消耗会小于线程阻塞挂起再唤醒的操作的消耗,这些操作会导致线程发生两次上下文切换!

  • 但是如果锁的竞争激烈,或者持有锁的线程需要长时间占用锁执行同步块,这时候就不适合使用自旋锁了,因为自旋锁在获取锁前一直都是占用 cpu 做无用功

2.9 中断和系统调用的区别

异常和中断的区别

2.9 管程&临界区访问

在这里插入图片描述
人们到一家叫做计算机的银行取钱,这个银行里面就一个空窗口。最早之前,每个人需要从这个窗口爬进去取钱。这里,银行里面每一个需要取钱的人看作进程,而银行里面的钱可以看做计算机的共享资源,一般是硬件设备或一群共享变量。每个人都向窗口拥挤,场面混乱不堪。后面计算机银行不断改进,发明了一种叫ATM的机器(管程),ATM(管程)封装了钱和对外开放了一些存取钱的操作。这样一来,ATM(管程)在计算机银行的钱和客户之间担任了中介服务的角色。在一个相对封闭的屋子里面,一次只能服务一个人(让进程互斥使用)。ATM屋子里面有人的时候,其他需要依次排队使用。一个人(进程)在ATM使用的时间太长也不行,所以需要一个条件变量(condition)来约束他。条件变量可以让一个线程等待时让另一线程进入管程,这样可以有效防止死锁。

2.10 用户态切换到内核态的3种方式

a. 系统调用
这是用户态进程主动要求切换到内核态的一种方式,用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作,比如前例中fork()实际上就是执行了一个创建新进程的系统调用。而系统调用的机制其核心还是使用了操作系统为用户特别开放的一个中断来实现,例如Linux的int 80h中断。
b. 异常
当CPU在执行运行在用户态下的程序时,发生了某些事先不可知的异常,这时会触发由当前运行进程切换到处理此异常的内核相关程序中,也就转到了内核态,比如缺页异常。
c. 外围设备的中断
当外围设备完成用户请求的操作后,会向CPU发出相应的中断信号,这时CPU会暂停执行下一条即将要执行的指令转而去执行与中断信号对应的处理程序,如果先前执行的指令是用户态下的程序,那么这个转换的过程自然也就发生了由用户态到内核态的切换。比如硬盘读写操作完成,系统会切换到硬盘读写的中断处理程序中执行后续操作等。
这3种方式是系统在运行时由用户态转到内核态的最主要方式,其中系统调用可以认为是用户进程主动发起的,异常和外围设备中断则是被动的。

2.11 堆区和栈区,malloc和new的区别

参考链接link
参考连接2link
堆区和栈区,malloc和new的区别
1.堆区和栈区的区别

1.1 申请方式

堆区变量是由程序员自己申请并指明大小

栈区变量是由操作系统负责分配

1.2 生命周期

堆区变量程序员自己释放,或者等待程序结束系统自动回收(内存泄漏);

栈区变量是当申请栈区变量的大括号结束后系统自动回收

1.3 申请后系统的响应

栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。
    堆:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内 存空间中的首地址处记录本次分配的大小,这样,代码中的delete语句才能正确的释放本内存空间。另外,由于找到的堆结点的大小不一定正好等于申请的大 小,系统会自动的将多余的那部分重新放入空闲链表中。

1.4 申请大小的限制

栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。
    堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。

1.5 4.申请效率的比较

栈由系统自动分配,速度较快。但程序员是无法控制的。
    堆是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便.
2.malloc和new的区别
  2.1 本质
    malloc是一个参数为字节数,返回值为void*类型的函数,这个函数的功能是传入一个字节数,从系统堆区分配相应的内存
    将其内存首地址作为返回值返回。
    new  是一个C++中定义的关键字,后面要加类型,类型后面加小括号代表给你要申请的那块空间初始化,
    类型后面加方括号代表申请一个数组,new返回指定类型的指针
  2.2 申请失败
    malloc申请失败会返回NULL
    new申请失败会抛出bac_alloc异常,不会返回NULL
  2.3 new的影响
    new可以理解为动态创建对象,当它创建类对象时,他会调用类中的构造函数.
  2.4 删除
    提到malloc和new就要提到free和delete
    malloc申请的空间应该用free()回收
    new申请的空间应该用delete回收,如果delete的是一个类对象的话,会调用这个类的析构函数

2.12 const&define

define 与const符号变量define是预编译指令,在预编译的时候仅仅进行字符替换,预编译后符号常量就不存在了,例如define PI 3.1415926 ,编译以后就不存在PI了,所有的PI都被换成了3.1415926。 而且PI没有存储单元。而常变量const变量要占用存储单元,有变量值,只是值不能改,它有符号变量的优点

  • const定义的只读变量在程序运行过程中只有一份拷贝(因为它是全局的只读变量,存放在静态区或栈区),而#define定义的宏常量在内存中有若干个拷贝。
  • #define宏是在预编译阶段进行替换,而const修饰的只读变量是在编译的时候确定其值。
  • #define宏没有类型,而const修饰的只读变量具有特定的类型

参考链接link

2.13 static&extern

参考链接link
全局和局部的区别主要在生存周期和作用域
静态主要是相对自动变量而言,他俩的主要区别是存储位置和初始化,前者存在静态存储区且只初始化一次
【Static】
有时候希望我们调用的函数在释放的时候不消失能保留原值,这就需要定义为静态局部变量。用关键字 static声明。
看一段程序:
在这里插入图片描述

【Extern】
用extern声明外部变量
外部变量(即全局变量)是在函数的外部定义的,它的作用域为从变量定义处开始,到本程序文件的末尾。如果外部变量不在文件的开头定义,其有效的作用范围只限于定义处到文件终了。如果在定义点之前的函数想引用该外部变量,则应该在引用之前用关键字extern对该变量作“外部变量声明”。表示该变量是一个已经定义的外部变量。有了此声明,就可以从“声明”处起,合法地使用该外部变量。
在这里插入图片描述

2.14 什么是NP难问题

2.15 逆波兰表达式

参考连接link
在这里插入图片描述
逆波兰表达式的一个重要作用就是,可以将复杂的运算转换为依靠简单的操作就可以计算出结果的简单表达式。
上面这句话怎么理解昵?简单表达式是什么,简单的操作又是什么?

  • 简单的表达式
    还是拿上面的例子来说,(1+2)*(3+4),这是一个既有加法,又有乘法的复杂运算表达式,如果用数组接收,然后转换为逆波兰表达式为 [1,2,’+’,3,4,’+’,’ * '],是不是看上去就是一个简单的表达式。

  • 简单的操作
    简单的操作指的就是有了表达式之后,就要开始运算。这里就跟前面提到的数据结构之栈有关联。通过利用栈的特点,在逆波兰表达式中,遇到 ‘+’,‘-’,‘*’,‘/’ 运算符号就把栈中的前两个数值拿出来进行计算,否则将元素(非运算符号)压入栈中,如此反复,最后在栈中剩下的元素就是计算结果。

3

Linux系统区分大小写,Windows不区分

3.1 CPU执行时间

某单CPU系统中有输入和输出设备各1台,现有3个并发执行的作业,
每个作业的输入、计算和输出时间均分别为2ms、3ms和4ms,
且都按输入、计算和输出的顺序执行,则执行完3个作业需要的时间最少是 。

CPU指令

ifconfig是linux中用于显示或配置网络设备(网络接口卡)的命令
uptime显示开机时间
top显示当前系统资源使用情况,相当于任务管理器
netstat命令用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况。

I/O子系统分层

  • 用户层I/O软件:实现与用户交互的接口,用户可以直接调用在用户层提供的、与I/O操作有关的库函数,对设备进行操作。
  • 设备独立软件:用于实现用户程序与设备驱动器的统一接口、设备命令、设备保护以及设备分配与释放等,同时为设备管理和数据传送提供必要的存储空间。
  • 设备驱动程序:与硬件直接相关,负责具体实现系统对设备发出的操作指令,驱动I/O设备工作的驱动程序。
  • 中断处理程序:用于保护被中断进程的CPU环境,转入相应的中断处理程序进行处理,处理完并恢复被中断进程的现场后,返回到被中断进程。

简而言之,第1层是用户和I/O软件之间,第2层是I/O软件和设备驱动器之间,第3层是设备驱动器与硬件之间,最后1层那保存中断的

动态分区分配算法

link

计算机系统分类

  • 分时系统:将CPU的执行时间分成一个个的时间片(time slice),多用户中的每个用户轮转时间片,非常适合交互型作业;
  • 实时系统主要用于专用系统(used in dedicated application),有着非常严格的固定时间要求(well-defined fixed-time constraints) ;
  • 批处理系统主要用于大型系统,用于提高作业吞吐量(Throughout,单位时间内执行作业的数量)的系统。 批处理中基本无交互,存在两种调度: 1. Job Schedule(作业调度),即将所要做的作业放到内存上,主要负责工作的道数,属于高级调度。 2. CPU Schedule(进程调度),即在内存中CPU选择执行某个工作,属于低级调度。
  • 网络操作系统是基于计算机网络的,是在各种计算机操作系统上按网络体系结构协议标准开发的软件,包括网络管理、通信、安全、资源共享和各种网络应用。其目标是相互通信及资源共享。在其支持下,网络中的各台计算机能互相通信和共享资源。其主要特点是与网络的硬件相结合来完成网络的通信任务。
  • 1
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值