二、核心导言

UNIX操作系统的体系结构

“文件”和“进程”是UNIX系统的两个最基本实体和中心概念,UNIX系统的所有操作都是以这两者为基础的。
整个系统核心由以下五个部分组成:
① 文件系统:
文件管理和存储空间管理(节点和空间管理)
②I/O设备管理:
核心→缓冲→块设备(随机存取设备)
核心→原始设备(raw设备,字符设备,裸设备)
③ 进程控制:
进程的调度、同步和通讯
④ 存贮管理:
在主存与二级存储之间对程序进行搬迁
⑤ 时钟管理:
把cpu的时间分配给当前最高优先权的进程。
在这里插入图片描述

系统概念

文件系统

索引节点(index node——inode)

inode特征:
• 文件的内部名称(或代号),方便机器操作;
• 每个文件都有一个且只有一个inode与之对应;
• inode存放文件的静态参数:存放地点、所有者、文件类型、存取权限、文件大小等;
• 每个文件都可以有多个名字,但都映射到同一个inode上;
• 各inode之间以inode号相区别

链结(link) ——对应命令名 ln

• 一个文件可有多个名字,多个名字都对应同一个文件i节点,每个名字就是该文件节点的一个链结;
• 一个普通文件的名字个数,就是该文件的链结数;
• 每个链接名可以放在不同的目录下(同一个文件系统下);
• 删除一个链接名时,文件链接数减一。如链接数不为零,则文件(节点)仍然存在。
使用文件链结的目的:
①方便用户的使用习惯,如“列目录”,可用ls、dir、list、lc等;
②误删文件时可补救,又不多占空间。abc和xyz具有相同的i结点号;
③减少移植应用程序时,因使用指定位置的文件,而拷贝该文件到指定位置去的麻烦。

符号链结(symbol link)——对应命令名 ln -s

• 给文件的名字再取一个名字,而不是给文件节点再取一个名字。
• 链接的是“符号”而不是文件,因此“符号”可以是不存在的文件,即无意义的字符串。
• abc和xyz具有不同的inode号,xyz的内容是它所指向的名字的字符串,大小是字符串长度为3字节。
• “普通链结”中各名字必须在同一文件系统中,“符号链结” 可在不同的文件系统中。

活动i节点表(索引节点表)—— inode表

在内存中存放当前要使用的文件inode的表(或称为活动i节点表),表中的每一个表项对应一个当前正被使用的文件的状态信息。这样要使用(打开)同一个文件的进程不必再到盘上去寻找了,(共享!)

用户打开文件表(或称用户文件描述符表)

在系统中每一个进程都有一个描述该进程的数据结构user(类似于描述文件的i节点),在user中有一个数组,存放一组指针指向系统打开文件表中该进程打开的文件所对应的表项。
struct file *u_ofile[NOFILE]
NOFILE 为每个进程最多可同时打开的文件数,这与系统中的进程数和内存大小以及交换区大小等有关系,一般为20~100。这个u_ofile数组就是该进程的用户打开文件表。

系统打开文件表(file表)

系统打开文件表主要存放被打开文件的读写指针。因为一个进程在一个时间片内可能读写不完所需内容,需要在下一个时间片继续从上一个时间片结束时的读写位置开始读写,故在进程生存期间应保持一读写指针。此外file表中还存放被打开文件的动态信息:如文件状态、引用计数(当前使用该文件的进程数)等。

为什么要单独设立一个file表来存放读写指针呢?

由于可能有多个进程要共享一个被打开文件的inode,而每个进程的读写指针都不相同,故不能放在inode表中。另一方面,要使不同进程的打开文件指针(文件描述符)或同一进程的不同打开文件指针能够共享一个打开文件指针(协同操作),就不能把读写指针放进某一个进程的用户打开文件表中。因此只能在用户打开文件表和活动inode表之外再建立一个系统打开文件表(file表)来存放读写指针。

UNIX操作系统中共享活动文件的方法:

在内存中某个活动文件的副本只有一个,不同的进程采用不同的指针指向这文件的副本。由于任一时刻只有一个进程在运行(微观上看),故该文件也只要求内存中有一个副本即可,只是各个进程有自己的读写指针而已。这是在UNIX系统中共享文件(包括用户文件和系统文件)的主要方法。对其它资源的共享采用的是与之相似的另外几种方法。

进程

相关概念:

映像——程序以及与动态执行该程序有关的各种信息的集合(类似于历史档案)。它包括存储器映象、通用寄存器映像,地址映射空间、打开文件状态等。
进程——对映像的执行。对映像的执行也就是一个程序在虚拟机上动态执行的过程。可执行文件的构成:
进程是可执行文件的一次执行实例,高级语言程序经过编译或汇编语言程序经过汇编后所产生的、缺省名为a.out的可执行文件的结构包括图示四个
在这里插入图片描述
文件头——
·文件的幻数(magic number)
· 编译器的版本号
· 机器类型
· 正文段、数据标识段、其它信息段的大小
· 程序入口点
正文段——
程序的功能代码
数据标识段——
标识未初始化的数据要占用的空间大小
其它信息段——
主要用于存放符号

程序的执行

一个进程在执行系统调用exec时,把可执行文件装入本进程的三个区域中:
正文区:对应可执行文件的正文段
数据区:对应可执行文件的数据标识段
堆栈区:新建立的进程工作区
堆栈主要用于传递参数,保护现场,存放返回地址以及为局部动态变量提供存储区。进程在核心态下运行时的工作区为核心栈,在用户态下运行时的工作区为用户栈。核心栈和用户栈不能交叉使用。

进程的标识

进程由其进程标识号PID来识别。
0#进程
是由机器上电时“手工”创建的,调用fork创建了
1#进程后,成为对换进程(swap)。
1#进程
init进程,由它来创建系统初始化过程中所需的其
它所有的进程。
父进程
调用fork系统调用的进程
子进程由系统调用fork产生的进程
除0#进程外,其它所有进程都是另一个进程调用fork后产生的。

进程状态及状态转换

①运行状态
此时进程正在占用处理机,进程的全部映像驻在内存中。
②就绪状态
此时进程基本具备了运行条件,正在等待使用处理机。
③睡眠状态
进程不具备运行条件,需等待某种事件的发生,无法继续执行下去。
在这里插入图片描述

在UNIX环境下,进程有如下特征:

① 每个进程在核心进程表(proc数组)都占有一项,在其中保留相应的状态信息。
② 每个进程都有一个“每进程数据区(per process data area----ppda)”保留相应进程更多的信息和核心栈;
③ 处理机的全部工作就是在某个时候执行某个进程
④ 一个进程可生成或消灭另一进程
⑤ 一个进程中可申请并占有资源
⑥ 一个进程只沿着一个特定的指令序列运行,不会跳转到另一个进程的指令序列中去,也不能访问别的进程的数据和堆栈。(抗病毒传播的重要原因之一)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值