操作系统杂项(五)

目录

一、简述Linux中fork函数的作用

二、简述孤儿进程和僵尸进程,如何解决僵尸进程

1、孤儿进程

2、僵尸进程

3、如何解决僵尸进程

三、简述守护进程,如何实现

1、守护进程

2、实现方式

四、简述进程通信的方式

1、管道

2、系统IPC

3、套接字socket

六、简述Linux进程调度算法及策略有哪些

1、先来先服务调度算法

2、短作业(进程)优先调度算法

3、高优先级优先调度算法

4、时间片轮转法

5、多级反馈队列调度算法


一、简述Linux中fork函数的作用

        Fork函数用来创建一个子进程。对于父进程,fork()函数返回新创建的子进程的PID。对于子进程,fork()函数调用成功会返回0。如果创建出错,fork()函数返回-1。

        其原型如下:

#include <unistd.h>

pid_t fork(void);

        Fork()函数不需要参数,返回值是一个进程标识符PID。返回值有以下三种情况:

        (1)对于父进程,返回新创建的子进程的PID;

        (2)对于子进程,调用成功返回0;

        (3)创建出错,返回-1。

        Fork()函数创建一个新进程后,会为这个新进程分配进程空间,将父进程的进出空间中的内容复制到子进程的进程空间中,包括父进程的数据段和堆栈段,并且和父进程共享代码段。这时候,子进程和父进程一模一样,都接受系统的调度。因为两个进程都停留在fork()函数中,最后fork()函数会返回两次,一次在父进程中返回,一次在子进程中返回,两次返回的值不一样,如上面的三种情况。

二、简述孤儿进程和僵尸进程,如何解决僵尸进程

1、孤儿进程

        孤儿进程是指一个父进程退出后,它的一个或多个子进程还在运行,那么这些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并且由init进程对它们完整状态收集工作。

2、僵尸进程

        僵尸进程是指一个进程使用fork函数创建子进程,如果子进程退出,而父进程并没有调用wait()或者waitpid()系统调用取得子进程的终止状态,那么子进程的进程描述符仍然保存在系统中,占用系统资源。这种进程称为僵尸进程。

3、如何解决僵尸进程

        (1)一般来说,为了防止产生僵尸进程,在fork子进程之后我们都要及时使用wait系统调用,同时当子进程退出的时候,内核都会给父进程一个SIGCHLD信号,所以我们可以建立一个捕获SIGCHLD信号的信号处理函数,在函数体中调用wait(或waitpid),就可以清理退出的子进程以达到防止僵尸进程的目的

        (2)使用kill命令

        打开终端并输入下面的命令:

ps aux | grep Z

        会列出进程表中所有僵尸进程的详细内容。然后输入命令:

kill -s SIGCHLD pid(父进程pid)

三、简述守护进程,如何实现

1、守护进程

        守护进程是运行在后台的一种生存期长的特殊进程。它独立于控制终端,处理一些系统级别任务。

2、实现方式

        (1)创建子进程,终止父进程。方法是调用fork()产生一个子进程,然后父进程退出;

        (2)调用setsid()创建一个会话;

        (3)将当前目录更改为根目录。使用fork()创建的子进程也继承了父进程的当前工作目录;

        (4)重设文件权限掩码。文件权限掩码是指屏蔽掉文件权限中的对应位;

        (5)关闭不再需要的文件描述符。子进程从父进程继承打开的文件描述符。

实现代码如下:

#include <stdiio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <sys/stat.h>

#define MAXFILE 65535

int main()
{
    //第一步:创建进程
    int pid = fork();
    if(pid > 0)
        exit(0);   //结束父进程
    else if(pid < 0)
    {
        printf("fork error!\n");
        exit(1);   //fork失败,退出
    }

    //第二步:子进程成为新的会话组长和进程组长,并与控制终端分离
    setsid();
    //第三步:改变工作目录到
    chdir("/");
    //第四步:重设文件的创建掩码
    umask(0);
    //第五步:关闭打开的文件描述符
    for(int i = 0; i < MAXFILE; ++i)
    {
        close(i);
        sleep(2);
    }
    return 0;
}

四、简述进程通信的方式

        进程间通信主要包括管道系统IPC(包括消息队列、信号量、信号、共享内存)、套接字socket

