1、简述Linux进程内存空间分为哪几个段?作用分别是什么?
答:Linux中的进程包含3个段,分别为“数据段”、“代码段”和“堆栈段”。
“数据段”:已被初始化的变量,包括全局变量和已被初始化的静态变量;未初始化数据段,存储未被初始化的静态变量,又称BBS;
“代码段”存放的是程序代码的数据;
“堆栈段”存放的是子程序的返回地址、子程序的参数以及程序的局部变量等。
2、如何查看进程的信息(线程数):
三种方法:
(1) 使用top命令,具体用法是 top -H
加上这个选项,top的每一行就不是显示一个进程,而是一个线程。
(2) 使用ps命令,具体用法是 ps -xH
这样可以查看所有存在的线程,也可以使用grep作进一步的过滤。
(3) 使用ps命令,具体用法是 ps -mq PID (ubuntu下貌似不能使用)
这样可以看到指定的进程产生的线程数目。
3、进程间通信方式有哪些?以及在什么情况下用什么通信方式?
(1)管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
(2)有名管道 (named pipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
(3)信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
(4)消息队列( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
(5)信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
(6)共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。
(7)套接字( socket ) : 套解口也是一种进程间通信机制,与其他通信机制不同的是,我们熟知的WWW服务、FTP服务、TELNET服务 等都是基于套接口编程来实现的。除了在异地的计算机进程间以外,套接口同样适用于本地同一台计算机内部的进程间通信。
4、进程同步的几种方法?
在Linux下,进程同步的解决方式主要有四种:
(1)信号量
(2) 文件锁
(3) 无锁CAS
(4) 校验方式(CRC32校验)
5、进程死锁产生的原因及四个必要条件和解决预防
v 产生死锁的原因主要是:
(1) 因为系统资源不足。
(2) 进程运行推进的顺序不合适。
(3) 资源分配不当等。
如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则
就会因争夺有限的资源而陷入死锁。其次,进程运行推进顺序与速度不同,也可能产生死锁。
v 产生死锁的四个必要条件:
(1) 互斥条件:一个资源每次只能被一个进程使用。
(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
v 死锁的解除与预防:
理解了死锁的原因,尤其是产生死锁的四个必要条件,就可以最大可能地避免、预防和
解除死锁。所以,在系统设计、进程调度等方面注意如何不让这四个必要条件成立,如何确
定资源的合理分配算法,避免进程永久占据系统资源。此外,也要防止进程在处于等待状态
的情况下占用资源。因此,对资源的分配要给予合理的规划。
6、什么是守护进程,什么是僵尸进程?
答:
1.守护进程:
指在后台运行的,没有控制终端与之相连的进程。它独立于控制终端,通常周期性地执行某种任务。Linux的大多数服务器都是使用守护进程的方式实现。
2.僵尸进程:
当子进程先于父进程终止,而父进程又没有调用wait函数等待子进程结束,子进程进入僵死状态,并且会一直保持下去除非系统重启.子进程处于僵死状态,内核只保存该进程的一些必要信息以备父进程所需.此时子进程始终占用着资源,同时也减少了系统可以创建的最大进程数;如果子进程先于父进程终止,且父进程调用了wait或waitpid函数,则父进程会等待子进程结束
7、解释一下进程同步和进程互斥的区别?
进程之间的相互作用关系分为两种,一种是共享资源的关系,一种是相互合作的关系,前者属于进程互斥、后者属于进程同步。
进程互斥:进程间的间接作用关系。两个或两个以上的进程,不能同时进入关于同一组共享变量的临界区域。比较典型的问题是打印机的共享访问。
进程同步:进程间的直接作用关系。在多道程序环境下,进程是并发执行的,不同进程之间存在着不同的相互制约关系。比较典型的问题有生产消费者问题、哲学家进餐问题等。
8、进程与线程之间有何区别?
答:1.进程是一个具有一定独立功能的程序的一次运行活动,同时也是资源分配的最小单元;而线程是进程的一个执行流,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。
2.进程有独立的地址空间,线程没有单独的地址空间(同一进程内的线程共享进程的地址空间)。所以,一个进程崩溃后,在保护模式下不会对其它进程产生影响;而线程只是一个进程中的不同执行路径。
3.线程有自己的堆栈和局部变量,但线程没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮
4.但在进程切换时,耗费资源较大,其效率比不上线程高
9、线程同步有哪些方法?
答:进行多线程编程,因为无法知道哪个线程会在哪个时候对共享资源进行操作,因此让如何保护共享资源变得复杂,通过下面这些技术的使用,可以解决线程之间对资源的竞争,以到达线程同步的目的:
1 互斥量Mutex
2 信号灯Semaphore
3 条件变量Conditions
10、父子进程终止顺序到底会造成什么样的影响?
v 父进程在子进程之前终止
对于父进程已经终止的所有进程,它们的父进程都改变为init进程。我们称这些进程由init进程收养。其操作过程大致是:在一个进程终止时,内核逐个检查所有活动的进程,以判断它是否是要终止进程的子进程,如果是,则该进程父进程ID就更改为1(init进程的ID)。
v 子进程在父进程之前终止
如果子进程在父进程之前终止时,内核为每个终止的子进程保存了一定量的信息,所以当终止进程的父进程调用wait或waitpid时,可以得到这些信息。内核可以释放终止进程所使用的所有存储区,关闭其所有打开文件,但至少会保存包括进程ID、该进程的终止状态以及该进程使用的CPU时间总量等信息。
一个已经终止、但是其父进程尚未对其进行善后处理(获取终止子进程的有关信息、释放它仍占用的资源)的进程被称为僵死进程。