操作系统的五大功能分别是处理器管理、存储器管理、设备管理、文件管理和作业管理。
按下开机键后,电脑都干了些什么?
link
作者:知乎用户
链接:https://www.zhihu.com/question/22364502/answer/21492367
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
一、第一阶段:BIOS上个世纪70年代初,“只读内存”(read-only memory,缩写为ROM)发明,开机程序被刷入ROM芯片,计算机通电后,第一件事就是读取它。这块芯片里的程序叫做"基本輸出輸入系統"(Basic Input/Output System),简称为BIOS。
二、第二阶段:主引导记录BIOS按照"启动顺序",把控制权转交给排在第一位的储存设备。
这时,计算机读取该设备的第一个扇区,也就是读取最前面的512个字节。如果这512个字节的最后两个字节是0x55和0xAA,表明这个设备可以用于启动;如果不是,表明设备不能用于启动,控制权于是被转交给"启动顺序"中的下一个设备。这最前面的512个字节,就叫做"主引导记录"(Master boot record,缩写为MBR)。
三、第三阶段:硬盘启动
这时,计算机的控制权就要转交给硬盘的某个分区了,这里又分成三种情况。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现在大多数宏内核都加了一点微内核的思想。
【并发】两个或多个事件同一时间间隔内发生
【并行】需要多流水线或多处理机环境,
【同步】
【异步】
是指进程不需要一直等下去,而是继续执行下面的操作,不管其他进程的状态。当有消息返回时系统会通知进程进行处理,这样可以提高执行的效率。
特点:
【同步与异步的优缺点】
同步可以避免出现死锁,读脏数据的发生。一般共享某一资源的时候,如果每个人都有修改权限,同时修改一个文件,有可能使一个读取另一个人已经删除了内容,就会出错,同步就不会出错。但,同步需要等待资源访问结束,浪费时间,效率低。
异步可以提高效率,但,安全性较低。
同步与异步同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication)所谓同步,就是在发出一个调用时,在没有得到结果之前,该调用就不返回。但是一旦调用返回,就得到返回值了。换句话说,就是由调用者主动等待这个调用的结果。
而异步则是相反,调用在发出之后,这个调用就直接返回了,所以没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在调用发出后,被调用者通过状态、通知来通知调用者,或通过回调函数处理这个调用。
【阻塞&非阻塞】
阻塞与非阻塞阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态.阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。
还是上面的例子,你打电话问书店老板有没有《分布式系统》这本书,你如果是阻塞式调用,你会一直把自己“挂起”,直到得到这本书有没有的结果,如果是非阻塞式调用,你不管老板有没有告诉你,你自己先一边去玩了, 当然你也要偶尔过几分钟check一下老板有没有返回结果。
1)管道
1. 匿名管道
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可将一进程置为挂起态并交换到外存,再调入另一个进程执行。
地址空间:线程共享本进程的地址空间,而进程之间是独立的地址空间。
资源:线程共享本进程的资源如内存、I/O、cpu等,不利于资源的管理和保护,而进程之间的资源是独立的,能很好的进行资源管理和保护。
健壮性:多进程要比多线程健壮,一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。
执行过程:每个独立的进程有一个程序运行的入口、顺序执行序列和程序入口,执行开销大。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制,执行开销小。
可并发性:两者均可并发执行。
切换时:进程切换时,消耗的资源大,效率高。所以涉及到频繁的切换时,使用线程要好于进程。同样如果要求同时进行并且又要共享某些变量的并发操作,只能用线程不能用进程。
其他:
线程是处理器调度的基本单位,但是进程不是。
通常有两种处理方式:一种是没有获取到锁的线程就一直循环等待判断该资源是否已经释放锁,这种锁叫做自旋锁,它不用将线程阻塞起来(NON-BLOCKING);还有一种处理方式就是把自己阻塞起来,等待重新调度请求,这种叫做互斥锁。
参考链接link
一个线程尝试去获取某一把锁的时候,如果这个锁此时已经被别人获取(占用),那么此线程就无法获取到这把锁,该线程将会等待,间隔一段时间后会再次尝试获取。这种采用循环加锁 -> 等待的机制被称为自旋锁(spinlock)。
【优缺点】
自旋锁尽可能的减少线程的阻塞,这对于锁的竞争不激烈,且占用锁时间非常短的代码块来说性能能大幅度的提升,因为自旋的消耗会小于线程阻塞挂起再唤醒的操作的消耗,这些操作会导致线程发生两次上下文切换!
但是如果锁的竞争激烈,或者持有锁的线程需要长时间占用锁执行同步块,这时候就不适合使用自旋锁了,因为自旋锁在获取锁前一直都是占用 cpu 做无用功
异常和中断的区别
人们到一家叫做计算机的银行取钱,这个银行里面就一个空窗口。最早之前,每个人需要从这个窗口爬进去取钱。这里,银行里面每一个需要取钱的人看作进程,而银行里面的钱可以看做计算机的共享资源,一般是硬件设备或一群共享变量。每个人都向窗口拥挤,场面混乱不堪。后面计算机银行不断改进,发明了一种叫ATM的机器(管程),ATM(管程)封装了钱和对外开放了一些存取钱的操作。这样一来,ATM(管程)在计算机银行的钱和客户之间担任了中介服务的角色。在一个相对封闭的屋子里面,一次只能服务一个人(让进程互斥使用)。ATM屋子里面有人的时候,其他需要依次排队使用。一个人(进程)在ATM使用的时间太长也不行,所以需要一个条件变量(condition)来约束他。条件变量可以让一个线程等待时让另一线程进入管程,这样可以有效防止死锁。
a. 系统调用
这是用户态进程主动要求切换到内核态的一种方式,用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作,比如前例中fork()实际上就是执行了一个创建新进程的系统调用。而系统调用的机制其核心还是使用了操作系统为用户特别开放的一个中断来实现,例如Linux的int 80h中断。
b. 异常
当CPU在执行运行在用户态下的程序时,发生了某些事先不可知的异常,这时会触发由当前运行进程切换到处理此异常的内核相关程序中,也就转到了内核态,比如缺页异常。
c. 外围设备的中断
当外围设备完成用户请求的操作后,会向CPU发出相应的中断信号,这时CPU会暂停执行下一条即将要执行的指令转而去执行与中断信号对应的处理程序,如果先前执行的指令是用户态下的程序,那么这个转换的过程自然也就发生了由用户态到内核态的切换。比如硬盘读写操作完成,系统会切换到硬盘读写的中断处理程序中执行后续操作等。
这3种方式是系统在运行时由用户态转到内核态的最主要方式,其中系统调用可以认为是用户进程主动发起的,异常和外围设备中断则是被动的。
参考链接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的是一个类对象的话,会调用这个类的析构函数
define 与const符号变量define是预编译指令,在预编译的时候仅仅进行字符替换,预编译后符号常量就不存在了,例如define PI 3.1415926 ,编译以后就不存在PI了,所有的PI都被换成了3.1415926。 而且PI没有存储单元。而常变量const变量要占用存储单元,有变量值,只是值不能改,它有符号变量的优点
参考链接link
参考链接link
全局和局部的区别主要在生存周期和作用域
静态主要是相对自动变量而言,他俩的主要区别是存储位置和初始化,前者存在静态存储区且只初始化一次
【Static】
有时候希望我们调用的函数在释放的时候不消失能保留原值,这就需要定义为静态局部变量。用关键字 static声明。
看一段程序:
【Extern】
用extern声明外部变量
外部变量(即全局变量)是在函数的外部定义的,它的作用域为从变量定义处开始,到本程序文件的末尾。如果外部变量不在文件的开头定义,其有效的作用范围只限于定义处到文件终了。如果在定义点之前的函数想引用该外部变量,则应该在引用之前用关键字extern对该变量作“外部变量声明”。表示该变量是一个已经定义的外部变量。有了此声明,就可以从“声明”处起,合法地使用该外部变量。
参考连接link
逆波兰表达式的一个重要作用就是,可以将复杂的运算转换为依靠简单的操作就可以计算出结果的简单表达式。
上面这句话怎么理解昵?简单表达式是什么,简单的操作又是什么?
简单的表达式
还是拿上面的例子来说,(1+2)*(3+4),这是一个既有加法,又有乘法的复杂运算表达式,如果用数组接收,然后转换为逆波兰表达式为 [1,2,’+’,3,4,’+’,’ * '],是不是看上去就是一个简单的表达式。
简单的操作
简单的操作指的就是有了表达式之后,就要开始运算。这里就跟前面提到的数据结构之栈有关联。通过利用栈的特点,在逆波兰表达式中,遇到 ‘+’,‘-’,‘*’,‘/’ 运算符号就把栈中的前两个数值拿出来进行计算,否则将元素(非运算符号)压入栈中,如此反复,最后在栈中剩下的元素就是计算结果。
Linux系统区分大小写,Windows不区分
某单CPU系统中有输入和输出设备各1台,现有3个并发执行的作业,
每个作业的输入、计算和输出时间均分别为2ms、3ms和4ms,
且都按输入、计算和输出的顺序执行,则执行完3个作业需要的时间最少是 。
ifconfig是linux中用于显示或配置网络设备(网络接口卡)的命令
uptime显示开机时间
top显示当前系统资源使用情况,相当于任务管理器
netstat命令用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况。
简而言之,第1层是用户和I/O软件之间,第2层是I/O软件和设备驱动器之间,第3层是设备驱动器与硬件之间,最后1层那保存中断的
文章浏览阅读755次。Gradle介绍Gradle是一个现代的项目构建工具。如果你使用过Maven的话,就会明白项目构建工具的优点。但是Maven有一些缺点。由于Maven使用的是xml语言描述项目,虽然描述非常清晰,但是如果在pom.xml中配置一些插件的话,就会出现一个非常冗长的pom.xml,严重影响可读性以及pom.xml的维护性。Gradle使用的是DSL语言,所以描述非常简洁。比如,我们要在项目中添加Hibe_gradle二进制和完整
文章浏览阅读1.8k次。多场景、多目标同时监控,内存稳定,显示流畅_osgearth 雷达波
文章浏览阅读408次。1051.Pop Sequence (25) Given a stack which can keep M numbers at most. Push N numbers in the order of 1, 2, 3, …, N and pop randomly. You are supposed to tell if a given sequence of numbers is a pos_1051 pop sequence
文章浏览阅读4.2k次,点赞9次,收藏63次。最近在工作中经常用到回调函数callback,总结一下回调函数的定义和用法_c语言callback回调函数
文章浏览阅读7.3k次,点赞5次,收藏25次。websploit安装websploitroot@kali2:~# apt-get install websploitroot@kali2:~# websploitdb d8b db d88888b d8888b. .d8888. d8888b. db .d88b. d888888b d888888b 88 I8I 88 88' 88 `8D ..._kali websploit
文章浏览阅读199次。原文链接:点击打开链接007们所依赖的伪造身份正在被他们自己曾经引以为豪的高科技秘密武器所识别。他们的快速反应能力、强大的心理素质也注定无法与正迅速成长的AI鉴别力匹敌。美国中央情报局(CIA,简称中情局)现在已经意识到了这一点。“现在中情局的主要对手不是外国特工,而是机器。”中情局负责技术开发的副主任Dawn Meyerriecks,最近在佛罗里达的一个情报会议上无奈表示。中情局面临的这一困境来..._ai和007
文章浏览阅读671次。在 Windows 10 的最新内测版本中(Windows 10 Insider Preview Build 20150),微软为WSL 的安装和内核升级新增了两个命令,分别是wsl.exe--install和wsl.exe--update。Windows 10 用户可通过命令行工具或Windows Terminal 运行上述命令。在尚未开启WSL 的机器上运行wsl.exe--install命令将会启用 WSL 可选组件和虚拟机平台可选组件,并提示重启机器。通过此方式安装 WSL 会将W..._wsl.exe
文章浏览阅读1.4k次。 画皮SAP——世界最大管理软件公司的中国真相《计算机世界》报记者 陈淑娟你知道SAP吗?哦,知道,满大街都是嘛,S-P-A,SPA。……做出上述回答的是一个普通的消费者。这就是SAP在中国的现状: 它不像微软、IBM 那样在大众中拥有“准确”的品牌认知度。但在IT业内,它又拥有丝毫不逊于前者的广泛认可度,提起SAP,人们肃然起敬。在CIO那里_sap软件卖给大公司是永久使用的吗
文章浏览阅读502次。网络管理命令ping 方式作用:ping命令主要的功能是用来检测网络的连通情况和分析网络速度常用选项:-t#持续ping,不中断-c#ping的包数-i#间隔时间-f#极速检测netstat 方式作用:打印网络连接,路由表、tcp11中状态常用选项:-l#只显示监听套接字-n..._在线linux调试地址
文章浏览阅读106次。嵌入式行业需要什么样的技术人才?仔细观察各种招聘的岗位要求吧,无非是两方面。(1)通用要求比如什么学历,多少年工作经验,有创新精神,抗压能力强,吃苦耐劳,善于沟通,态度认真等。(2)专业要求这个可真的多了去了,但无非就是各种精通。什么精通控制理论,精通电路设计,精通各种硬件驱动开发,精通linux内核以及裁剪,精通C/C++/Java语言,精通DSP,精通ARM,精通什么linux/ecos/ucos/wince/VxWorks,精通嵌入式数据库,..._入行嵌入式的收获
文章浏览阅读442次。if语句简单,其原理我不必赘述。 if语句小代码如下所示://if循环语句public class IfLoop { public static void main(String[] args) { double i = 6 * Math.random(); double j = 6 * Math.random(); double k = 6 * Ma_if语句属于java语言中的控制语句?
文章浏览阅读1.1k次。转自:https://www.jianshu.com/p/b267c5cedfa90.682017.08.28 09:39:16字数 1,959阅读 11,9481.1PAD作为USB Device设备USB Device的功能很丰富,其支持的协议越来越多包括:MTP、ADB、rndis、mass storage、accessory、audio_source、CDROOM等。1.1.1代码简单分析在代码中涉及到的目录主要有:1.frameworks/base/services/jav_/dev/bus/usb