1、管道

        包括无名管道和命名管道,无名管道半双工,只能用于具有亲缘关系的进程之间的通信(父子进程或兄弟进程),可以看作是一种特殊文件。命名管道可以允许无亲缘关系进程间的通信。

2、系统IPC

        ①消息队列:消息的链接表,放在内核中。消息队列独立于发送与接收进程,进程终止时,消息队列及其内容不会被删除。消息队列可以实现消息的随机查询,可以按照消息的类型读取。

        ②信号量:是一个计数器,可以原来控制多个进程对共享资源的访问。信号量用于实现进程间的互斥与同步。

        ③同步:用于通知接收进程某个事件的发生。

        ④内存共享:使多个进程访问同一块内存空间。

3、套接字socket

        用于不同主机直接的通信。

五、简述进程同步的方式

        1、信号量semaphore:是一个计数器,可以原来控制多个进程对共享资源的访问。信号量用于实现进程间的互斥与同步。P操作(递减操作)可以用于阻塞一个进程,V操作(增加操作)可以用于解除阻塞一个进程。

        2、管道:一个进程通过调用管程的一个过程进入管程。在任何时候,只能有一个进程在管程中执行,调用管程的任何其它进程都被阻塞,以等待管程可用。

        3、消息队列:消息的链接表,放在内核中。消息队列独立于发送与接收进程,进程终止时,消息队列及其内容不会被删除。消息队列可以实现消息的随机查询,可以按照消息的类型读取。

六、简述Linux进程调度算法及策略有哪些

1、先来先服务调度算法

        每次调度都是从后备作业(进程)队列中选择一个或多个最先进入该队列的作业(进程),将它们调入内存,为它们分配资源、创建进程,然后放入就绪队列。

2、短作业(进程)优先调度算法

        短作业优先(SJF)调度算法是从后备队列中选择一个或若干个估计运行时间最短的作业(进程),将它们调入内存运行。

3、高优先级优先调度算法

        系统将从后备队列中选择若干个优先权最高的作业装入内存。当用于进程调度时,该算法是把处理机分配给就绪队列中优先权最高的进程。

4、时间片轮转法

        每次调度时,把CPU分配给队首进程,并令其执行一个时间片。时间片的大小从几ms到几百ms。当执行的时间片用完时,由一个计时器发出时钟中断请求,调度程序便根据此信号来停止该进程的执行,并将其送往就绪队列的队尾。然后,再把处理机分配给就绪队列中新的队首进程,同时也让它执行一个时间片。

5、多级反馈队列调度算法

        综合上面的多种调度算法。

在这些调度算法中,有抢占式和非抢占式的区别。

        (1)非抢占式优先权算法

        这种情况下,系统一旦把处理机分配给就绪队列中优先权最高的进程后,该进程便一直执行下去,直至完成。或因为发生某事件使得该进程放弃处理机时,系统才可以再将处理机重新分配给另一优先权最高的进程。这种调度算法主要用于批处理系统中,也可以用于某些实时性要求不严格的实时系统中。

        (2)抢占式优先权算法

           这种情况下,系统同样是把处理机分配给优先权最高的进程,使之执行。但在其执行期间,只要又出现另一个优先权更高的进程,进程调度程序将立即停止当前进程(原优先权最高的进程)的执行,重新将处理机分配给新到的优先权最高的进程。因此,在采用这种调度算法时,是每当系统中出现一个新的就绪进程i时,就将其优先权Pi与正在执行的进程j的优先权Pj进行比较,如果Pi≤Pj,原进程Pj便继续执行;但如果是Pi>Pj,则立即停止Pj的执行,做进程切换,使i进程投入执行。显然,这种抢占式的优先权调度算法能够更好地满足紧迫作业的要求,故而常用于要求比较严格的实时系统中,以及性能要求较高的批处理和分时系统中。

        区别:

        非抢占式(Nonpreemptive):让进程运行直到结束或阻塞的调度方式,容易实现,适用于专用系统,不适用与通用系统。

        抢占式(Preemptive):允许将逻辑上可继续运行的在运行过程中暂停的调度方式可防止单一进程长时间独占,CPU系统开销大(降低途径:硬件实现进程切换,或扩大主存以贮存大部分程序)。

  • 10
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猿何试Bug个踌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值