操作系统结构
操作系统的目标:
-
方便使用
-
高效
多任务是多程序的升级版本,不仅像多程序要求的那样、程序挂起驻留在内存中等待CPU,而且要实现CPU时间片的及时分配,以响应用户的交互
DOS的存储管理是很简单地将内存作为一个链表,实现了简单的设备管理,没有进程,所以不是现代操作系统
操作系统的其他特征:
操作系统要处理软件的错误,很好地实现软件管理
用户态和内核态:https://www.cnblogs.com/jiading/articles/12247594.html
- 用户态无法访问内核态的资源,这防止了黑客通过应用程序攻击操作系统
- 内核态可以通过一定的方式访问用户态的资源
切换的过程对于性能的影响比较大
系统调用
http://c.biancheng.net/view/1195.html
什么是系统调用
系统调用(system call)提供操作系统服务接口。这些调用通常以 C 或 C++ 编写,当然,对某些底层任务(如需直接访问硬件的任务),可能应以汇编语言指令编写。
所有UNIX系统的API都符合POSIX API
Java可以通过使用虚拟机的API来避开调用操作系统的API,从而实现跨平台
程序员编程时调用API,被调用的文件才是在操作系统上的具体功能实现
系统调用实例:
来源:https://zhidao.baidu.com/question/2051896315220942947.html
linux系统中,进程进行系统调用进入内核态时,是该进程本身进入内核态还是操作系统新开了一个内核线程?
系统调用实际上是应用程序在用户空间激起了一次软中断,在软中断之前要按照规范,将各个需要传递的参数填入到相应的寄存器中。软中断会激起内核的异常处理,此时就会强制陷入内核态(此时cpu运行权限提升),软中断的异常处理函数会根据应用软件的请求来决定api调用是否合法,如果合法选择需要执行的函数,执行完毕后软中断会填入返回值,安全地降低cpu权限,将控制权交还给用户空间。所以内核提供的api调用,你完全可以认为就是一个软件包,只不过这些软件包你不能控制,只能请求内核帮你执行。
因为内核态和用户态属于同一个进程,所以不存在同一进程内内核态阻塞用户态这种说法,只能是进程是否在内核态执行了阻塞操作而被阻塞。
关于标准库和API的两个知识:
-
https://www.zhihu.com/question/46763480
C标准库是在操作系统API上加入独特的算法封装成标准接口的库,使用C标准库可以屏蔽底层实现细节,比如fopen这样的函数,在Windows上通过调用CreateFileEx实现,在linux上通过调用open系统调用实现。不仅是包装,还在上层使用独特的算法提供了用户态缓冲区的功能。
系统程序
随着操作系统一并发布的C标准库、编译工具等,以便于软件的开发
操作系统结构
层次逐渐发展,越来越新
简单结构
resident system program(常驻内存软件)是DOS的主体
层次化结构
目前主流的操作系统都采用这种层次化结构
微内核
思想是尽量把内核的功能移出到用户态,尽可能减小内核态
现在有了,但是不流行
Linux 为什么还要坚持使用宏内核?
模块
例如驱动程序,可以动态的装入和卸载
采用了面向对象的方式