操作系统是管理计算机硬件和软件资源的计算机程序,提供一个计算机用户与计算机硬件系统之间的接口。
向上对用户程序提供接口,向下接管硬件资源。
操作系统本质上也是一个软件,作为最接近硬件的系统软件,负责处理器管理、存储器管理、设备管理、文件管理和提供用户接口。
操作系统常规可分为批处理操作系统、分时操作系统、实时操作系统。
若一个操作系统兼顾批操作
和分时
的功能,则称该系统为通用操作系统。
常见的通用操作系统有:Windows、Linux、MacOS等。
为了避免操作系统和关键数据被用户程序破坏,将处理器的执行状态分为内核态和用户态。
内核态
是操作系统管理程序执行时所处的状态,能够执行包含特权指令在内的一切指令,能够访问系统内所有的存储空间。
用户态
是用户程序执行时处理器所处的状态,不能执行特权指令,只能访问用户地址空间。
用户程序运行在用户态,操作系统内核运行在内核态。
处理器从用户态切换到内核态的方法有三种:系统调用、异常和外部中断。
并发
(concurrency):指宏观上看起来两个程序在同时运行,比如说在单核cpu上的多任务。但是从微观上看两个程序的指令是交织着运行的,指令之间交错执行,在单个周期内只运行了一个指令。这种并发并不能提高计算机的性能,只能提高效率(如降低某个进程的相应时间)。
并行
(parallelism):指严格物理意义上的同时运行,比如多核cpu,两个程序分别运行在两个核上,两者之间互不影响,单个周期内每个程序都运行了自己的指令,也就是运行了两条指令。这样说来并行的确提高了计算机的效率。
进程是资源分配的基本单位,是独立运行的单位。
进程的经典定义就是一个执行中程序的实例。系统中的每个程序都运行在某个进程的上下文(context)中。
上下文是由程序正确运行所需的状态组成的。这个状态包括存放在内存中的程序的代码和数据,它的栈、通用目的寄存器的内容、程序计数器、环境变量以及打开文件描述符的集合
进程一般由以下的部分组成:
在unix中,进程的相关操作如下。
每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到.
所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程A把数据从用户空间拷到内核缓冲区,进程B再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信。
不同进程间的通信本质:进程之间可以看到一份公共资源;而提供这份资源的形式或者提供者不同,造成了通信方式不同。
进程间通信主要包括管道、系统IPC(包括消息队列、信号量、信号、共享内存等)、以及套接字socket。
管道是一种最基本的IPC机制,作用于有血缘关系的进程之间
,完成数据传递。调用pipe系统函数即可创建一个管道。有如下特质:
管道的原理: 管道实为内核使用环形队列机制,借助内核缓冲区实现。
管道的局限性:
数据自己读不能自己写。
它使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据得更新。这种方式需要依靠某种同步操作,如互斥锁和信号量等。
它使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据的更新。这种方式需要依靠某种同步操作,如互斥锁和信号量等。
特点:
一个信号就是一条小消息,它通知进程系统中发生了一个某种类型的事件。 Linux 系统上支持的30 种不同类型的信号。 每种信号类型都对应于某种系统事件。低层的硬件异常是由内核异常处理程序处理的,正常情况下,对用户进程而言是不可见的。信号提供了一种机制,通知用户进程发生了这些异常。
先到先服务调度算法
短作业优先调度算法
优先级调度算法
时间片轮转调度算法
高响应比优先调度算法
多级队列调度算法
多级反馈队列调度算法
CPU利用率。
系统吞吐率,即单位时间内CPU完成的作业的数量。
响应时间。
周转时间:等待时间+运行时间
是指作业从提交到完成的时间间隔。从每个作业的角度看,完成每个作业的时间也是很关键
平均周转时间
带权周转时间:作业运行时间/(周转时间)
平均带权周转时间
进程在运行时有三种基本状态:就绪态、运行态和阻塞态。
各状态之间的转换:
孤儿进程: 父进程退出,子进程还在运行的这些子进程都是孤儿进程,孤儿进程将被init进程(1号进程)所收养,并由init进程对他们完成状态收集工作。
僵尸进程: 进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait 获waitpid 获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中的这些进程是僵尸进程。
线程产生的原因:进程可以使多个程序能并发执行,以提高资源的利用率和系统的吞吐量;但是其具有一些缺点:
进程原语 | 线程原语 | 描述 |
---|---|---|
fork | pthread_create | 创建新的控制流 |
exit | pthread_exit | 从现有的控制流中退出 |
waitpid | pthread_join | 从控制流中得到退出状态 |
atexit | pthread_cancel_push | 注册在退出控制流时调用的函数 |
getpid | pthread_self | 获取控制流的ID |
abort | pthread_cancel | 请求控制流的非正常退出 |
操作系统中,进程是具有不同的地址空间的,两个进程是不能感知到对方的存在的。有时候需要多个进程共同协作完成一些任务,会存在一些进程执行的先后的顺序问题,所以进程需要操作系统进行同步控制。进程同步的方法:
遇到竞争的线程同时修改同一数据或是协作的线程设置同步点的问题时,需要使用一些线程同步的方法来解决这些问题。
线程同步的方法:
进程之间地址空间不同,不能感知对方的存在,同步时需要将锁放在多进程共享的空间
。而线程之间共享同一地址空间,同步时把锁放在所属的同一进程空间
即可。
死锁是指两个或两个以上的进程在执行的过程中,因争夺资源而导致的相互等待的现象。产生死锁需要满足四个条件:
互斥条件:进程对所分配到的资源不允许其他进程访问,一次只能分配到该资源的进程访问。
不可剥夺:进程获得的资源在未使用完之前不可被其他的进程剥夺。
请求保持:进程获得一定的资源后,又对其他资源发出请求,但是该资源可能被其他进程占有,此时请求阻塞,但该进程不会释放自己已经占有的资源。
循环等待:进程发生死锁后,必然存在一个进程-资源之间的环形链。
解决死锁的方法即破坏产生死锁的四个必要条件之一:
地址空间是一个非负整数地址的有序集合。
在一个带虚拟内存的系统中,CPU 从一个有N=pow(2,n)个地址的地址空间中生成虚拟地址,这个地址空间称为虚拟地址空间(virtual address space)。
一个系统还有一个物理地址空间(physical address space),对应于系统中物理内存的M 个字节。
地址空间的概念是很重要的,因为它清楚地区分了数据对象(字节)和它们的属性(地址)。
主存中的每字节都有一个选自虚拟地址空间的虚拟地址和一个选自物理地址空间的物理地址。
虚拟内存提供了三个重要的能力:
看上去的相似增大了内存的空间,实际是主存与磁盘交互的结果
。当访问一个内存中不存在的页,并且内存已满,则需要从内存中调出一个页或将数据送至磁盘对换区,替换一个页,这种现象叫做缺页置换。
如果有多个进程要读取它们自己的那部门资源的副本,那么复制是不必要的。每个进程只要保存一个指向这个资源的指针就可以了,因为需要修改的时候,会把复制的拿分提供给进程。不过其中的复制的副本给到要修改的进程。同时其他的进程仍然共享那份没有修改过的资源。所以这就是名称的由来:在写入时进行复制。
写时复制的主要好处:如果进程从来就不需要修改资源,则不需要进行复制。
在使用虚拟内存的情况下,写时复制(Copy-On-Write)是以页为基础进行的。
实时操作系统(Real-time operating system, RTOS),又称即时操作系统,它会按照排序运行、管理系统资源,并为开发应用程序提供一致的基础。实时操作系统与一般的操作系统相比,最大的特色就是“实时性”,如果有一个任务需要执行,实时操作系统会马上(在较短时间内)执行该任务,不会有较长的延时。这种特性保证了各个任务的及时执行。
具有最高优先权的进程被低优先级进程阻塞,反而使具有中优先级的进程先于高优先级的进程执行,导致系统的崩溃。这就是所谓的优先级反转。
目前解决优先级反转有许多种方法。其中普遍使用的有2种方法:一种被称作优先级继承(priority inheritance);另一种被称作优先级极限(priority ceilings)。
select是一种多路复用技术。其收到所有输入的文件描述符,返回哪些文件有新数据。
其可以设置为阻塞或者非阻塞状态,底层采用1024位bitmap做实现,因此有文件描述符上限数。
poll是一种多路复用技术。其收到所有输入的文件描述符,返回哪些文件有新数据。
其通过链表代替了之前select的数据结构,使得其没有上限限制。
epoll是一种多路复用技术。其采用一个文件描述符管理多个输入的文件描述符,采用事件回调的方式,提高了程序运行效率。
虚拟地址由虚拟页号和页偏移两部分组成。 通过虚拟地址的页面号,首先在快表中查询是否有该映射,查询不成功,在页表中找到该页对应的物理地址。 然后通过页物理地址+页偏移,得到真实的物理地址,页偏移又叫做页内地址。
页表用于存储虚拟地址中的虚拟页面号和物理页面号的映射关系。 除此之外,有些页的读写有限制,页表也通过其他存储位,标记该页访问位,是否在内存中(可能被页面置换出去了)等等。
多级页表用于减少内存的占用。以二级页表为例,虚拟地址被分为DIR,PAGE和offset三部分,通过顶级页表和DIR,寻找到该二级页表的起始位置,再通过二级页表的起始位置和PAGE,找到页物理地址,最后加上页偏移,即可得到最终的物理地址。
快表也称为页表高速缓存。其会存储一定数量的页表项,以此加快虚拟地址到物理地址的映射速度。
MMU即内存管理单元,该硬件负责处理虚拟地址到物理地址的转化工作。快表也存储在MMU上。
进程组即多个进程的集合,进程组有一个组长,组长进程的PID等于进程组的PGID。
协程,即用户态线程。我们知道,在Linux下,线程有PCB,然后可以占用时间片去调度,但是在用户态线程中,该线程的执行不由内核做调度,由用户自己实现。
可以这么理解,在用户进程A中,再实现了个调度器,调度用户线程,这些线程不像之前的线程,内核是感知不到的,它们只能感知到A的存在,用户态线程之间时间片只能争取内核分给进程A的时间片。
在同步方式上,可以分为同步IO和异步IO。
在阻塞方式上,可以分为阻塞IO和非阻塞IO。
阻塞和非阻塞描述的是调用方在获取消息过程中的状态,阻塞等待还是立刻返回。
阻塞io指的是调用方在获取消息的过程中会挂起阻塞,知道获取到消息。
非阻塞io指的是调用方在获取io的过程中会立刻返回而不进行挂起。
同步和异步描述的是一种消息通知的机制,主动等待消息返回还是被动接受消息,同步io指的是调用方通过主动等待获取调用返回的结果来获取消息通知。
异步io指的是被调用方通过某种方式(如,回调函数)来通知调用方获取消息。
信号驱动IO即,在内核中注册一个回调函数,当某个事件发生时,内核使用信号,使程序运行回调函数。
IO多路复用,即单线程可以监控多个文件描述符是否能进行IO操作的能力。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。