操作系统基础训练十个问题及解答

来源:互联网 发布:mac qq 讨论组 改昵称 编辑:程序博客网 时间:2024/06/16 18:32

1、简述Linux进程内存空间分为哪几个段?作用分别是什么?

Linux的内存空间简单可以分为5个部分:

  • Text(代码区):这里存放的是CPU要执行的指令。代码段是可共享的,相同的代码在内存中只会有一个拷贝,同时这个段是只读的,防止程序由于错误而修改自身的指令。
  • Data(数据区):这里存放的是程序中需要明确赋初始值的变量,例如位于所有函数之外的全局变量:int val=100(初始化为0的全局变量放在.bss段中)。需要强调的是,以上两段都是位于程序的可执行文件中,内核在调用exec函数启动该程序时从源程序文件中读入。
  • Bss(静态区or全局区):位于这一段中的数据,内核在执行该程序前,将其初始化为0或者null。例如出现在任何函数之外的全局变量:int sum;
  • Stack:函数中的局部变量以及在函数调用过程中产生的临时变量都保存在此段中。
  • Heap:存放new/malloc等动态申请的变量,用户必须手动进行delete/free操作。 其中Stack和Heap的内存增长方向是相反的
    具体可以参考下面这张图片:
    这里写图片描述

2、如何查看进程的信息(线程数)

  • 使用top命令,具体用法是 top -H
    加上这个选项,top的每一行就不是显示一个进程,而是一个线程。
  • 使用ps命令,具体用法是 ps -xH
    这样可以查看所有存在的线程,也可以使用grep作进一步的过滤。
  • 使用ps命令,具体用法是 ps -mq PID (ubuntu下貌似不能使用)
    这样可以看到指定的进程产生的线程数目。

3、进程间通信方式有哪些?以及在什么情况下用什么通信方式?优缺点:

1.管道

管道分为有名管道和无名管道

  • 无名管道是:一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用.进程的亲缘关系一般指的是父子关系。无明管道一般用于两个不同进程之间的通信。当一个进程创建了一个管道,并调用fork创建自己的一个子进程后,父进程关闭读管道端,子进程关闭写管道端,这样提供了两个进程之间数据流动的一种方式。
  • 有名管道:也是一种半双工的通信方式,但是它允许无亲缘关系进程间的通信。

2.信号量

  • 信号量是一个计数器,可以用来控制多个线程对共享资源的访问.,它不是用于交换大批数据,而用于多线程之间的同步.它常作为一种锁机制,防止某进程在访问资源时其它进程也访问该资源.因此,主要作为进程间以及同一个进程内不同线程之间的同步手段.

3.信号

  • 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生.

4.消息队列

  • 消息队列是消息的链表,存放在内核中并由消息队列标识符标识.消息队列克服了信号传递信息少,管道只能承载无格式字节流以及缓冲区大小受限等特点.

5.共享内存

  • 共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问.共享内存是最快的IPC(进程间通信)方式,它是针对其它进程间通信方式运行效率低而专门设计的.它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步与通信.

6.套接字:可用于不同机器间的进程通信

4、进程同步的几种方法?

5、进程死锁产生的原因及四个必要条件

产生死锁的原因主要是:

  • 因为系统资源不足。
  • 进程运行推进的顺序不合适。
  • 资源分配不当等。

如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则
就会因争夺有限的资源而陷入死锁。其次,进程运行推进顺序与速度不同,也可能产生死锁。
产生死锁的四个必要条件:

  • 互斥条件:一个资源每次只能被一个进程使用
  • 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
  • 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
  • 环境等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之
一不满足,就不会发生死锁。

  • 死锁的解除与预防:
    理解了死锁的原因,尤其是产生死锁的四个必要条件,就可以最大可能地避免、预防和
    解除死锁。所以,在系统设计、进程调度等方面注意如何不让这四个必要条件成立,如何确
    定资源的合理分配算法,避免进程永久占据系统资源。此外,也要防止进程在处于等待状态
    的情况下占用资源。因此,对资源的分配要给予合理的规划

6、什么是守护进程,什么是僵尸进程?

  • 守护进程:
    指在后台运行的,没有控制终端与之相连的进程。它独立于控制终端,通常周期性地执行某种任务。Linux的大多数服务器都是使用守护进程的方式实现。

  • 僵尸进程:
    一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵死进程。

7、解释一下进程同步和进程互斥的区别

进程之间的相互作用关系分为两种,一种是共享资源的关系,一种是相互合作的关系,前者属于进程互斥、后者属于进程同步。

  • 进程互斥:进程间的间接作用关系。两个或两个以上的进程,不能同时进入关于同一组共享变量的临界区域。比较典型的问题是打印机的共享访问。
  • 进程同步:进程间的直接作用关系。在多道程序环境下,进程是并发执行的,不同进程之间存在着不同的相互制约关系。比较典型的问题有生产消费者问题、哲学家进餐问题等。

8、进程与线程之间有何区别?

  • 进程是一个具有一定独立功能的程序的一次运行活动,同时也是资源分配的最小单元;而线程是进程的一个执行流,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。
  • 进程有独立的地址空间,线程没有单独的地址空间(同一进程内的线程共享进程的地址空间)。所以,一个进程崩溃后,在保护模式下不会对其它进程产生影响;而线程只是一个进程中的不同执行路径。
  • 线程有自己的堆栈和局部变量,但线程没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,其效率比不上线程高

9、线程同步有哪些方法?

答:进行多线程编程,因为无法知道哪个线程会在哪个时候对共享资源进行操作,因此让如何保护共享资源变得复杂,通过下面这些技术的使用,可以解决线程之间对资源的竞争,以到达线程同步的目的:

  • 互斥量Mutex
  • 信号灯Semaphore
  • 条件变量Conditions

10、父子进程终止顺序到底会造成什么样的影响?

  • 父进程在子进程之前终止
    对于父进程已经终止的所有进程,它们的父进程都改变为init进程。我们称这些进程由init进程收养。其操作过程大致是:在一个进程终止时,内核逐个检查所有活动的进程,以判断它是否是要终止进程的子进程,如果是,则该进程父进程ID就更改为1(init进程的ID)。

  • 子进程在父进程之前终止
    如果子进程在父进程之前终止时,内核为每个终止的子进程保存了一定量的信息,所以当终止进程的父进程调用wait或waitpid时,可以得到这些信息。内核可以释放终止进程所使用的所有存储区,关闭其所有打开文件,但至少会保存包括进程ID、该进程的终止状态以及该进程使用的CPU时间总量等信息。
    一个已经终止、但是其父进程尚未对其进行善后处理(获取终止子进程的有关信息、释放它仍占用的资源)的进程被称为僵死进程。

原创粉丝点击