高级操作系统
高级操作系统
第一章
只有遵循XSI的实现才能称为unix系统。
由于UNIX是用C语言编写,因此它是可移植的。
它是一个良好的、通用的、多用户、多任务、分时操作系统。
我们通常将UNIX的内核和核外程序统称为UNIX系统,而将内核部分叫做UNIX 操作系统。
核心主要组成部分是:进程管理、文件管理、存储管理和设备管理。
第二章
操作系统的启动经历三个过程:
-
系统引导:
上电、BIOS检查系统硬件;
加载引导程序,将操作系统内核加载到内存中并将控制权交给它。
-
核心初始化
初始化系统的硬件设备、初始化内存管理子系统、加载必要设备驱动程序
进程0没有代码段,它就是一个进程数据结构。进程0创建进程1
-
系统的初始化
进程1执行系统调用exec,激活交换分区,检查磁盘,加载硬件模块,启动运行级别守护进
程。用户会话管理(创建getty进程,等待用户注册,检查用户登录口令,建立shell进程。当
shell进程结束,进程1执行系统调用,再产生新的getty程序)init为每一条通信线路创建一个
getty进程来实现多用户方式。
unix对文件数据一致对待:程序把所有的文件内容都当作无格式的字节流看待。
- 什么是Shell ?
shell是一个命令解释器,它可实现启动、挂起、停止,甚至编写程序;
shell是用户与操作系统核心之间的接口;是包围操作系统内核的外壳的软件。
第三章
-
不带缓存的I/O(unbuffered I/O):不带缓存指的是每个read和write都调用内核中的一个系统调用。
-
带缓冲的I/O:就是系统内核对I/O设置一个缓冲区,用户程序操作的是这个缓冲区。系统内核根据情况来刷新缓冲区
-
文件描述符:对于内核而言,所有打开文件都由文件描述符引用,文件描述符是一个非负整数。当打开一个现存文件或创建一个新文件时,内核向进程返回一个文件描述符。
-
open函数的flag参数:
FLAG参数:(有且只有一个)
O_RDONLY ;只读打开。0
O_WRONLY ;只写打开。1
O_RDWR ;读、写打开。2
open 返回的文件描述符一定是最小的未被使用的描述符。
close函数:当一个进程终止时,它所有的打开文件都由内核自动关闭。
- lseek函数:
文件位移量可以大于文件的当前长度,在这种情况下,对该文件的下一次写将延长该文件,并在文件中构成一个空洞,位于文件中但没有写过的字节都被读为0。空洞不占用硬盘空间。
write函数:出错的一个常见原因是:磁盘已写满,或者超过了对一个给定进程的文件长度限制。
- 预读技术:
预测即将访问的页面,并提前把它们批量的读入缓存。优点:I/O合并;延迟隐藏;
UNIX支持在不同进程间共享打开文件。
内核使用了三种数据结构,它们之间的关系决定了在文件共享方面一个进程对另一个进程可能产生的影响。
文件描述符标志和文件状态标志(只读...)在作用范围方面的区别:
前者只用于一个进程的一个描述符后者则适用于指向该给定文件表项的任何进程中的所有描述符。
- 原子操作:
指的是由多步组成的操作,如果该操作原子地执行,则或者执行完所有步,或者一步也不执行,不
可能只执行所有步的一个子集。
功能级原子操作:通过更高级别的抽象或函数(如锁、信号量、条件变量)来实现原子性。通常由
操作系统或编程语言库提供,适用于多线程或多进程编程。
指令级原子操作:通过底层硬件指令直接实现原子性。由处理器指令集支持,确保操作在硬件层面上是原子的。
-
dup和dup2:复制一个现有的文件描述符
由dup返回的新文件描述符一定是当前可用文件描述符中的最小数值。
新的和老的共享同一个文件表项,与oldfd指向同一个文件,共享所有读写指针,和各项权限
或标志位。
sync、fsync、fdatasync(考选择,区分清除)
Sync,只将修改过的块缓冲区排入写队列,直接返回,不等待实际写磁盘操作结束
Fsync,只对单一文件起作用,等待实际写磁盘操作结束,再返回。数据+文件属性
Fdatasync,只对单一文件起作用,等待实际写磁盘操作结束,再返回。数据
第四章
引导块:占据文件系统的开头,起引导或初启操作系统的作用。又称自举块
超级块:存放文件系统的标题信息, 包括文件系统大小、i节点表大小、数据区的使用状况等.
索引节点表:其中的每一个表项存放一个文件的静态信息
数据块:包含文件数据与管理数据
目录是一种特殊文件, 其文件内容是该目录中的目录项
同文件系统下文件重命名(移动):文件内容未移动,只需构造一个指向现有i节点的新目录项,
并解除与旧目录项的链接。任何一个叶目录的链接计数总是2:命名目录与目录中的.项。父目录中
的每一个子目录会使该父目录的链接计数增1。
- 软链接和硬链接
软链接又叫符号链接,类似快捷方式,里面包含目标文件的路径。
硬链接为文件开设一个新的目录项,硬链接与原文件指向同一个inode
- 目录执行权限位
用名字打开任一类型的文件时,对该名字中包含的每一个目录,包括它可能隐含
的当前工作目录都应具有执行许可权。目录执行许可权位常被称为搜索位。
只有root能改变进程的实际用户id。
chmod u+s filename 设置SUID位
chmod u-s filename 去掉SUID设置
chmod g+s filename 设置SGID位
chmod g-s filename 去掉SGID设置
- 文件访问权限
文件的读许可权决定了我们是否能够打开该文件进行读操作。
文件的写许可权决定了我们是否能够打开该文件进行写操作。
在open函数中对文件指定O_TRUNC标志,须对该文件有写许可权。
若要在一个目录中创建新文件,须对该目录具有写许可权和执行许可权。
为了删除一个文件,必须对包含该文件的目录具有写许可权和执行许可权。对该文件本身则不需要有读、写许可权。
如果用exec函数执行某个文件,必须对该文件具有执行许可权。
当用open函数打开一个文件时,内核以进程的有效用户ID和有效组ID为基础执行其存取许可权测
试。
access函数是按实际用户ID和实际组ID进行存取许可权测试的。
- unlink函数:
因为删除的是目录项,如果有其他目录项存在,这个文件还是存在。
只有当连接计数达到0时,该文件的内容才可被删除。另一个条件也阻止删除文件的内容——只要
有进程打开了该文件,其内容不能删除。
第五章
- 标准I/O和文件I/O的区别
标准I/O (Standard I/O):提供高级缓冲I/O接口,易于使用,适用于大多数常见的文件操作场景。操作字符流,针对控制台。
文件I/O (File I/O):提供底层无缓冲I/O接口,适用于需要高性能和精细控制的场景。操作文件描述符。
读写调用是在内核缓冲区和进程缓冲区之间进行的数据复制
- 三个流
对一个进程预定义了三个流,它们自动地可为进程使用:标准输入、标准输出和标准出错。标准
FILE 对象: stdin, stdout, stderror 与文件描述符STDIN_FILENO, STDOUT_FILENO 和
STDERR_FILENO 所引用的文件相同
缓冲目的:尽可能减少read和write调用的数量
- 缓冲类型:
1)普通文件:完全缓冲
2)终端设备:行缓冲
3)错误处理stderr:不带缓冲
第七章
内核使程序执行的唯一方法是调用一个exec函数。进程自愿终止的唯一方法是显式或隐式地(调用
exit )调用_ exit。进程也可非自愿地由一个信号使其终止。
- return和exit的区别
Return是语言级别,调用堆栈的返回。
Exit是系统调用级别,表示进程的结束。直接退出。
main函数结束时也会隐式地调用exit函数。exit函数运行时首先会执行由atexit()函数登记的函数,
然后会做一些自身的清理工作,同时刷新所有输出流、关闭所有打开的流并且关闭通过标准I/O函
数tmpfile()创建的临时文件。
- 存储空间的典型分布:
静态存储区:用于存储全局变量和静态变量,它们的生命周期贯穿整个程序的执行周期。
堆区:用于动态内存分配,通过malloc、calloc、realloc等函数进行管理。
栈区:用于存储局部变量和函数调用信息,当函数调用结束时,栈上的内存自动释放。
在更改资源限制时,须遵循下列三条规则:
(1) 任何一个进程都可将一个软限制更改为小于或等于
其硬限制。
(2) 任何一个进程都可降低其硬限制值,但它必须大于或等于其软限制值。这种降低对
普通用户而言是不可逆反的。
(3) 只有超级用户可以提高硬限制
第八章
fork函数:
fork:创建一个子进程。函数调用1次,返回两次。
子进程的返回值是0
父进程的返回值是新子进程的进程ID
fork和vfork
Vfork:不复制父进程的全部地址空间。而子进程借用父进程的地址空间。
vfork会改变父进程中相关变量的值,而fork则不会改变父进程变量的值。
vfork保证子进程先运行, vfork创建新进程时,父进程将被暂时阻塞,在它调用exec或exit之后父进程才可能被调度运行。
wait 和 waitpid的区别:
在子进程终止前,wait使调用者阻塞,而waitpid有一选择项,可使调用者不阻塞。
如果一个子进程已经终止,是一个僵死进程,则wait立即返回并取得该子进程的状态,否则wait使
其调用者阻塞直到一个子进程终止。
waitpid等待指定的子进程终止。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!