linux第二次大作业
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
嵌入式linux操作系统第二次大作业
一、填空题
1. linux内核子系统主要有进程调度、内存管理、虚拟文件系统、网络接口、进程间通信五部分组成,其中处于中心地位的是进程调度,其它子系统都依赖于它,因为每个子系统都需要挂起和恢复进程。
2. 在操作系统中,进程控制块是进程存在的唯一标志。在linux操作系统中,描述进程控制块的数据结构名是PCB。
3. inux操作系统的设备驱动程序可以分为___软中断和tasklet___ 、块设备驱动程序、网络设备驱动程序。
4. 在linux内核中,造成并发的原因有中断、软中断和tasklet、睡眠及其与内核抢占、对称多处理。
5. 在linux进程调度是,需要用到一个函数来衡量一个处于可运行状态的进程值得运行的程度,该函数的名字是schedule()。
二、判断题
1. 在linux系统中,进程标识符为0的进程为init进程,“孤儿进程”就是由该进程收养。(×)
2. 应用程序编程接口(API)是通过软中断向内核发出一个明确的请求。( √)
3. 自旋锁和信号量的主要区别是前者可以睡眠,而后者则不能睡眠。( ×)
4. linux的文件结构是一种树形结构。( √)
5. 在linux中采用了一种小任务机制来把中断的部分工作推后处理,描述小任务的数据结构是struct tasklet_struct。( ×)
三、选择题
1、用gcc工具把dzx.c的源文件编译成目标文件的正确命令是(B )。
A、gcc dzx.c
B、gcc dzx.c –o dzx.o
C、gcc –g dzx.c
D、gcc –c dzx.c –o dzx.o
2、在下面的过程中,不属于linux进程调度的时机是( C )。
A、从内核态返回到用户态是
B、当前进程时间片用完
C、读写文件时
D、进程状态转换时刻
3下面对linux的调度算法描述最为恰当的是( D )。
A、时间片轮转调度
B、优先级调度
C、实时调度
D、动态优先级时间片轮转调度
4在linux系统进程管理中,能够加快从PID快速导出PCB地址的数据结构是( B )。
A、进程链表
B、可运行队列
C、等待队列
D、散列表
5、linux用户空间的的地址范围是( A )。
A、0到3G
B、3G到4G
C、0到3G-1
D、3G到4G-1
6下面不属于linux内核同步的方法是( C )。
A、自旋锁
B、信号量
C、套接字
D、原子操作
7、linux内核主要由五部分组成,其中处于中心地位的是___A____其它子系统都依赖于它,因为每个子系统都需要挂起和恢复进程。
A、进程调度
B、内存管理
C、文件系统
D、网络
三、编程题
1、编写一个进程创建程序,用fork()创建进程并打印出父子进程的进程号(要求写完整的程序)。
#include
#include
int main(void)
{pid_t pid;
int count=0;
pid = fork();
printf("Now, the pid returned by calling fork() is %d"n", pid );
if( pid>0 ){
printf("This is the parent process,the child has the pid:%d"n", pid );
printf("In the parent process,count = %d"n",count);
}else if(!pid ){
printf("This is the child process."n");
printf("Do your own things here."n");
count++;
printf("In the child process, count = %d"n",count);}
else{
printf("fork failed."n")}
return 0;
}
2、编写一个简单的字符设备驱动程序:该设备实际是内存块,要求实现读写操作并写出编译、运行、安装的步骤。
#define __NO_VERSION__
#include
#include
#include
#include
#include
#include
#include
#include
#include
unsigned int test_major = 0;
static ssize_t read_test(struct file *file,char *buf,size_t count,loff_t *f_pos)
{int left;
if (verify_area(VERIFY_WRITE,buf,count) == -EFAULT )
return -EFAULT;
for(left = count ; left >; 0 ; left--)
{put_user(1,buf);
buf++;}
return count;}
static ssize_t write_test(struct file *file, const char *buf, size_t count, loff_t
*f_pos){
return count;}
static int open_test(struct inode *inode,struct file *file ){
MOD_INC_USE_COUNT;
return 0;}
static int release_test(struct inode *inode,struct file *file ){
MOD_DEC_USE_COUNT;
return 0;}
struct file_operations test_fops = {
read:read_test,
write:write_test,
open: open_test,