山东大学大二下学期操作系统实验报告


    
    操作系统实验报告











    计算机科学技术学院
    计算机科学技术专业
    2012级X班

    目录
    进程控制实验 3
    11 实验目 3
    12示例实验 3
    121实验容 3
    13独立实验 4
    131实验容 4
    132实验步骤 4
    133实验演示结果 7
    134实验代码 7
    二进程调度算法实验 9
    21 实验目 9
    22示例实验 10
    221实验容 10
    222实验演示结果 10
    23独立实验 11
    231实验容 11
    232实验步骤 12
    233实验演示结果 14
    234实验代码 14
    二 进程步实验 16
    31 实验目 16
    32示例实验 16
    321实验容 16
    322实验演示结果 17
    33独立实验 17
    331实验容 17
    332实验步骤 18
    333实验演示结果 21
    334实验代码 21
    三 存页面置换算法实验 31
    41 实验目 31
    42示例实验 31
    421实验容 31
    422实验演示结果 32
    43独立实验 32
    431实验容 32
    432实验步骤 33
    433实验演示结果 35
    434实验代码 37
    四 磁盘移臂调度算法实验 48
    51 实验目 48
    52示例实验 49
    521实验容 49
    522实验演示结果 50
    53独立实验 50
    531实验容 50
    532实验步骤 51
    533实验演示结果 54
    534实验代码 54


    进程控制实验
    11 实验目
    加深进程发执行概念理解实践发进程创建控制方法观察体验进程动态特性进步理解进程生命期期间创建变换撤销状态变换程掌握进程控制方法解父子进程间控制协作关系练 Linux 系统中进程创建控制关系统调编程调试技术
    12示例实验
    121实验容
    实验示例程序应实现类似shell 子命令功执行程序中启动新子进程执行新命令发执行122实验演示结果

    13独立实验
    131实验容
    参考示例程序中建立发进程方法编写父子协作进程父进程创建子进程控制隔 3 秒显示次前目录中文件名列表
    132实验步骤 
    1321算法设计
    通进程间通讯先创建父进程子进程父进程沉睡3秒子进程作前父进程次创建子进程前子进程执行显示前目录文件列表功执行execve()方法死亡While(1) 死循环里限进行前操作达父进程创建子进程控制隔3秒显示次前目录中文件名列表求
    1322开发调试程
    开终端命令行窗体新建文件夹该文件夹中建立名pctrlcC语言程序
    建立名 pctrlh C 语言头文件
    建立项目理文件 Makefile
    输入 make 命令编译连接生成执行 pctl 程序
    执行 pctl 程序
    次执行带子进程指定执行命令 pctl 程序
    1323思考分析
    1.反映进程特征功真实操作系统中样实现反映出教材中讲解进程生命期进程实体进程状态控制进程概念发概念新理解认识?子进程创建执行新程序?
    答:进程发执行程序某数集次运行程序次运行程程序进程组成部分进程程序执行程程序静态指令集合进程动态程实体动态产生发展消失
    外谓进程发执行宏观发微观交执行进程唯整数形式进程标识符标识通fork()系统调创建新进程新进程通复制原进程址空间成种机制允许父子进程方便进行通信
    系统调fork()子进程实际父进程克隆体执行新程序系统调exec()新程序取代进程存空间功根参数指定文件名找程序文件装入存覆盖原进程映形成父进程子进程进程映更换外新进程PIDPCB属性均保持变实际新进程壳原子进程开始运行父进程通系统调waitpid()移出绪队列等子进程终止
    2.信号机理什?样利信号实现进程控制?
    信号应正整数常量(signal number定义系统头文件中)代表户诸进程间传送事先约定信息类型通知某进程发生某异常事件进程运行时通信号机制检查否信号达中断正执行程序转该信号相应处理程序已完成事件处理处理结束返回原断点继续执行
    133实验演示结果


    134实验代码
    pctlc文件:
    #include pctlh
    int main()
    {
    int pid_1pid_2 存放子进程号

    int status_1status_2 存放子进程返回状态
    while(1){
    pid_1fork()
    if(pid_1<0) 建立子进程失败
    {
    printf(Create Process fail\n)
    exit(EXIT_FAILURE)
    }
    if(pid_1 0) 子进程执行代码段
    {
    报告父子进程进程号
    printf(I am Childls process d\nMy father is d\ngetpid()getppid())*getpid 返回前进程进程号getppid 返回前进程父进程进程号*
    pid_2fork()
    if(pid_2<0) 建立子进程失败

    {
    printf(Create Process fail\n)
    exit(EXIT_FAILURE)
    }
    if(pid_20) 子进程执行代码段

    {报告父子进程进程号

    printf(I am Childps process d\nMy father is d\ngetpid()getppid())
    printf(d child will Running \ngetpid()) *子进程键盘中断信号唤醒继续执行*

    status_2execve(binpsNULLNULL)装入执行新程序

    }else{
    printf(wait for the pschild endd\npid_2)
    waitpid(pid_2&status_20)等子进程2结束
    status 保留子进程退出状态
    }
    printf(d child will Running \ngetpid()) 装入执行新程序
    char *argv[]{0NULL}
    status_1 execve(binlsargvNULL)
    }
    else{
    printf(I am Parent process d\ngetpid())
    printf(wait for the lschild end d\npid_1)
    waitpid(pid_1&status_10)
    printf(child endsleep\n)
    sleep(3) sleep 函数会令调进程执行挂起睡眠3秒
    }
    }
    return EXIT_SUCCESS
    }

    pctlh文件:
    #include
    #include
    #include
    #include
    #include
    #include
    进程定义键盘中断信号处理函数
    typedef void (*sighandler_t) (int)
    void sigcat(){
    printf(d Process continue\ngetpid())
    }
    二进程调度算法实验
    21 实验目
    加深进程调度概念理解体验进程调度机制功解 Linux 系统中进程调度策略方法 练进程调度算法编程调试技术
    22示例实验
    221实验容
    示例实验程序测试 linux 系统中调度策略优先数调度效果
    222实验演示结果


    23独立实验
    231实验容
    设两发执行父子进程断循环输出进程号优先数调度策
    略进程初始调度策略均系统默认策略默认优先级某进程收 SIGINT
    信号时会动优先数加 1收 SIGCSTP 信号时会动优先数减 1请编
    程实现功
    232实验步骤
    2321算法设计
    建立父进程子进程通第章学进程控制相互发送信号 Ctrl+C 时父进程实现优先级加 1Ctrl+Z 时子进程实现优先级减1
    signal 系统调父进程注册进程处理 SIGINT 实现优先级加 1 函数子进程注册进程处理SIGTSTP 实现优先级减 1 函数 Ctrl+Z 时子进程做出响应优先级减 1Ctrl+C 时父进程做出响应父进程优先级加 1然输出进程号优先数调度策略行通 for()语句循环
    2322开发调试程
    新建文件夹该文件夹中建立名 pctlc C 语言程序
    建立名pctlh C 语言头文件
    建立项目理文件 Makefile
    输入 make 命令编译连接生成执行pctl程序
    执行调试 pctl程序
    2323思考分析
    进程调度调度策略功示
    SCHED_OTHER 默认分时调度策略(值等 0)
    SCHED_FIFO 先进先先出调度策略(值等 1)
    SCHED_RR 时间片轮转调度策略(值等 2)
    进程调度质谁先执行谁执行真实操作系统中调度策略优先级决定谁先执行Linux 调度策略三种SCHED_OTHER 分时调度SCHED_FIFO 先进先出SCHED_RR 时间片轮转两种专响应时间特殊求进程会抢先 SCHED_OTHER 调度策略进程执行通系统调设置进程调度策略intsched_setscheduler(pid_t pidint policyconst struct sched_param *sp) 中 pid 进程号policy 说明 3 种调度策略sp 调度参数结构指针调度参数结构存调度优先数进程优先数(prio)静态优先级动态优先级两部分组成静态优先级调度策略关动态优先级系统调设置int setpriority(int whichint whoint prio)which 设置象:
    进程 PRIO_PROCESS
    进程组 PRIO_PGRP
    户 PRIO_USER
    who 应设置象进程号组号户号
    prio 设置进程优先数
    233实验演示结果

    234实验代码
    pschedc文件:
    #include
    #include
    #include
    #include
    #define SIGINT 2
    #define SIGTSTP 20
    void handler_sigint(int signo) { 提升优先数
    printf(\nd 进程优先数增加 1\ngetpid())
    setpriority(PRIO_PROCESS getpid()
    getpriority(PRIO_PROCESSgetpid()) + 1)
    }
    void handler_sigtstp(int signo) { 降低优先数

    printf(\nd 进程优先数减 1\ngetpid())
    setpriority(PRIO_PROCESS getpid()
    getpriority(PRIO_PROCESSgetpid()) 1)
    }
    int main() {
    pid_t pid
    if((pid fork()) < 0 ){
    perror(process create error)
    }
    if(pid > 0) {
    signal(SIGINT handler_sigint) 父进程处理 Ctrl+C
    signal(SIGTSTP SIG_IGN) 忽略 Ctrl+Z
    }else{
    setpriority(PRIO_PROCESS getpid() 10) 设定子进程初始动态优先级 10否出效果
    signal(SIGTSTP handler_sigtstp) 子进程处理Ctrl+Z
    signal(SIGINT SIG_IGN) 忽略 Ctrl+C
    }
    int i1
    while(i<20) {
    if(pid > 0) {
    printf(I'm parent process )
    }else{
    printf(I'm child process )
    }
    printf(pid d priority d scheduler d\n
    getpid() getpriority(PRIO_PROCESS
    getpid())sched_getscheduler(getpid()))
    sleep(3)
    i++
    }
    }
    文件示例实验
    二 进程步实验
    31 实验目
    加深发协作进程步互斥概念理解观察体验发进程步互斥操作效果分析研究典进程步互斥问题实际解决方案解 Linux 系统中 IPC 进程步工具法练发协作进程步互斥操作编程调试技术
    32示例实验
    321实验容
    示例实验程序应模拟生产消费者界缓正确操作利 N 字节享存作界循环缓区利写字符模拟放产品利读字符模拟消费产品缓区空时消费者应阻塞睡眠缓区满时生产者应阻塞睡眠旦缓区中空单元生产者进程空单元中入写字符报告写容位置旦缓区中未读字符消费者进程该单元中读出字符报告读取位置生产者单元中连续写两次相字符消费者单元中连续读两次相字符
    322实验演示结果

    33独立实验
    331实验容
    抽烟者问题假设系统中三抽烟者进程抽烟者断卷烟抽烟抽烟者卷起抽掉颗烟需三种材料:烟草纸胶水抽烟者烟草纸胶水系统中两供应者进程限供应三种材料次仅轮流提供三种材料中两种缺失两种材料抽烟者卷起抽掉颗烟会发信号通知供应者继续提供外两种材料程重复进行 请介绍 IPC 步机制编程实现该问题求功
    332实验步骤
    3321问题分析
    两供应者三消费者存放烟草纸胶水公缓区 3存放序指定分烟草纸胶水供应者供应物品三种(烟草+纸)(烟草+胶水)(纸+胶水) 三消费者分需三里面种
    约束:
    (1)某时刻供应者放入物品
    (2) 某时刻 消费者 保证消费者恰需刚刚生产物品
    (3)供应者提供种物品生产什物品等消费者走物品继续生产
    3322算法设计
    (1)供应者文完全样程序中 fork()子进程父进程子进程发执行供应者代码
    (2)消费者三消费者需物品代码段样需建立两子进程父进程时发执行 然区域执行相似代码段
    (3)信号灯实现步互斥约束
    (4)创建公缓区指首址指针
    获取缓区享存buff_ptr 指缓区首址
    buff_ptr (char *)set_shm(buff_keybuff_numshm_flg)
    获取供应者放产品首位置指针 pput_ptr
    pput_ptr (int *)set_shm(pput_keypput_numshm_flg)
    3323开发调试程
    新建文件夹该文件夹中建立名 ipch C 语言头文件
    建立名 ipcc C 语言头文件实现头文件中申明函数
    建立名 producerc C 语言头文件实现供应者功
    建立名 consumerc C 语言头文件实现消费者功
    建立项目理文件 Makefile
    输入 make 命令编译连接生成执行 producer consumer 程序
    执行调试 producer consumer 程序
    3324思考分析
    进程间步该实验中通信号灯实现 进程间步信号灯必须完全相进程中创建样信号灯会进程享然通执行信号灯 up() down()操作进程发执行时保持步果信号灯值 0进程会阻塞什够步
    操作系统中进程步通信号量机制实现实验中信号灯信号量 down()操作信号量 wait 操作up()操作信号量 signal 操作
    333实验演示结果

    334实验代码
    ipch文件:
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #define BUFSZ 256
    建立获取 ipc 组函数原型说明
    int get_ipc_id(char *proc_filekey_t key)
    char *set_shm(key_t shm_keyint shm_numint shm_flag)
    int set_msq(key_t msq_keyint msq_flag)
    int set_sem(key_t sem_keyint sem_valint sem_flag)
    int down(int sem_id)
    int up(int sem_id)
    typedef union semuns {
    int val
    } Sem_uns
    typedef struct msgbuf {
    long mtype
    char mtext[1]
    } Msg_buf
    生产消费者享缓区关变量
    key_t buff_key
    int buff_num
    char *buff_ptr
    生产者放产品位置享指针
    key_t pput_key
    int pput_num
    int *pput_ptr
    消费者取产品位置享指针
    key_t cget_key
    int cget_num
    int *cget_ptr
    生产者关信号量
    key_t prod_key
    key_t pmtx_key
    int prod_sem
    int pmtx_sem
    消费者关信号量
    key_t c_PG_key
    key_t c_TP_key
    key_t c_TG_key
    key_t cmtx_key
    int c_PG_sem
    int c_TP_sem
    int c_TG_sem
    int cmtx_sem
    int sem_val
    int sem_flg
    int shm_flg


    ipcc文件:
    #include ipch
    int get_ipc_id(char *proc_filekey_t key)
    {
    FILE *pf
    int ij
    char line[BUFSZ]colum[BUFSZ]
    if((pf fopen(proc_filer)) NULL){
    perror(Proc file not open)
    exit(EXIT_FAILURE)
    }
    fgets(line BUFSZpf)
    while(feof(pf)){
    i j 0
    fgets(line BUFSZpf)
    while(line[i] ' ') i++
    while(line[i] ' ') colum[j++] line[i++]
    colum[j] '\0'
    if(atoi(colum) key) continue
    j0
    while(line[i] ' ') i++
    while(line[i] ' ') colum[j++] line[i++]
    colum[j] '\0'
    i atoi(colum)
    fclose(pf)
    return i
    }
    fclose(pf)
    return 1
    }
    int down(int sem_id)
    {
    struct sembuf buf
    bufsem_op 1
    bufsem_num 0
    bufsem_flg SEM_UNDO
    if((semop(sem_id&buf1)) <0) {
    perror(down error )
    exit(EXIT_FAILURE)
    }
    return EXIT_SUCCESS
    }
    int up(int sem_id)
    {
    struct sembuf buf
    bufsem_op 1
    bufsem_num 0
    bufsem_flg SEM_UNDO
    if((semop(sem_id&buf1)) <0) {
    perror(up error )
    exit(EXIT_FAILURE)
    }
    return EXIT_SUCCESS
    }
    int set_sem(key_t sem_keyint sem_valint sem_flg)
    {
    int sem_id
    Sem_uns sem_arg
    测试 sem_key 标识信号灯数组否已建立
    if((sem_id get_ipc_id(procsysvipcsemsem_key)) < 0 )
    {
    semget 新建信号灯标号返回 sem_id
    if((sem_id semget(sem_key1sem_flg)) < 0)
    {
    perror(semaphore create error)
    exit(EXIT_FAILURE)
    }
    设置信号灯初值
    sem_argval sem_val
    if(semctl(sem_id0SETVALsem_arg) <0)
    {
    perror(semaphore set error)
    exit(EXIT_FAILURE)
    }
    }
    return sem_id
    }
    char * set_shm(key_t shm_keyint shm_numint shm_flg)
    {
    int ishm_id
    char * shm_buf
    测试 shm_key 标识享存区否已建立
    if((shm_id get_ipc_id(procsysvipcshmshm_key)) < 0 )
    {
    shmget 新建 长度 shm_num 字节享存标号返回 shm_id
    if((shm_id shmget(shm_keyshm_numshm_flg)) <0)
    {
    perror(shareMemory set error)
    exit(EXIT_FAILURE)
    }
    shmat shm_id 标识享存附加指针 shm_buf
    if((shm_buf (char *)shmat(shm_id00)) < (char *)0)
    {
    perror(get shareMemory error)
    exit(EXIT_FAILURE)
    }
    for(i0 i}
    shm_key 标识享存区已建立 shm_id 标识享存附加指针 shm_buf
    if((shm_buf (char *)shmat(shm_id00)) < (char *)0)
    {
    perror(get shareMemory error)
    exit(EXIT_FAILURE)
    }
    return shm_buf
    }
    int set_msq(key_t msq_keyint msq_flg)
    {
    int msq_id
    测试 msq_key 标识消息队列否已建立
    if((msq_id get_ipc_id(procsysvipcmsgmsq_key)) < 0 )
    {
    msgget 新建消息队列标号返回 msq_id
    if((msq_id msgget(msq_keymsq_flg)) < 0)
    {
    perror(messageQueue set error)
    exit(EXIT_FAILURE)
    }
    }
    return msq_id
    }
    producerc文件:
    #include ipch
    int main(int argcchar *argv[])
    {
    int rate
    命令行第参数指定进程睡眠秒数调解进程执行速度
    if(argv[1] NULL) rate atoi(argv[1])
    else rate 3 指定 3 秒
    享存变量
    buff_key 101缓区键值
    buff_num 3缓区长度
    pput_key 102生产者放产品指针键值
    pput_num 1 指针数
    shm_flg IPC_CREAT | 0644享存读写权限
    获取缓区享存buff_ptr 指缓区首址
    buff_ptr (char *)set_shm(buff_keybuff_numshm_flg)
    获取生产者放产品位置指针 pput_ptr
    pput_ptr (int *)set_shm(pput_keypput_numshm_flg)
    信号量变量
    prod_key 201生产者步信号灯键值
    pmtx_key 202生产者互斥信号灯键值
    c_PG_key 301消费者步信号灯键值
    c_TP_key 302消费者互斥信号灯键值
    c_TG_key 303消费者互斥信号灯键值
    sem_flg IPC_CREAT | 0644
    生产者步信号灯初值设缓区量
    sem_val 1
    获取生产者步信号灯引标识存 prod_sem
    prod_sem set_sem(prod_keysem_valsem_flg)
    消费者初始产品取步信号灯初值设 0
    sem_val 0
    获取消费者步信号灯引标识存 cons_sem
    c_PG_sem set_sem(c_PG_keysem_valsem_flg)
    c_TP_sem set_sem(c_TP_keysem_valsem_flg)
    c_TG_sem set_sem(c_TG_keysem_valsem_flg)
    生产者互斥信号灯初值 1
    sem_val 1
    获取生产者互斥信号灯引标识存 pmtx_sem
    pmtx_sem set_sem(pmtx_keysem_valsem_flg)
    循环执行模拟生产者断放产品
    int pid
    int i
    pid fork()
    if(pid 0) {
    while(1){
    int r rand() 3
    if(r 0) {
    down(prod_sem)
    果生产者正放产品生产者阻塞
    down(pmtx_sem)
    写字符形式模拟生产者放产品 报告进程号放入字符存放位置
    buff_ptr[*pput_ptr + 1] 'P'
    buff_ptr[*pput_ptr + 2] 'G'
    sleep(rate)
    printf(d 供 应 商 提 供 纸 c 胶 水 c\ngetpid()buff_ptr[*pput_ptr +1] buff_ptr[*pput_ptr + 2])
    唤醒阻塞生产者
    up(pmtx_sem)
    唤醒阻塞消费者
    up(c_PG_sem)
    } else if(r 1) {
    down(prod_sem)
    果生产者正放产品生产者阻塞
    down(pmtx_sem)
    写字符形式模拟生产者放产品 报告进程号放入字符存放位置
    buff_ptr[*pput_ptr] 'T'
    buff_ptr[*pput_ptr + 2] 'G'
    sleep(rate)
    printf(d供应商提供烟草c胶水c\ngetpid()buff_ptr[*pput_ptr] buff_ptr[*pput_ptr + 2])
    唤醒阻塞生产者
    up(pmtx_sem)
    唤醒阻塞消费者
    up(c_TG_sem)
    } else if(r 2) {
    down(prod_sem)
    果生产者正放产品生产者阻塞
    down(pmtx_sem)
    写字符形式模拟生产者放产品 报告进程号放入字符存放位置
    buff_ptr[*pput_ptr + 1] 'P'
    buff_ptr[*pput_ptr] 'T'
    sleep(rate)
    printf(d供应商提供烟草c纸c\ngetpid()buff_ptr[*pput_ptr] buff_ptr[*pput_ptr + 1])
    唤醒阻塞生产者
    up(pmtx_sem)
    唤醒阻塞消费者
    up(c_TP_sem)
    }
    }
    } else {
    while(1){
    int r rand() 3
    if(r 0) {
    down(prod_sem)
    果生产者正放产品生产者阻塞
    down(pmtx_sem)
    写字符形式模拟生产者放产品 报告进程号放入字符存放位置
    buff_ptr[*pput_ptr + 1] 'P'
    buff_ptr[*pput_ptr + 2] 'G'
    sleep(rate)
    printf(d 供 应 商 提 供 纸 c 胶 水 c\ngetpid()buff_ptr[*pput_ptr +
    1] buff_ptr[*pput_ptr + 2])
    唤醒阻塞生产者
    up(pmtx_sem)
    唤醒阻塞消费者
    up(c_PG_sem)
    } else if(r 1) {
    down(prod_sem)
    果生产者正放产品生产者阻塞
    down(pmtx_sem)
    写字符形式模拟生产者放产品 报告进程号放入字符存放位置
    buff_ptr[*pput_ptr] 'T'
    buff_ptr[*pput_ptr + 2] 'G'
    sleep(rate)
    printf(d供应商提供烟草c胶水c\ngetpid()buff_ptr[*pput_ptr] buff_ptr[*pput_ptr + 2])
    唤醒阻塞生产者
    up(pmtx_sem)
    唤醒阻塞消费者
    up(c_TG_sem)
    } else if(r 2) {
    down(prod_sem)
    果生产者正放产品生产者阻塞
    down(pmtx_sem)
    写字符形式模拟生产者放产品 报告进程号放入字符存放位置
    buff_ptr[*pput_ptr + 1] 'P'
    buff_ptr[*pput_ptr] 'T'
    sleep(rate)
    printf(d供应商提供烟草c纸c\ngetpid()buff_ptr[*pput_ptr] buff_ptr[*pput_ptr + 1])
    唤醒阻塞生产者
    up(pmtx_sem)
    唤醒阻塞消费者
    up(c_TP_sem)
    }
    }
    }
    return EXIT_SUCCESS
    }


    consumerc文件:

    #include ipch
    int main(int argcchar *argv[])
    {
    int rate
    命令行第参数指定进程睡眠秒数调解进程执行速度
    if(argv[1] NULL) rate atoi(argv[1])
    else rate 3 指定 3 秒
    享存 变量
    buff_key 101 缓区键值
    buff_num 3 缓区长度
    cget_key 103 消费者取产品指针键值
    cget_num 1 指针数
    shm_flg IPC_CREAT | 0644 享存读写权限
    获取缓区享存buff_ptr 指缓区首址
    buff_ptr (char *)set_shm(buff_keybuff_numshm_flg)
    获取消费者取产品指针cget_ptr 指索引址
    cget_ptr (int *)set_shm(cget_keycget_numshm_flg)
    信号量变量
    prod_key 201 生产者步信号灯键值
    cmtx_key 203 生产者互斥信号灯键值
    c_PG_key 301消费者步信号灯键值
    c_TP_key 302消费者互斥信号灯键值
    c_TG_key 303消费者互斥信号灯键值
    sem_flg IPC_CREAT | 0644 信号灯操作权限
    生产者步信号灯初值设缓区量
    sem_val 1
    获取生产者步信号灯引标识存 prod_sem
    prod_sem set_sem(prod_keysem_valsem_flg)
    消费者初始产品取步信号灯初值设 0
    sem_val 0
    获取消费者步信号灯引标识存 cons_sem
    c_PG_sem set_sem(c_PG_keysem_valsem_flg)
    c_TP_sem set_sem(c_TP_keysem_valsem_flg)
    c_TG_sem set_sem(c_TG_keysem_valsem_flg)
    消费者互斥信号灯初值 1
    sem_val 1
    获取消费者互斥信号灯引标识存 pmtx_sem
    cmtx_sem set_sem(cmtx_keysem_valsem_flg)
    int pid1 pid2
    pid1 fork()
    if(pid1 0) {
    循环执行模拟消费者断取产品
    while(1){
    果产品消费者阻塞
    down(c_PG_sem)
    果消费者正取产品消费者阻塞
    down(cmtx_sem)
    读字符形式模拟消费者取产品报告进程号获取字符读取位置
    sleep(rate)
    printf(d 吸烟者烟草 T纸c 胶水c开始吸烟\n
    getpid()buff_ptr[*cget_ptr + 1]buff_ptr[*cget_ptr + 2])
    唤醒阻塞消费者
    up(cmtx_sem)
    唤醒阻塞生产者
    up(prod_sem)
    }
    } else {
    pid2 fork()
    if(pid2 0) {
    循环执行模拟消费者断取产品
    while(1){
    果产品消费者阻塞
    down(c_TP_sem)
    果消费者正取产品消费者阻塞
    down(cmtx_sem)
    读字符形式模拟消费者取产品 报告进程号获取字符读取位置
    sleep(rate)
    printf(d 吸烟者胶水 G纸c 烟草c开始吸烟\n
    getpid()buff_ptr[*cget_ptr + 1]buff_ptr[*cget_ptr])
    唤醒阻塞消费者
    up(cmtx_sem)
    唤醒阻塞生产者
    up(prod_sem)
    }
    } else {
    循环执行模拟消费者断取产品
    while(1){
    果产品消费者阻塞
    down(c_TG_sem)
    果消费者正取产品消费者阻塞
    down(cmtx_sem)
    读字符形式模拟消费者取产品 报告进程号获取字符读取位置
    sleep(rate)
    printf(d 吸烟者纸 P胶水c 烟草c开始吸烟\n
    getpid()buff_ptr[*cget_ptr + 2]buff_ptr[*cget_ptr])
    唤醒阻塞消费者
    up(cmtx_sem)
    唤醒阻塞生产者
    up(prod_sem)
    }
    }
    }
    return EXIT_SUCCESS
    }



    三 存页面置换算法实验
    41 实验目
    加深存储理解掌握虚拟存储器实现原理观察解重页面置换算法置换程练模拟算法编程技巧锻炼分析试验数力
    42示例实验
    421实验容
    1示例实验程序中模拟两种置换算法:LRU 算法 FIFO 算法
    2两种算法定意序列页面引串意帧实存块数组合测试显示页置换程
    3统计报告置换算法情况次淘汰页号缺页次数(页错误数)缺页率较两种置换算法定条件优劣
    4方便扩充页面置换算法更描述置换程示例实验程采 C++语言 Replace 类描述置换算法属性
    422实验演示结果

    43独立实验
    431实验容
    请示例实验程序中补充增强二次机会等置换算法模拟程序输入存页面引串实存帧数观察分析页面置换效果性 LRU FIFO 算法进行较改进示例实验程序够机产生存页面引串便动态观测种置换算法性
    432实验步骤
    4321算法设计
    Clock()算法:
    FIFO算法会常页面置换出避免问题该算法做简单修改:检查老页面R位果R位0页面老没立刻置换掉果R位1R位清0页面重新插入链表尾端然继续搜索第二次机会算法寻找时间间隔未访问页面果页面访问算法纯粹FIFO算法
    EClock()算法:
    需存中页面访问位A修改位M分4类
    第类(A0M0)未访问未修改佳换页
    第二类(A0M1)未访问修改次佳换页
    第三类(A1M0)访问未修改访问
    第四类(A1M1)访问修改访问
    程序首先查找第类页面果换果没查找第二类页面置页面访问位0果换果没返回重新查找第类页面果换果没查找第二类页面定存该算法适某页面常修改场合
    LFU()算法:
    常页置换算法求页置换时置换引计数页常页应该较引次数页开始时次数类页会长时间留存中引计数寄存器定时右移位形成指数衰减均次数
    MFU算法:
    LFU算法相反常页置换算法认引次数页会常
    4322开发调试程
    建立vmrpcc程序代码写程序中 
    建立名vmrphC语言头文件
    建立项目理文件Makefile
    输入make命令编译连接生成执行vmrp程序
    执行程序
    4323思考分析
    433实验演示结果



    434实验代码
    vmrpcc文件:

    #include vmrph
    #include
    #include

    using namespace std

    ReplaceReplace()
    {
    int i
    设定总访问页数分配相应引页号淘汰页号记录数组空间
    cout << Please input page numbers
    cin >> PageNumber

    ReferencePage new int[sizeof(int) * PageNumber]
    EliminatePage new int[sizeof(int) * PageNumber]

    输入引页号序列(页面走)初始化引页数组
    cout << Please input reference page string

    for (i 0 i < PageNumber i++)
    cin >> ReferencePage[i]引页暂存引数组

    设定存实页数(帧数)分配相应实页号记录数组空间(页号栈)
    cout << Please input page frames
    cin >> FrameNumber

    PageFrames new int[sizeof(int) * FrameNumber]
    }

    Replace~Replace()
    {
    }

    void ReplaceInitSpace(char * MethodName)
    {
    int i
    cout << endl << MethodName << endl
    FaultNumber0

    引未开始1 表示引页
    for (i 0 i < PageNumber i++)
    EliminatePage[i] 1
    for(i 0 i < FrameNumber i++)
    PageFrames[i] 1
    }

    分析统计选择算法前输入页面走性
    void ReplaceReport(void)
    {
    报告淘汰页序
    cout << endl << Eliminate page

    for(int i0 EliminatePage[i]1 i++)
    cout << EliminatePage[i] <<

    报告缺页数缺页率
    cout << endl << Number of page faults << FaultNumber << endl
    cout << setw(6) << setprecision(3)
    cout << Rate of page faults << 100*(float)FaultNumber(float)PageNumber << <
    }


    旧未置换算法
    void ReplaceLru(void)
    {
    int ijklnext
    InitSpace(LRU)

    循环装入引页
    for(k0l0 k < PageNumber k++)
    {
    nextReferencePage[k]
    检测引页前否已实存
    for (i0 i {
    if(next PageFrames[i])
    {
    引页已实存调整页记录栈顶
    next PageFrames[i]
    for(jij>0j)
    PageFrames[j] PageFrames[j1]
    PageFrames[0]next
    break
    }
    }
    if(PageFrames[0] next)
    {
    果引页已放栈顶缺页报告前存页号
    for(j0 j if(PageFrames[j]>0)
    cout << PageFrames[j] <<
    cout << endl
    continue 继续装入页
    }
    else
    果引页未放栈顶缺页缺页数加 1
    FaultNumber++

    栈底页号记入淘汰页数组中
    EliminatePage[l] PageFrames[FrameNumber1]
    压栈
    for(jFrameNumber1j>0j)
    PageFrames[j] PageFrames[j1]
    PageFrames[0]next 引页放栈顶
    报告前实存中页号
    for(j0 j if(PageFrames[j]>0)
    cout << PageFrames[j] <<
    报告前淘汰页号
    if(EliminatePage[l]>0)
    cout << > << EliminatePage[l++] << endl
    else
    cout << endl
    }
    分析统计选择算法前引页面走性
    Report()
    }


    先进先出置换算法
    void ReplaceFifo(void)
    {
    int ijklnext
    InitSpace(FIFO)

    循环装入引页
    for(k0jl0 k < PageNumber k++)
    {
    nextReferencePage[k]
    果引页已实存中报告实存页号
    for (i0 i if(nextPageFrames[i])
    break
    if (i {
    for(i0 i cout << PageFrames[i] <<
    cout << endl
    continue 继续引页
    }

    引页实存中缺页数加 1
    FaultNumber++
    EliminatePage[l] PageFrames[j] 先入页号记入淘汰页数组
    PageFrames[j]next 引页号放先入页号处
    j (j+1)FrameNumber 先入页号循环移
    报告前实存页号淘汰页号
    for(i0 i if(PageFrames[i]>0)
    cout << PageFrames[i] <<
    if(EliminatePage[l]>0)
    cout << > << EliminatePage[l++] << endl
    else
    cout << endl
    }
    分析统计选择算法前引页面走性
    Report()
    }

    void ReplaceClock(void)
    {
    int ijklnext
    InitSpace(Clock)
    循环装入引页
    int flag[100]
    for(i0i flag[i]0初始位0
    for(k0jl0k {
    nextReferencePage[k]
    果引页已实存中报告实存页号
    for(i0i if(nextPageFrames[i])
    break
    if(i {
    flag[i]1
    for(i0i cout< cout< continue 继续引页
    }
    引页实存中缺页数加 1
    FaultNumber++
    int a
    for(a0a if(PageFrames[a]1)空余帧直接放入
    {
    PageFrames[a]next
    break
    }
    if(aFrameNumber)
    {
    flag[a]1
    for(i0i cout< cout< continue
    }
    int jj0
    for(j0j if(flag[j]0)
    {
    jjj
    break
    }
    else
    {
    flag[j]0
    }
    if(jFrameNumber)
    jj0
    flag[jj]1
    EliminatePage[l]PageFrames[jj] 先入页号记入淘汰页数组
    PageFrames[jj]next 引页号放先入页号处
    报告前实存页号淘汰页号
    for(i0i if(PageFrames[i]>0)
    cout << PageFrames[i] <<
    if(EliminatePage[l]>0)
    cout << > << EliminatePage[l++] << endl
    else
    cout << endl
    }
    分析统计选择算法前引页面走性
    Report()
    }
    void ReplaceEclock (void)
    {
    int ijklnext
    InitSpace(Eclock)
    循环装入引页
    int flag[2][100]
    for(j0j<2j++)
    for(i0i flag[j][i]0
    for(k0jl0k {
    nextReferencePage[k]
    果引页已实存中报告实存页号
    for(i0i if(nextPageFrames[i])
    break
    if(i {
    flag[0][i]1访问位
    flag[1][i]0修改访问位
    for(int kk0kk if(kki)
    {
    flag[0][i]0
    }
    for(i0i cout< cout< continue 继续引页
    }
    引页实存中缺页数加 1
    FaultNumber++
    int a
    for(a0a if(PageFrames[a]1)
    {
    PageFrames[a]next
    break
    }
    if(aFrameNumber)
    {
    flag[0][a]1
    flag[0][a]0
    for(i0i cout< cout< continue
    }
    int jj0jjj0flagg0
    for(j0j if((flag[0][j] {
    flaggj
    jjflag[0][j]
    jjjflag[1][j]
    }
    jjflagg
    EliminatePage[l]PageFrames[jj] 先入页号记入淘汰页数组
    PageFrames[jj]next 引页号放先入页号处
    报告前实存页号淘汰页号
    flag[0][jj]1
    flag[1][jj]1
    for(int kk0kk if(kkjj)
    {
    flag[0][i]0
    }
    for(i0i if(PageFrames[i]>0)
    cout << PageFrames[i] <<
    if(EliminatePage[l]>0)
    cout << > << EliminatePage[l++] << endl
    else
    cout << endl
    }
    分析统计选择算法前引页面走性
    Report()
    }
    void ReplaceLfu(void)
    {
    int ijklnext
    InitSpace(Lfu)
    循环装入引页
    int flag[100]
    for(i0i flag[i]0
    for(k0jl0k {
    nextReferencePage[k]
    果引页已实存中报告实存页号
    for(i0i if(nextPageFrames[i])
    break
    if(i {
    flag[i]++
    for(i0i cout< cout< continue 继续引页
    }
    引页实存中缺页数加 1
    FaultNumber++
    int a20jj
    for(a0a if(PageFrames[a]1)
    {
    PageFrames[a]next
    break
    }
    if(aFrameNumber)
    {
    for(i0i cout< cout< continue
    }
    a20
    for(j0j if(flag[j] {
    aflag[j]
    jjj
    }
    flag[jj]1
    EliminatePage[l]PageFrames[jj] 先入页号记入淘汰页数组
    PageFrames[jj]next 引页号放先入页号处
    报告前实存页号淘汰页号
    for(i0i if(PageFrames[i]>0)
    cout << PageFrames[i] <<
    if(EliminatePage[l]>0)
    cout << > << EliminatePage[l++] << endl
    else
    cout << endl
    }
    分析统计选择算法前引页面走性
    Report()
    }
    void ReplaceMfu(void)
    {
    int ijklnext
    InitSpace(Mfu)
    循环装入引页
    int flag[100]
    for(i0i flag[i]0
    for(k0jl0k {
    nextReferencePage[k]
    果引页已实存中报告实存页号
    for(i0i if(nextPageFrames[i])
    break
    cout< if(i {
    flag[i]++
    for(i0i cout< cout< continue 继续引页
    }
    引页实存中缺页数加 1
    FaultNumber++
    int a1jj
    for(a0a if(PageFrames[a]1)
    {
    PageFrames[a]next
    break
    }
    if(aFrameNumber)
    {
    for(i0i cout< cout< continue
    }
    a1
    for(j0j if(flag[j]>a)
    {
    aflag[j]
    jjj
    }
    flag[jj]1
    EliminatePage[l]PageFrames[jj] 先入页号记入淘汰页数组
    PageFrames[jj]next 引页号放先入页号处
    报告前实存页号淘汰页号
    for(i0i if(PageFrames[i]>0)
    cout << PageFrames[i] <<
    if(EliminatePage[l]>0)
    cout << > << EliminatePage[l++] << endl
    else
    cout << endl
    }
    分析统计选择算法前引页面走性
    Report()
    }


    int main(int argcchar *argv[])
    {

    Replace * vmpr new Replace()
    vmpr>Lru()
    vmpr>Fifo()
    vmpr>Clock()
    vmpr>Eclock()
    vmpr>Lfu()
    vmpr>Mfu()

    return 0
    }

    vmrph文件:

    #include
    #include
    #include

    class Replace
    {

    public
    Replace()
    ~Replace()
    void InitSpace(char * MethodName) 初始化页号记录
    void Report(void) 报告算法执行情况
    void Fifo(void) 先进先出算法
    void Lru(void) 旧未算法
    void Clock(void) 时钟(二次机会)置换算法
    void Eclock(void) 增强二次机会置换算法
    void Lfu(void) 常置换算法
    void Mfu(void) 常置换算法
    private
    int * ReferencePage 存放访问页号
    int * EliminatePage 存放淘汰页号
    int * PageFrames 存放前正实存中页号
    int PageNumber 访问页数
    int FrameNumber 实存帧数
    int FaultNumber 失败页数

    }

    四 磁盘移臂调度算法实验
    51 实验目
    加深操作系统设备理技术解 体验磁盘移臂调度算法重性掌握种重磁盘移臂调度算法练模拟算法编程技巧锻炼研究分析试验数力
    52示例实验
    521实验容
    1示例实验程序中模拟两种磁盘移臂调度算法:SSTF 算法 SCAN 算法
    2两种算法定意序列磁盘请求序列显示响应磁盘请求程
    3统计报告算法情况响应请求序移臂总量较两种算法定条件优劣
    4方便扩充磁盘移臂调度算法更描述磁盘移臂调度程示例实验程序采 C++语言 DiskArm 类描述磁盘移臂调度算法属性
    522实验演示结果

    53独立实验
    531实验容
    请示例实验程序中补充 SCANCSCANLOOK 磁盘移臂调度算法模拟程序输入磁盘柱面请求序列观察分析调度效果性FCFS SSTF 算法进行较改进示例实验程序够机产生磁盘柱面请求序列便动态观测种调度算法性
    532实验步骤
    5321算法设计
    扫描算法(SCAN): 
    磁臂磁盘端端移动时磁头移柱面时处理位该柱面服务请求达端时磁头改变方处理继续磁头磁盘回扫描时称电梯算法算法基克服短寻道时间优先算法服务集中中间磁道响应时间变化较缺点具短寻道时间优先算法优点吞吐量较均响应时间较摆动式扫描方法两侧磁道访问频率低中间磁道
    例中开始时53号柱面执行操作读写磁头移动臂方里外趋37号柱面位置访问53号柱面操作结束臂移动方柱面37号柱面应先37号柱面访问者服务然14号柱面访问者服务柱面0时磁头会调转方磁盘端移动处理柱面656798122124183
    循环扫描算法(CSCAN):
    循环扫描算法扫描算法改进果磁道访问请求均匀分布磁头达磁盘端反运动时落磁头访问请求相较少磁道刚处理磁盘端请求密度相高访问请求等时间较长解决种情况循环扫描算法规定磁头单移动例里外移动磁头移外访问磁道时磁头立返回里欲访磁道磁道号紧接着磁道号构成循环进行扫描
    例中已假定读写前位置53号柱面53号柱面继续外扫描次37140柱面访问者服务时移动臂已外柱面立返回199号柱面重新扫描次183124122986765号柱面访问者服务
    LOOK算法:
    LOOK算法SCAN算法种改进LOOK算法言磁头样圈外圈磁道间返移动LOOK算法发现移动方请求时立改变移动方SCAN算法需移动外圈圈时改变移动方
    5322开发调试程
    新建文件夹中建立 daskh 文件
    新建文件夹中建立 daskcc 文件
    新建文件夹中建立 Makefile 文件
    执行 make 命令编译连接生成执行文件 dask
    执行 dask 命令输入前道号前寻道方前请求寻道数前请求寻
    道道号串
    5323思考分析
    SCANCSCAN磁盘负荷较系统会执行更产生饿死问题
    SCAN算法基克服短寻道时间优先算法服务集中中间磁道响应时间变化较缺点具短寻道时间优先算法优点吞吐量较均响应时间较摆动式扫描方法两侧磁道访问频率低中间磁道
    533实验演示结果

    534实验代码
    daskcc文件
    #include daskh

    DiskArmDiskArm(){

    int i

    输入前道号

    cout << Please input Current cylinder

    cin >> CurrentCylinder

    磁头方输入 0 表示道号移动1 表示道号移动

    cout << Please input Current Direction (01)

    cin >> SeekDirection

    输入磁盘请求数请求道号

    cout << Please input Request Numbers

    cin >> RequestNumber

    cout << Please input Request cylinder string

    Request new int[sizeof(int) * RequestNumber]

    Cylinder new int[sizeof(int) * RequestNumber]

    for (i 0 i < RequestNumber i++)

    cin >> Request[i]

    }

    DiskArm~DiskArm(){

    }

    初始化道号寻道记录

    void DiskArmInitSpace(char * MethodName)

    {

    int i

    cout << endl << MethodName << endl

    SeekNumber 0

    SeekChang 0

    for (i 0 i < RequestNumber i++)

    Cylinder[i] Request[i]

    }

    统计报告算法执行情况

    void DiskArmReport(void){

    cout << endl

    cout << Seek Number << SeekNumber << endl

    cout << Chang Direction << SeekChang << endl << endl

    }

    先先服务算法

    void DiskArmFcfs(void)

    {

    int Current CurrentCylinder

    int Direction SeekDirection

    InitSpace(FCFS)

    cout << Current

    for(int i0 i
    if(((Cylinder[i] > Current) && Direction)||((Cylinder[i] < Current) && Direction)){

    需调头

    SeekChang++ 调头数加 1

    Direction Direction 改变方标志

    报告前响应道号

    cout << endl << Current << > << Cylinder[i]

    }

    else 需调头报告前响应道号

    cout << > << Cylinder[i]

    累计寻道数响应道号变前道号

    SeekNumber + abs(Current Cylinder[i])

    Current Cylinder[i]

    }

    报告磁盘移臂调度情况

    Report()

    }

    void DiskArmSstf(void)

    {

    int Shortest

    int Distance 999999

    int Direction SeekDirection

    int Current CurrentCylinder

    InitSpace(SSTF)

    cout << Current

    for(int i0 i
    查找前道号

    for(int j0 j
    if(Cylinder[j] 1) continue 1 表示已响应

    if(Distance > abs(CurrentCylinder[j])){

    道号前距离道号前距离

    Distance abs(CurrentCylinder[j])

    Shortest j

    }

    }

    if((( Cylinder[Shortest] > Current) && Direction)||(( Cylinder[Shortest] < CurrentCylinder) && Direction)){

    需调头

    SeekChang++ 调头数加 1

    Direction Direction 改变方标志

    报告前响应道号

    cout << endl << Current << > << Cylinder[Shortest]

    }

    else 需调头报告前响应道号

    cout << > << Cylinder[Shortest]

    累计寻道数响应道号变前道号

    SeekNumber + abs(Current Cylinder[Shortest])

    Current Cylinder[Shortest]

    恢复距离销响应道号

    Distance 999999

    Cylinder[Shortest] 1

    }

    Report()

    }



    电梯调度算法

    void DiskArmScan(void){

    int Current CurrentCylinder

    int Direction SeekDirection

    InitSpace(SCAN)
    cout << Current 印出前道号


    for(int i0 i
    int index1

    int Distance 999999

    for(int j0j
    if(Cylinder[j]1)

    continue

    else if((Direction0&&Cylinder[j]
    ||(Direction1&&Cylinder[j]>Current&&(Cylinder[j]Current)
    indexj

    Distanceabs(CurrentCylinder[j])

    }

    }



    if(Direction0){

    if(index1){

    cout<<><
    SeekNumber+CurrentCylinder[index]

    CurrentCylinder[index]

    Cylinder[index]1

    }else{

    cout<<><<0<
    SeekNumber+Current

    DirectionDirection

    cout<<0

    Current0

    SeekChang++

    i

    }



    }

    else if(Direction1){

    if(index1){

    cout<<><
    SeekNumber+Cylinder[index]Current

    CurrentCylinder[index]

    Cylinder[index]1

    }else{

    cout<<><<199<
    SeekNumber+199Current

    DirectionDirection

    cout<<199

    Current199

    SeekChang++

    i

    }

    }



    }

    报告磁盘移臂调度情况

    Report()

    }

    LOOK调度算法

    void DiskArmLook(void){

    int Current CurrentCylinder

    int Direction SeekDirection

    InitSpace(Look)

    cout << Current



    for(int i0 i
    int index1

    int Distance 999999

    for(int j0j
    if(Cylinder[j]1)

    continue

    else if((Direction0&&Cylinder[j]
    ||(Direction1&&Cylinder[j]>Current&&(Cylinder[j]Current)
    indexj

    Distanceabs(CurrentCylinder[j])

    }

    }



    if(Direction0){

    if(index1){

    cout<<><
    SeekNumber+CurrentCylinder[index]

    CurrentCylinder[index]

    Cylinder[index]1

    }else{

    cout<
    DirectionDirection

    SeekChang++

    i

    }



    }

    else if(Direction1){

    if(index1){

    cout<<><
    SeekNumber+Cylinder[index]Current

    CurrentCylinder[index]

    Cylinder[index]1

    }else{

    cout<
    DirectionDirection

    SeekChang++

    i

    }

    }



    }

    报告磁盘移臂调度情况

    Report()

    }

    CScan调度算法

    void DiskArmCScan(void)

    {

    int Current CurrentCylinder

    int Direction SeekDirection

    InitSpace(CScan)

    cout << Current

    for(int i0 i
    int index1

    int Distance 999999

    for(int j0j
    if(Cylinder[j]1)

    continue

    else if((Direction0&&Cylinder[j]
    ||(Direction1&&Cylinder[j]>Current&&(Cylinder[j]Current)
    indexj

    Distanceabs(CurrentCylinder[j])

    }

    }



    if(Direction0){

    if(index1){

    cout<<><
    SeekNumber+CurrentCylinder[index]

    CurrentCylinder[index]

    Cylinder[index]1

    }else{

    cout<<><<0<
    SeekNumber+Current

    Current199

    cout<<0>199

    SeekChang++

    i

    }



    }

    else if(Direction1){

    if(index1){

    cout<<><
    SeekNumber+Cylinder[index]Current

    CurrentCylinder[index]

    Cylinder[index]1

    }else{

    cout<<><<199<
    SeekNumber+199Current

    Current0

    SeekChang++

    i

    }

    }

    }

    Report()

    }

    程序启动入口

    int main(int argcchar *argv[]){

    建立磁盘移臂调度类

    DiskArm *dask new DiskArm()

    较分析 FCFS SSTF 两种调度算法性

    dask>Fcfs()

    dask>Sstf()

    dask>Scan()

    dask>CScan()

    dask>Look()

    }


    daskh文件:
    #include

    #include

    #include

    #include

    #include

    using namespace std

    class DiskArm{

    public

    DiskArm()

    ~DiskArm()

    void InitSpace(char * MethodName) 初始化寻道记录

    void Report(void) 报告算法执行情况

    void Fcfs(void) 先先服务算法

    void Sstf(void) 短寻道时间优先算法

    void Scan(void) 电梯调度算法

    void CScan(void) 均匀电梯调度算法

    void Look(void) LOOK 调度算法

    private

    int *Request

    磁盘请求道号

    int *Cylinder

    工作柱面道号号

    int RequestNumber

    磁盘请求数

    int CurrentCylinder

    前道号

    int SeekDirection

    磁头方

    int SeekNumber

    移臂总数

    int SeekChang

    磁头调头数

    }




    文档香网(httpswwwxiangdangnet)户传

    《香当网》用户分享的内容,不代表《香当网》观点或立场,请自行判断内容的真实性和可靠性!
    该内容是文档的文本内容,更好的格式请下载文档

    下载文档到电脑,查找使用更方便

    文档的实际排版效果,会与网站的显示效果略有不同!!

    需要 2 香币 [ 分享文档获得香币 ]

    下载文档

    相关文档

    操作系统进程管理实验报告

    操作系统进程管理实验报告实验一 进程管理1.实验目的:(1)加深对进程概念的理解,明确进程和程序的区别;(2)进一步认识并发执行的实质;(3)分析进程争用资源的现象,学习解决进程互斥的方法;...

    1年前   
    353    0

    驱动程序实验报告操作系统课程设计报告

    操作系统课程设计报告班级: 计科 姓名: 学号: 老师: 时间:2012年X月X日一、设计目的操作...

    1年前   
    296    0

    操作系统实验报告C语言实现银行家算法

    实 验 报 告题 目名 称C语言实现银行家算法院 系信息科学与工程学院班 级完成时间指导老师本次实验成绩组长联系电话邮件地址组员(姓名,学号)主要任务程序算法的编写、实现、运行调...

    3年前   
    466    0

    计算机操作系统内存分配实验报告

    计算机操作系统内存分配实验报告一、实验目的熟悉主存的分配与回收。理解在不同的存储管理方式下,如何实现主存空间的分配与回收。掌握动态分区分配方式中的数据结构和分配算法及动态分区存储管理方式及其实...

    3年前   
    603    0

    大二下学期期未总结

    大二下学期期未总结  大二下学期即将结束,大学生活已经过半,我班在各方面都取得了不错的成绩,广大同学依然延续着团结,活泼,互助奋进的班风,并逐渐走向成熟。   一,班级工作方面   1.班级气...

    11年前   
    402    0

    大二下学期金工实习报告

    大二下学期金工实习报告  金工实习报告  大二下学期刚开始,我们专业便与众不同起来,开学的第十个周全部是金工实习。说真的,刚开始的时候,感觉时间好漫长呢,四个周呀,我们什么时候才能熬过这实习的...

    10年前   
    568    0

    大二下学期期未总结

    大二下学期期未总结第一篇:大二下学期期未总结大二下学期即将结束,大学生活已经过半,我班在各方面都取得了不错的成绩,广大同学依然延续着团结,活泼,互助奋进的班风,并逐渐走向成熟。 一,班级工作方...

    12年前   
    488    0

    备战操作系统

    操作系统 操作系统概念:操作系统是控制其他程序运行,管理资源并为用户提供操作界面的系统软件的集合。 操作系统的功能有:处理机管理、存储管理、外围设备管理(又称I/0设备管理)、文件管理和操...

    9年前   
    7523    0

    山东大学服务省会济南工作计划山东大学服务省会济南工作计划

    山东大学服务省会济南工作计划山东大学服务省会济南工作计划山东大学是一所诞生于济南、主要依托于济南而成长壮大的百年名校。        2000年7月,原山东大学、山东医科大学和山东工业大学三校...

    11年前   
    471    0

    大二下学期班级工作总结

    大二下学期班级工作总结  回顾过去的半年,我们市场营销0601班积极进取,开拓创新,工作学习各方面都有了较为满意的成绩。为了在今后的学习工作中更多地取得成绩,避免失误,现将我班在大二这下学期的...

    9年前   
    402    0

    大二班下学期班级环境亮点

    大二班主题名称:《人与自然和谐,环保再利用》,习近平总书记讲话中提出“绿水青山就是金山银山。”我们班结合习近平总书记的精神和《指南》要求,以幼儿为中心,以经验为基础,引导幼儿运用多种美术手段表现...

    6年前   
    1728    0

    大二班下学期工作计划

    大二班下学期工作计划  新的学期开始了,为了更好地开展本学期的工作,现将我班工作计划制定如下:    一、班级情况分析:    我班现有幼儿45名,新生9名。通过中班一学年的活动和锻炼,每个幼...

    8年前   
    321    0

    大二下学期班级工作总结

    大二下学期班级工作总结  眨眼间,一个学期又过去了。相对比大一时候,工作方面会少一些,但学习方面变的相对地忙碌点儿。班里的同学不再是盲目地参加学院的一些文娱活动,他们更注重于学习方面。同学们更...

    8年前   
    527    0

    大二下学期学习工作计划

    大二下学期学习工作计划  屈指一数我们的大学时光只剩下仅仅的2年半了,用自己在大学过去的这1年半来说,2年半可能过的比我们这走过的一年半还要快的多,时间匆匆远去,留下的是我们肩上的责任,我们的...

    10年前   
    346    0

    2021年大二下学期个人总结

     2021年大二下学期个人总结撰写人:___________日 期:___________2021年大二下学期个人总结时间过得真快,转眼间又快到这个学期的最后阶段了。回顾一下过去,刚来到佛山...

    3年前   
    416    0

    2016年大二下学期期未总结

    2016年大二下学期期未总结  大二下学期即将结束,大学生活已经过半,我班在各方面都取得了不错的成绩,广大同学依然延续着团结,活泼,互助奋进的班风,并逐渐走向成熟。   一,班级工作方面   ...

    8年前   
    287    0

    大二下学期班级工作计划

    大二下学期班级工作计划  新的学期又开始了,时间过的很快,转眼间,我们已经进入大二下学期了。在这近2年的时间里,我们班的同学一起努力,取得了不错的成绩,班级同学彼此间的感情也不断加深。作为班长...

    10年前   
    446    0

    操作系统习题及答案

    操作系统习题与答案(经典型)第一章 引言(一)单项选择题1操作系统是计算机系统的一种( B )。A.应用软件 B.系统软件 c.通用软件 D.工具软件2.操作系统目的是提供一个供其他程序...

    3年前   
    791    0

    高级操作系统试题

    高级操作系统试题2.请求驱动式令牌传递方法中,若pi发出request消息后久未获得Token,该怎么处理?若引 入时戳,该算法应做何修改?答:在请求驱动式令牌传递方法中,或pi发出的requ...

    4年前   
    892    0

    《操作系统》在线作业

    《操作系统》在线作业

    4年前   
    3326    0

    文档贡献者

    文***享

    贡献于2021-05-06

    下载需要 2 香币 [香币充值 ]
    亲,您也可以通过 分享原创文档 来获得香币奖励!
    下载文档

    该用户的其他文档