超详细西电软院操作系统实验报告DOCWord文档格式.docx
- 文档编号:19237527
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:31
- 大小:1.04MB
超详细西电软院操作系统实验报告DOCWord文档格式.docx
《超详细西电软院操作系统实验报告DOCWord文档格式.docx》由会员分享,可在线阅读,更多相关《超详细西电软院操作系统实验报告DOCWord文档格式.docx(31页珍藏版)》请在冰豆网上搜索。
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)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 详细 西电软院 操作系统 实验 报告 DOC