操作系统实例Linux探索

进程管理-内存管理-I/O系统-文件系统

陷阱指令


Linux概述


Linux系统中的层次结构

系统接口

操作系控制硬件并为其他程序提供系统调用接口,这些系统调用允许用户程序创立并管理进程、文件以及其他资源。
程序通过将参数放入寄存器(有时是栈)来调用系统接口,并发出陷阱指令从用户模式切换到内核模式。由于不能用C语言写一条陷阱指令,因此系统提供一个库,每个函数对应一个系统调用,这些函数用汇编语言编写

shell  bash(ksh、csh)

sort  <in  >out:使得sort从文件in中得到输入,将结果输出到文件out
grep ter *.t | sort | head -20 | tail -5 >foo  将上一个程序的输出作为下一个程序的输入
wc -l <a >b & 在命令后加“&”,表示后台运行一个程序,命令一被输入,shell就可以接收处理下一条命令。

内核结构

内核坐落在硬件之上,负责实现与I/O设备和存储管理单元的交互,并控制CPU对前述设备的访问(进程调度和文件系统)。

Linux内核结构

进程管理

多道程序设计系统,系统中有多个彼此之间相互独立的进程在同时运行。
守护进程(daemon),如计划任务(cron daemon):每分钟运行一次来检查是否有工作需要完成
fork函数
fork()函数创建子进程后,给子进程返回一个零值,给父进程返回一个非零值(子进程的PID)
pid=fork()     //如果创建成功,则父进程的pid》0
if(pid<0){      //
handle_error();   //创建失败(比如内存或某些表溢出)
}
else if(pid>0){}           //这里是父进程的代码
else{}  //这里是子进程的代码
两个进程之间可以通过管道(pipe)来进行通信,还能实现同步
进程还可以通过另外一种方式通信:软件中断。一个进程给另一个进程发送信号进程相关的系统调用

进程相关的系统调用
waitpid()函数
第一个参数等待某一个特定的子进程,为-1,任何一个子进程结束即可返回,第二个参数为子进程退出状态(0、-1、)的变量地址,第三个参数决定了如果没有子进程结束运行的话,调用者是阻塞还是返回
exec()函数
子进程通过调用exec来执行用户命令,第一个参数命名的文件将会替换子进程原来的全部核心映像。第二个参数指向参数数组的指针,第三个参数指向环境数组的指针
很多类似的库函数,如execl、execv、execle和execve,都会调用相同的底层系统调用
cp  file1  file2
shell调用fork()函数后,子进程定位并执行文件名为cp的可执行文件同时把需要复制的文件信息传递给它,cp的主程序包含的函数声明:main(argc,argv,envp)
其中argv是一个指向数组的指针,argv[0]指向字符串“cp”,argv[1]指向“file1”,argv[2]指向“file2”

高度简化的shell
内存映射:指向代码、数据、堆栈段和页表的指针
线程
pid=clone(function,stack_ptr,sharing_flags,arg);
调用这个函数可用在当前进程或新的进程创建一个新进程,具体依赖于参数sharing_flags
参数sharing_flags是一个位图,每一位决定新线程是复制一些数据结构还是与调用clone函数的线程共享这些这些数据结构

进程调度(在Linux中基于线程)
linux系统的线程是内核线程,所以Linux系统的调度是基于线程,而不是基于进程的
Linux系统内核中,一个类型为task_struct的进程描述符始终存在于内存当中,它包含;额内核管理全部进程所需的重要信息。内核将所有进程的任务数据结构组织成一个双向链表,PID直接被映射成进程的任务数据结构所在的地址,从而立即访问进程的信息。

实时先入先出、实时轮换、分时
调度队列

实时先入先出线程具有最高优先级,0-99,0为最高优先级

非实时线程优先级从100到139,Linux内部区分140级的优先级(0-139)

每个线程分配一个nice值(即优先级调节值),默认为0,可调用系统调用nice(value)来修改,从-20-+19,不同优先级的进程赋予不同的时间片

内存管理


两个进程可以共享代码段和内存映射
内存管理系统调用
内存管理相关系统调用
物理内存管理
Linux区分三种内存区域:ZONE_DMA,0-16MB
ZONE_NORMAL,16~896MB
ZONE_HIGHMEM >896MB
内核维护内存的一个映射,该映射包含了所有系统物理内存使用情况的信息
Linux维护一个页描述符数组mem_map,指向映射的地址空间,空闲页面有一对指针来形成双向链表
区域描述符包含一个空闲区数组,第i个元素标记了页描述符
为了区分不同节点上的物理内存,使用一个节点描述符,每个页描述符的最初一些位是用来指定该页框所属的节点和区域的

Linux内存表示
内存分配机制
伙伴算法
slab分配器
·虚拟地址空间表示
虚拟地址空间被分割成同构连续页面对齐的区域
每个区用vm_area_struct项来描述
Linux中的分页
内存管理单元是一个页
分页的基本思想:为了运行,一个进程并不需要完全在内存中。实际上所需要的是用户结构和页表,由内核和页面守护进程共同实现
进程0:idl进程(交换器) 进程1:init进程
代码段和映射文件换页到它们各自在磁盘上的文件中,所有其他的都被换页到分页分区或者一个固定长度的分页文件,叫做交换区
页面置换算法
PFRA(页框回收算法)
Linux区分四种不同的页面:不可回收的、可交换的、可同步的、可丢弃的

Linux系统启动

BIOS加电自检(POST)+硬件检测、初始化->启动磁盘的第一个扇区,即主引导记录(MBR)->调入boot独立程序->GRUB引导程序使boot理解文件系统来启动根目录->boot读入操作系统内核->内核开始工作->调用C语言写的main函数开始执行操作系统->加载硬件,检测到并加入已连接设备表->进程0->进程1(init进程)->getty程序->login程序->shell程序



I/O系统

所有的I/O设备都被当做文件处理,通过read和write系统调用来访问
特殊文件:块特殊文件:由一组具有编号的块组成   类似于数组,连续存储,访问方便,直接访问块的编号,如磁盘
字符特殊文件:通常用于表示输入和输出字符流的设备,键盘、打印机、网络、鼠标、绘图等
特殊文件--设备驱动器--主设备号+次设备号  /dev/tty  终端
网络
输入/输出系统调用
s=cfsetospeed(&termios,speed)/cfsetispeed/cfgetospeed/cfisetspeed     设置/获取输出/输入速率
s=tcsetattr(fd,opt,&termios)/tcgetattr(fd,&termios)  //设置属性,获取属性
可加载模块
可加载模块是在系统运行时可以加载到内核的代码块,模块大部分是字符或块设备驱动

Linux文件系统


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值