进程与线程

1、简述Linux进程内存空间分为哪几个段?作用分别是什么?
答:分为5段,BSS段, 代码段, 数据段, 堆, 栈。
BSS段:用于存放未初始化的全局变量, 静态局部变量。
代码段:存放代码,常量。
数据段:存放初始化的全局变量。
堆:是由程序员管理的,申请释放由程序员管理。
栈:是由操作系统管理的,申请释放由操作系统管理。

2、如何查看进程的信息(线程数):
答:1。 使用top命令,具体用法是 top -H
加上这个选项,top的每一行就不是显示一个进程,而是一个线程。
2。 使用ps命令,具体用法是 ps -xH
这样可以查看所有存在的线程,也可以使用grep作进一步的过滤。
3。 使用ps命令,具体用法是 ps -mq PID (ubuntu下貌似不能使用)

3、进程间通信方式有哪些?
以及在什么情况下用什么通信方式?优缺点:
答:共有6种通信方式:管道通信,信号通信,消息队列,共享内存,信号量,套接字。
管道的通信方式分为无名管道和有名管道,无名管道用于父子进程间通信,有名管道用于任意进程间通信。管道是单向的、先进先出的,它把一个进程的输出和另一个进程 的

输入连接在一起。
信号(signal)机制是Unix系统中最为古老的进程间通信机制,很多条件可以产生一个信号:

1、当用户按某些按键时,产生信号

2、硬件异常产生信号:除数为0、无效的存储访问等等。这些情况通常由硬件检测到,将其通知内核,然后内核产生适当的信号通知进程,例如,内核对正访问一个无效存储区 的

进程产生一个SIGSEGV信号

3、进程用kill函数将信号发送给另一个进程

4、用户可用kill命令将信号发送给其他进程
共享内存
是被多个进程共享的一部分物理内存.共享内存是进程间共享数据的一种最快的方法,一个进程向共享内存区域写入了数据,共享这个内存区域的所有进程就可以立 刻看到其中

的内容.基本上所有流水都可以用消息队列。还有就是当前比较流行的push功能,也可以使用消息队列。
信号量主要用途是保护临界资源.
进程可以根据它判定是否能够访问某些共享资源。除了用于访问控制外,还可用于进程同步。
为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了称为套接字(Socket)的接口。
4、进程同步的几种方法?
答:管道,FIFO,共享内存,消息队列,信号。

5、进程死锁产生的原因及四个必要条件
答:原因:1.因竞争资源发生死锁 2.进程推进顺序不当发生死锁
条件:(1)互斥条件:进程对所分配到的资源不允许其他进程进行访问,若其他进程访问该资源,只能等待,直至占有该资源的进程使用完成后释放该资源
(2)请求和保持条件:进程获得一定的资源之后,又对其他资源发出请求,但是该资源可能被其他进程占有,此事请求阻塞,但又对自己获得的资源保持不放
(3)不可剥夺条件:是指进程已获得的资源,在未完成使用之前,不可被剥夺,只能在使用完后自己释放
(4)环路等待条件:是指进程发生死锁后,必然存在一个进程–资源之间的环形链

6、什么是守护进程,什么是僵尸进程?
答:守护进程:子进程未结束,父进程结束,子进程由init 进程接管,子进程可作为守护进程。
僵尸进程:一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他, 那么他将变成一个僵尸进程。

7、解释一下进程同步和进程互斥的区别?
答:互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。
同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况

是指可以允许多个访问者同时访问资源

8、进程与线程之间有何区别?
答:(1)进程具有独立的内存地址,而线程只能共享进程内的资源。
(2)线程可以用程序代码来控制,而进程通常由操作系统来调度执行。

9、线程同步有哪些方法?
答:1 wait方法: 该方法属于Object的方法,wait方法的作用是使得当前调用wait方法所在部分(代码块)的线程停止执行,并释放当前获得的调用wait所在的代码块的锁,并在其他线程调

用notify或者notifyAll方法时恢复到竞争锁状态(一旦获得锁就恢复执行)。
2 notify方法和notifyAll方法: notify方法通知调用了wait方法,但是尚未激活的一个线程进入线程调度队列(即进入锁竞争),注意不是立即执行。并且具体是哪一个线程不能保证

。另外一点就是被唤醒的这个线程一定是在等待wait所释放的锁。
notifyAll方法则唤醒所有调用了wait方法,尚未激活的进程进入竞争队列。
3 synchronized关键字:
第一点:synchronized用来标识一个普通方法时,表示一个线程要执行该方法,必须取得该方法所在的对象的锁。
第二点:synchronized用来标识一个静态方法时,表示一个线程要执行该方法,必须获得该方法所在的类的类锁。
第三点:synchronized修饰一个代码块。类似这样:synchronized(obj) { //code…. }。表示一个线程要执行该代码块,必须获得obj的锁。这样做的目的是减小锁的粒度,保证当不同块所

需的锁不冲突时不用对整个对象加锁。利用零长度的byte数组对象做obj非常经济。

10、当父进程在子进程之前终止会发生什么?
答:当父进程终止时,将其子进程的父进程改变为init进程,叫由init进程领养。这时子进程称为孤儿进程。过程为:当一个进程终止时,内核会逐个检查所有活动进程,以判断它是否是终

止进程的子进程,如果是,则将该进程的父进程ID设置为1。这样就保证了每个进程都有一个父进程。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值