超详细西电软院操作系统实验报告DOCWord文档格式.docx

上传人:b****6 文档编号:19237527 上传时间:2023-01-04 格式:DOCX 页数:31 大小:1.04MB
下载 相关 举报
超详细西电软院操作系统实验报告DOCWord文档格式.docx_第1页
第1页 / 共31页
超详细西电软院操作系统实验报告DOCWord文档格式.docx_第2页
第2页 / 共31页
超详细西电软院操作系统实验报告DOCWord文档格式.docx_第3页
第3页 / 共31页
超详细西电软院操作系统实验报告DOCWord文档格式.docx_第4页
第4页 / 共31页
超详细西电软院操作系统实验报告DOCWord文档格式.docx_第5页
第5页 / 共31页
点击查看更多>>
下载资源
资源描述

超详细西电软院操作系统实验报告DOCWord文档格式.docx

《超详细西电软院操作系统实验报告DOCWord文档格式.docx》由会员分享,可在线阅读,更多相关《超详细西电软院操作系统实验报告DOCWord文档格式.docx(31页珍藏版)》请在冰豆网上搜索。

超详细西电软院操作系统实验报告DOCWord文档格式.docx

6、U盘的使用方法

7、用户管理命令

8、用户组账号管理

9、文件权限设置

10、设置文件属主和属组

2

makefile的编写及Linux内核编译

1、掌握Linux中makefile文件的编写

2、理解Linux内核的Makefile

3、掌握至少一个版本Linux内核的编译步骤

4、了解Linux内核的配置过程

1、准备工作:

相关软件的获取与安装(源代码,软件包)

2、编译工作:

配置,编译

3、修改启动配置文件:

修改grub2启动项

4、能够正确的编译源代码

5、能够用编译出的内核启动系统

报告内容要求

(1)实现方法和思路

(2)测试及结果

内核编译过程

1、拷贝源代码到/usr/src目录下

将文件添加共享文件夹中,然后在terminal输入以下命令:

cd/mnt/hgfs

cp-rpackages/usr/src

cplinux-2.6.32.60/usr/src

2、在usr/src目录下解压源码:

cd/usr/src

tarxvflinux-2.6.32.60.tar.bz2

3、拷贝packages到“~”目录下:

cp-rpackages~

4、安装软件包:

dpkg–i*.deb

5、转到内核源代码所在的目录“/usr/src/linux-2.6.32.60”:

cd/usr/src/linux-2.6.32.60

6、输入makemenuconfig,进入generalsetup选项,进入localversion菜单,添加版本标示:

lan,保存并退出。

7、输入make语句,等待2小时……

8、makemodules_install

9、makeinstall

10、update-initramfs-c-k2.6.32.60lan

11、修改grub启动项:

cd/boot/grub

12、重新启动ubuntu

13、查看内核版本号:

3

Linux的进程和线程

1、理解进程/线程的概念

2、掌握创建和终止进程/线程的方法

3、掌握与进程/线程控制相关的系统函数

1、创建和终止进程/线程

2、使用进程/线程控制相关的系统函数

示例1

源代码:

#include<

stdio.h>

unistd.h>

sys/types.h>

intmain(){

pid_tmyPid;

pid_tmyParentPid;

gid_tmyGid;

uid_tmyUid;

myPid=getpid();

myParentPid=getppid();

myGid=getgid();

myUid=getuid();

printf("

myprocessidis%d\n"

myPid);

myparentisprocessidis%d\n"

myParentPid);

mygroupidis%d\n"

myGid);

myuseridis%d\n"

myUid);

return0;

}

运行结果:

示例2

errno.h>

pid_tret;

intstatus,i;

introle=-1;

ret=fork();

if(ret>

0){

printf("

Parent:

Thistheparentprocess(pid%d)\n"

getpid());

for(i=0;

i<

6;

i++){

printf("

Atcount%d\n"

i);

sleep(3);

}

ret=wait(&

status);

//防止僵尸进程的产生

role=0;

else

if(ret==0){

Child:

Thisthechildprocess(pid%d)\n"

for(i=0;

printf("

Chile:

i);

sleep

(1);

}

role=1;

}

else{

Errortryingtofork()(%d)\n"

errno);

%s:

Exiting...\n"

((role==0)?

"

Parent"

:

Child"

));

return0;

示例3

signal.h>

voidcatch_ctlc(intsig_num){

CaughtControl-C\n"

);

fflush(stdout);

//清除标准输出的缓存区

signal(SIGINT,catch_ctlc);

Goahead,makemyday.\n"

pause();

示例4

sys/wait.h>

voidusr1_handler(intsig_num){

Parent(%d)gottheSIGUSR1\n"

getpid());

intstatus;

if(ret>

Thisistheparentprocess(pid%d)\n"

getpid());

signal(SIGUSR1,usr1_handler);

role=0;

pause();

Awaitingchildexit\n"

ret=wait(&

}

