Stanford:
CS140使用操作系统概念
CS162使用操作系统:设计与原理
基础
操作系统发展史
原始操作系统
在原始操作系统中,程序更多的是与硬件进行绑定,是一个无保护的标准服务库(为了方便用户或开发者使用而提供的一系列标准服务、函数或API)。
系统一次只能运行一个程序
多任务处理
系统可以同时运行多个进程,当一个进程阻塞(等待硬盘,网络或用户输入)block时,运行另一个进程。
系统对进程操作不当会出现的问题:
- 死锁,一个进程永远占据CPU资源
- 使其他进程的私有资源遭到破坏
多用户操作系统
通过保护机制来决定系统为不同的用户提供什么资源,以及实时为每个用户实际分配所需的硬件资源。
可能出现的问题:
- 当某个用户恶意占有过多的CPU资源时,其他用户无法使用,或被分配较少CPU资源
- 总内存使用量大于机器RAM。
- 避免因需求增加而导致响应时间的超线性增加
保护机制:
通过设置抢占来避免发生死锁。通过介入和调解来控制程序和管理程序(其中使用了一种表格的数据结构,该表格包含有资源标识符、访问权限、时间限制,并发访问等其他策略)。利用角色管理,来控制权限和实际运行环境。
CPU抢占
防止CPU被独占的机制。
例如:内核将定时器编程为每10ms中断一次。
典型的操作系统结构
操作系统被分为用户态和内核态运行环境:
- 程序在用户级的进程中实例化运行
- 而操作系统内核需要在特权模式下运行:
- 创建/删除进程
- 对硬件进行访问
系统调用
通俗:是用户程序能够调用系统提供的某些操作的接口。
官方解释:是操作系统提供给用户程序的一组接口,允许用户程序在运行过程中请求操作系统执行特权的操作。
比如:文件流的读写,进程的创建和删除,网络通信等操作
该功能及确保了用户的进程可访问系统提供的底层功能,又保障了操作系统的安全和稳定性。
通常来说,系统调用涉及以下相关概念:
- 系统调用接口: 操作系统通过一组预定义的接口(通常是函数或指令)来暴露系统调用功能给用户程序。这些接口由操作系统提供,用户程序通过调用这些接口来请求特定操作。
- 用户态和内核态: 大多数操作系统采用特权级别(例如用户态和内核态)来区分用户程序和操作系统的执行权限。用户态下运行的用户程序只能执行受限操作,而系统调用需要从用户态切换到内核态,以便操作系统执行特权操作。
- 上下文切换: 当用户程序发起系统调用时,操作系统需要进行上下文切换,将用户程序的执行环境切换到内核态。这包括保存用户程序的状态、加载内核的状态,并执行所请求的系统调用。完成后,操作系统再将控制返回给用户程序。
- 返回结果: 用户程序在执行系统调用时,请求操作系统完成某个任务,操作系统执行后会将结果返回给用户程序。这个结果可能是执行成功与否的标志,以及相关数据或状态信息。
- 权限和安全性: 系统调用允许用户程序访问操作系统提供的底层功能,但操作系统会对这些功能进行权限管理。操作系统会检查用户程序的请求是否合法,以及用户是否有足够的权限执行该操作。
Unix文件系统调用
-
Applications “open” files (or devices) by name
- I/O happens through open files
-
int open(char path, int flags, /int mode*/...);
-
flags: O_RDONLY, O_WRONLY, O_RDWR
-
O_CREAT: create the file if non-existent
-
O_EXCL: (w. O_CREAT) create if file exists already
-
O_TRUNC: Truncate the file
-
O_APPEND: Start writing from end of file
-
mode: final argument with O_CREAT
-
-
Returns file descriptor—used for all I/O to file
该系统调用发生错误时,返回:-1:打开失败;-2:没有这样的文件或目录;-13:权限被拒绝
使用perror函数打印人类可读类型的错误信息。
文件描述符(file description)
文件描述符,是指操作系统对某个文件进行操作时分配的唯一标识符。用于区别其他正在操作的文件。文件描述符仅描述已打开的文件。
而在Unix的存储系统中,文件的inode号是文件的唯一标识。这个唯一标识用于在文件系统层级上定位和管理文件。
- read:返回读取的字节数
- write:返回写入的字节数,错误时返回-1
- off_t lseek:0开始,1当前,2结束
- close
文件描述符由进程继承:即当一个进程创建另一个进程时,默认情况下具有相同fd。