1.Linux系统中进程与线程的区别
1)对于操作系统而言,进程是核心之核心,整个现代操作系统的根本,就是以进程为单位在执行任务。
进程,是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。它的执行需要系统分配资源创建实体之后,才能进行。
线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。线程的特点就是在不需要独立资源的情况下就可以运行。如此一来会极大节省资源开销,以及处理时间。
2)二者的相同点
无论是进程还是线程,都是用来实现多任务并发的技术手段。二者都可以独立调度,因此在多任务环境下,功能上并无差异。并且二者都具有各自的实体,是系统独立管理的对象个体。所以在系统层面,都可以通过技术手段实现二者的控制。而且二者所具有的状态都非常相似。而且,在多任务程序中,子进程(子线程)的调度一般与父进程(父线程)平等竞争。
3)实现方式的差异
进程是资源分配的基本单位,线程是调度的基本单位。
进程的个体间是完全独立的,而线程间是彼此依存的。多进程环境中,任何一个进程的终止,不会影响到其他进程。而多线程环境中,父线程终止,全部子线程被迫终止(没有了资源)。而任何一个子线程终止一般不会影响其他线程,除非子线程执行了exit()系统调用。任何一个子线程执行exit(),全部线程同时灭亡。
多线程程序中至少有一个主线程,而这个主线程其实就是有main函数的进程。它是整个程序的进程,所有线程都是它的子线程。通常把具有多线程的主进程称之为主线程。
4)控制方式的异同
进程与线程的身份标示ID管理方式不一样,进程的ID为pid_t类型,在全系统中,进程ID是唯一标识,对于进程的管理都是通过PID来实现的。线程的ID是一个long型变量
5)资源管理方式的异同
进程本身是资源分配的基本单位,因而它的资源都是独立的,如果有多进程间的共享资源,就要用到进程间的通信方式了。
线程间要使用共享资源不需要用共享内存,直接使用全局变量即可,或者malloc()动态申请内存。
6).个体间辈分关系的迥异
进程的辈份关系森严,在父进程没有结束前,所有的子进程都尊从父子关系。
多线程间的关系没有那么严格,不管是父线程还是子线程创建了新的线程,都是共享父线程的资源。
2.实体间(进程间,线程间,进线程间)通信方式
进程间的通信方式:
A.共享内存 B.消息队列 C.信号量 D.有名管道 E.无名管道 F.信号 G.文件 H.socket
线程间的通信方式上述进程间的方式都可沿用,且还有自己独特的几种:
A.互斥量 B.自旋锁 C.条件变量 D.读写锁 E.线程信号 G.全局变量
进程间与线程间分别采用的通信方式,除了种类的区别外,还有速度上的区别。
3.什么是僵尸进程?怎样来清除僵尸进程
僵尸进程是指一个已经终止、但是其父进程尚未对其进行善后处理获取终止进程的有关信息的进程,这个进程被称为“僵尸进程”(zombie)。它已经放弃了几乎所有内存空间,没有任何可执行代码,也不能被调度,仅仅在进程列表中保留一个位置,记载该进程的退出状态等信息供其他进程收集。
清除方法:
- 改写父进程,在子进程死后要为它收尸。具体做法是接管SIGCHLD信号。子进程死后, 会发送SIGCHLD信号给父进程,父进程收到此信号后,执行 waitpid()函数为子进程收尸。
- 把父进程杀掉。父进程死后,僵尸进程成为"孤儿进程",过继给1号进程init,init始终会负责清理僵尸进程,关机或重启后所有僵尸进程都会消失。