else{

if(ret==0){

Thisisthechildprocess(pid%d)\n"

sleep

(1);

SendingSIGUSR1topid%d\n"

getppid());

kill(getppid(),SIGUSR1);

sleep

(2);

}else{

Exiting…\n"

((role==0)?

"

:

示例5

pthread.h>

stdlib.h>

string.h>

void*myThread(void*arg){

Threadran\n"

pthread_exit(arg);

intmain()

{

intret;

pthread_tmythread;

ret=pthread_create(&

mythread,NULL,myThread,NULL);

if(ret!

=0){

Cannotcreatepthread(%s)\n"

strerror(errno));

exit(-1);

程序无输出内容

改写程序如下:

if(ret==0){

Cancreatepthread!

\n"

示例6

Thread%dstarted\n"

(int)arg);

#defineMAX_THREADS5

intret,i,status;

pthread_tthreadIds[MAX_THREADS];

for(i=0;

i<

MAX_THREADS;

i++){

ret=pthread_create(&

threadIds[i],NULL,myThread,(void*)i);

if(ret!

=0){

Errorcreatingthread%d\n"

(void*)i);

ret=pthread_join(threadIds[i],(void**)&

Errorjoiningthread%d\n"

(void*)i);

Status=%d\n"

status);

示例7

assert.h>

pthread_mutex_tcntr_mutex=PTHREAD_MUTEX_INITIALIZER;

longprotVariable=0L;

inti,ret;

for(i=0;

10000;

ret=pthread_mutex_lock(&

cntr_mutex);

assert(ret==0);

protVariable++;

ret=pthread_mutex_unlock(&

pthread_exit(NULL);

#defineMAX_THREADS10

intret,i;

ret=pthread_create(&

threadIds[i],NULL,myThread,NULL);

(int)threadIds[i]);

ret=pthread_join(threadIds[i],NULL);

Theprotectedvariablevalueis%ld\n"

protVariable);

ret=pthread_mutex_destroy(&

cntr_mutex);

if(ret!

=0){

Couldnotdestroythemutex\n"

4

同步与互斥

1.学习理解并发中的互斥原理

2.掌握peterson算法的原理及实现方法

3.实现生产者消费者模型

1.实现Peterson算法;

理解互斥的概念

2.利用Peterson算法的原理;

实现“生产者消费者”程序,理解同步互斥的概念

一、Peterson算法

本实验利用软件方法实现同步互斥,也就是通过peterson算法,不通过中断等物理机制实现同步互斥。

Peterson算法特点:

使用两个全局变量(flag[]和turn),flag[]表示哪个进程正在占用临界区及临界区的状态,turn表示能进入临界区的进程序号。

此算法涉及两个原则:

忙则等待,空闲让进。

#include<

#definefalse0

#definetrue1

intflag[2];

intturn=0;

ints=0;

void*P0(void*arg);

void*P1(void*arg);

pthread_tpt0,pt1;

flag[0]=false;

flag[1]=false;

pthread_create(&

pt0,NULL,P0,NULL);

pt1,NULL,P1,NULL);

pthread_join(pt0,NULL);

pthread_join(pt1,NULL);

void*P0(void*arg)

while(true){

flag[0]=true;

turn=1;

while(flag[1]&

&

turn==1)continue;

Iamprocess0andIgots:

%d\n"

s);

s++;

sleep

(1);

void*P1(void*arg)

flag[1]=true;

turn=0;

while(flag[0]&

turn==0)continue;

Iamprocess1andIgots:

2、用Peterson算法实现“生产者消费者”程序

#defineMAX10//需要生产的数量

pthread_mutex_tthe_mutex;

pthread_cond_tcondc,condp;

intbuffer=0;

//生产者、消费者使用的缓冲区

void*producer(void*ptr)

inti;

for(i=1;

=MAX;

i++)

{

pthread_mutex_lock(&

the_mutex);

//互斥使用缓冲区

while(buffer!

=0)pthread_cond_wait(&

condp,&

procucerproduceitem%d\n"

buffer=i;

//将数据插入缓冲区

pthread_cond_signal(&

condc);

//唤醒消费者

pthread_mutex_unlock(&

//释放缓冲区

pthread_exit(0);

void*consumer(void*ptr)

//互斥使用缓冲区

while(buffer==0)pthread_cond_wait(&

condc,&

consumerconsumeitem%d\n"

buffer=0;

//从缓冲区中取出数据

condp);

//唤醒生产者

intmain(intargc,char*argv[])

pthread_tpro,con;

pthread_mutex_init(&

the_mutex,0);

pthread_cond_init(&

condc,0);

condp,0);

con,0,consumer,0);

pro,0,producer,0);

pthread_join(pro,0);

pthread_join(con,0);

pthread_cond_destroy(&

pthread_mutex_destroy(&

5

文件系统

1.掌握锁的结构和操作

2.掌握如何对文件进行加锁,解锁

3.学会如何协调不同进程对同一文件的互斥操作

1.文件锁的测试

以下选做:

2.获取文件的状态信息

3.创建一个带有空洞的文件

4.掌握lseek函数的用法

1、文件锁的测试

fcntl.h>

wait.h>

intfd;

pid_tpid;

structflockrdlock,wrlock;

rdlock.l_type=F_RDLCK;

rdlock.l_start=0;

//读锁

rdlock.l_whence=SEEK_SET;

rdlock.l_len=0;

wrlock.l_type=F_WRLCK;

wrlock.l_start=0;

//写锁

wrlock.l_whence=SEEK_SET;

wrlock.l_len=0;

if((fd=open("

myfile"

O_RDWR))<

cannotopenthefile\n"

exit(EXIT_FAILURE);

if(write(fd,"

abcdefgh"

8)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 研究生入学考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1