Linux操作系统作业报告学号:110410430姓名:孙宏硕任课教师:闫健恩1shell编程1)编写shell脚本,针对指定源目录,对所有的文件进行移动到指定目的目录的操作,每个文件都要提示用户是否要移动;10分2)编写一个shell脚本,删除指定目下所有的文件夹(如子文件夹不为空也要删除);10分3)编写一个脚本,可以完成多个网卡(每次配置一块,分多次配置)的ip地址、网关、dns、掩码的设置,并立即使其生效。10分(1):#!/bin/bashif[-d$1]thenforiin`ls$1`doif[-d$i]thenecho$icd$1echomove$i?(YorN)readjcase$jiny)mv$i$2;;n)echonext;;esacelsecd$1echomove$i?(YorN)readjcase$jiny)mv$i$2;;n)echonext;;EsacFidoneElseechoERRORfi#end(2):#!/bin/bashcd$1foriin`ls$1`doif[-d$i]thenrm-rf$ielif[-f$i]thenrm$ielseechoERRORfidone#end(3):#!/bin/bashnum=$ifconfig-a|egrep-oeth[0-9]|inetaddr:[0-9]+.[0-9]+.[0-9]+.[0-9]+|seds/^inetaddr:/\t/gecho‘yournewnetworkcardiparebelow:’echo$numifconfigeth0$1netmask$2uprouteadddefaultgw$3echo$4/ect/resolv.confnum2=$ifconfig-a|egrep-oeth[0-9]|inetaddr:[0-9]+.[0-9]+.[0-9]+.[0-9]+|seds/^inetaddr:/\t/gecho$num2二ext2文件系统原理Ext2是GNU/Linux系统中标准的文件系统,其特点为存取文件的性能极好,对于中小型的文件更显示出优势,这主要得利于其簇快取层的优良设计。现已经有ext3,ext4等。相比于windows支持的FAT16FAT32及NTFS文件系统,ext2文件系统支持链接文件。在ext2文件系统中,文件由inode(包含有文件的所有信息)进行唯一标识。一个文件可能对应多个文件名,只有在所有文件名都被删除后,该文件才会被删除。此外,同一文件在磁盘中存放和被打开时所对应的inode是不同的,并由内核负责同步。ext2文件系统采用三级间接块来存储数据块指针,并以块(block,默认为1KB)为单位分配空间。其磁盘分配策略是尽可能将逻辑相邻的文件分配到磁盘上物理相邻的块中,并尽可能将碎片分配给尽量少的文件,以从全局上提高性能。ext2文件系统将同一目录下的文件(包括目录)尽可能的放在同一个块组中,但目录则分布在各个块组中以实现负载均衡。在扩展文件时,会尽量一次性扩展8个连续块给文件(以预留空间的形式实现)。由以下几部分组成:1超级快(存储了该文件系统最基本的信息,如块大小,块组中的块数目等)2块组描述符(描述了所有块的属性)3块位图和inode位图块位图和inode位图的每一位分别指出块组中对应的那个块或inode是否被使用。4inode表inode表用于跟踪定位每个文件,包括位置、大小等(但不包括文件名),一个块组只有一个inode表。5、数据块数据块中存放文件的内容,包括目录表、扩展属性、符号链接等。三linux内核源码安装Linux内核(kernel),是linux最核心的部分,实现管理存储器,文件,外设,和系统资源等。(1)下载linux内核源码在该网站下载linux源代码,在ubuntu9.10版本中内核版本为2.6.31-14可以再/usr/src中查看而linux-headers-2.6.31-14-generic是我们ubuntu使用的源码文件,进入该目录然后使用makemenuconfig配置内核然后使用make命令生成镜像使用makemodules生成模块完成安装后,编译好的内核模块会从内核源代码目录拷贝至/lib/modules下面。最后使用mkinitrdlnitrd-2.6.31-14Linux内存管理物理地址用于内存芯片级的单元寻址,与处理器和CPU连接的地址总线相对应。——这个概念应该是这几个概念中最好理解的一个,但是值得一提的是,虽然可以直接把物理地址理解成插在机器上那根内存本身,把内存看成一个从0字节一直到最大空量逐字节的编号的大数组,然后把这个数组叫做物理地址,但是事实上,这只是一个硬件提供给软件的抽像,内存的寻址方式并不是这样。所以,说它是“与地址总线相对应”,是更贴切一些,不过抛开对物理内存寻址方式的考虑,直接把物理地址与物理的内存一一对应,也是可以接受的。也许错误的理解更利于形而上的抽像。虚拟内存这是对整个内存(不要与机器上插那条对上号)的抽像描述。它是相对于物理内存来讲的,可以直接理解成“不直实的”,“假的”内存,例如,一个0x08000000内存地址,它并不对就物理地址上那个大数组中0x08000000-1那个地址元素;之所以是这样,是因为现代操作系统都提供了一种内存管理的抽像,即虚拟内存(virtualmemory)。进程使用虚拟内存中的地址,由操作系统协助相关硬件,把它“转换”成真正的物理地址。这个“转换”,是所有问题讨论的关键。有了这样的抽像,一个程序,就可以使用比真实物理地址大得多的地址空间。(拆东墙,补西墙,银行也是这样子做的),甚至多个进程可以使用相同的地址。不奇怪,因为转换后的物理地址并非相同的。可以把连接后的程序反编译看一下,发现连接器已经为程序分配了一个地址,例如,要调用某个函数A,代码不是callA,而是call0x0811111111,也就是说,函数A的地址已经被定下来了。没有这样的“转换”,没有虚拟地址的概念,这样做是根本行不通的。对任何一个普通进程来讲,它都会涉及到5种不同的数据段。包含有“程序代码段”、“程序数据段”、“程序堆栈段”等。代码段:代码段是用来存放可执行文件的操作指令,也就是说是它是可执行程序在内存中的镜像。代码段需要防止在运行时被非法修改,以只准许读取操作,而不允许写入操作――它是不可写的。数据段:数据段用来存放可执行文件中已初始化全局变量,换句话说就是存放程序静态分配的变量和全局变量。BSS段:BSS段包含了程序中未初始化的全局变量,在内存中bss段全部置零。堆:堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)栈:栈是用户存放程序临时创建的局部变量,也就是说我们函数括弧“{}”中定义的变量(但不包括static声明的变量,static意味着在数据段中存放变量)。除此以外,在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。由于栈的先进先出特点,所以栈特别方便用来保存/恢复调用现场。从这个意义上讲,我们可以把堆栈看成一个寄存、交换临时数据的内存区。进程内存空间Linux操作系统采用虚拟内存管理技术,使得每个进程都有各自互不干涉的进程地址空间。该空间是块大小为4G的线性虚拟空间,用户所看到和接触到的都是该虚拟地址,无法看到实际的物理内存地址。利用这种虚拟地址不但能起到保护操作系统的效果(用户不能直接访问物理内存),而且更重要的是,用户程序可使用比实际物理内存更大的地址空间(具体的原因请看硬件基础部分)。第一、4G的进程地址空间被人为的分为两个部分――用户空间与内核空间。用户空间从0到3G(0xC0000000),内核空间占据3G到4G。用户进程通常情况下只能访问用户空间的虚拟地址,不能访问内核空间虚拟地址。只有用户进程进行系统调用(代表用户进程在内核态执行)等时刻可以访问到内核空间。第二、用户空间对应进程,所以每当进程切换,用户空间就会跟着变化;而内核空间是由内核负责映射,它并不会跟着进程改变,是固定的。内核空间地址有自己对应的页表(init_mm.pgd),用户进程各自有不同的页表。第三、每个进程的用户空间都是完全独立、互不相干的。Linux进程调度Linux的进程管理由进程控制块、进程调度、中断处理、任务队列、定时器、bottomhalf队列、系统调用、进程通信等等部分组成。进程调用分为实时进程调度和非实时进程调度两种。前者调度时,可以采用基于动态优先级的轮转法(RR),也可以采用先进现出算法(FIFO)。后者调度时,一律采用基于动态优先级的轮转法。某个进程采用何种调度算法由改进程的进程控制块中的某些属性决定,没有专门的系统用来处理关于进程调度的相关事宜。Linux的进程调度由schedule()函数负责,任何进程,当它从系统调用返回时,都会转入schedule(),而中断处理函数完成它们的响应任务以后,也会进入schedule()。进程控制块数据结构Linux系统的进程控制块用数据结构task_struct表示,这个数据结构占用1680个字节,具体的内容不在这里介绍。进程调度Linux进程调度由schedule()执行,其任务是在run-queue队列中选出一个就绪进程。每个进程都有一个调度策略,在它的task_struct中规定(policy属性),或为SCHED_RR,SCHED_FIFO,或为SCHED_OTHER。前两种为实时进程调度策略,后一种为普通进程调度策略。用户进程由do_fork()函数创建,它也是fork系统调用的执行者。do_fork()创建一个新的进程,继承父进程的现有资源,初始化进程时钟、信号、时间等数据。完成子进程的初始化后,父进程将它挂到就绪队列,返回子进程的pid。在支持多进程的系统中,理想情况下,各个进程应该是根据其优先级公平地占有CPU。而不会出现“谁运气好谁占得多”这样的不可控的情况。linux进程调度中最基本的数据结构是structrunqueue;有关于此结构的队列在kernel/sched.c,此队列包含了处理器的所有可执行进程的信息。每个运行队列都有两个优先级数组,一个活跃的和一个过期的,此数组也是在kernel/sched.c中含有。schedule函数定义也是在kernel/sched.c中。每个CPU均有两个具有优先级的队列。一个“活动”队列,一个“过期”队列。活动队列中包含所有映射于该CPU并具有时间片的任务。而过期队列包含所有已经使用完时间片的任务(依然是一个有序队列)。活动队列和过期队列不能直接访问,而是通过每个CPU的运行队列结构中的两个指针来访问。调度程序不需每次都扫描所有的任务,而是在一个任务变成就绪状态时将其放到“活动”的队列中。当调度程序运行时,只选择活动队列中最有利的任务来执行。这样,调度可以在一个恒定的时间里完成。当任务执行时,它会得到一个时间片,或者在其转到另一线程之前得到一段时间的CPU使用权。当时间片用完后,任务会被转移到“过期”的队列中。在该队列中,任务会根据其优先级进行排序。当活动队列中的任务均被运行完时,我们就交换两个指针,从而使得先前的过期队列成为活动队列,同样先前空闲的活动队列将转变为过期队列。因此,可以看得出来,“活动”队列中总是排好了顺序的任务队列,如此提高了速度。课程建议希望可以在课堂上实际使用linux常见命令,从源码入手,简单的为我们讲解一些经典的linux小程序的开源代码。加入一些linux下C++开发流程的介绍,及如何使用Cmakegit工具等。希望能为我们简单介绍下linux下的图形框架及GUI编程。我以前没有接触过linux,但是经过闫老师的课我开始了解linux,在课下的时间里,我在网上学习了linux相关的知