进程线程常见问题——简略版(linux下)

来源:互联网 发布:外国人交友的软件 编辑:程序博客网 时间:2024/05/01 17:02

一:进程的状态及进程状态转换条件

进程的三种状态:就绪,执行,阻塞

就绪态和阻塞态的区别:进程就绪是其他资源都具备了,等待的是CPU;进程阻塞是占有了CPU,缺少其他起源

就绪态--执行态:就绪态的进程被进程调度程序选中后并分配处理机,进程由就绪太转变为执行态

执行态--阻塞态:正在执行的进程因发生阻塞等待事件而无法执行,进程有执行态转变为阻塞态,比如:进程提出输入输出请求等待外部设备传输信息的状态,进程申请资源得不到满足变成等待资源状态,进程出现故障变成等待干预状态等等

阻塞态--就绪态:进程因阻塞等待事件的发生变成就绪态,比如输入输出请求完成,资源得到满足,错误得到处理,进程并不会由等待状态直接变成执行态,而是先变成就绪态,由进程调度程序分配处理机后转为执行

执行态--就绪态:当进程因时间片用完,或者因更高优先级进程要运行被迫让出时间片时,该进程就由执行态转为就绪态

二:进程间通信方式

进程间的常见通信方式:管道,有名管道,信号量,消息队列,信号,共享内存,套接字

管道:是半双工的通信方式,只能一端写一端读,数据只能单向流动,只能在亲缘关系间的进程使用,管道只能传输无格式字节流,有缓冲区大小的限制。无名管道是依附于进程临时存在的。

有名管道:也是半双工的通信方式,数据也只能单向流动,不限亲缘关系,是永久存在的

信号量:是一个计数器,来控制多个进程对共享资源的访问。常作为一种锁机制,防止进程访问共享资源时其他进程也访问该共享资源。通常被用作进程间和进程内线程间同步。

消息队列:消息队列是消息的链表,存放在内核有消息队列标识符标识。消息队列克服了信号传递信息少,管道只能传递无格式字节流和缓冲区大小受限制的缺点

信号:通过进程对信号的捕获来传递信息,用于通知接受进程某个事件已经发生

共享内存:映射一段能被其他进程访问的内存,这段内存有一个进程创建,能被多个进程访问,是最快的IPC方式,通常与信号量一起使用。

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

三:进程与线程的区别

进程和线程的根本区别在于他们是不同的操作系统管理资源的方式。进程有独立的地址空间,当一个进程崩溃后在保护模式下不会对其他进程造成影响,线程是进程的一个执行路径。线程有自己的堆栈和局部变量,但是线程没有独立的地址空间,一个线程崩溃后,整个进程会崩溃。进程比线程健壮的多,但是进程切换耗费资源较大,效率较低。对于一些要求同时进行并共享某些变量的并发操作时,只能用线程。

多线程的意义在于在一个程序中有多个执行部分可以同时执行,但是操作系统并没有将多个线程看做是多个独立的应用来实现进程的调度和管理资源分配。

线程执行开销小,但是不利于资源的管理和保护。线程适合在smp机器上运行,进程可以跨机器迁移

四:线程的同步方式

线程的几种同步方式:临界区,信号量,事件,互斥量

临界区:当多个线程访问一个独占性的共享资源时,可以使用临界区对象。拥有临界区对象的线程可以访问被保护起来的代码段或资源,其他线程想访问资源则被挂起,直到该线程放弃临界区为止。创建临界区对象,线程在访问资源时,先获取临界区对象,访问完资源后放弃临界区对象。

事件:允许一个线程在执行完任务后,主动唤醒另一个线程执行任务。事件对象有两种状态:有信号状态和无信号状态。事件对象有两种类型:人工事件和自动事件。自动事件对象在被至少一个线程释放后自动返回无信号状态。人工事件,获得信号后,释放可利用线程,直到调用成员函数才将其设置为无信号状态。

互斥量:互斥量和临界区类似,至少互斥量允许在进程间使用,而临界区只允许在同一进程的各个线程间使用,但是临界区更节省资源,效率更高。

信号量:允许在同一时刻多个线程访问共享资源,但是需要限制在同一时刻访问资源的最大线程数目。

五:线程的实现方式

线程的实现方式也就是用户线程和内核线程的区别

内核线程:由操作系统内核创建和撤销,由内核来维护进程和线程的上下文信息以及切换,内核线程切换的时候,由用户态转为内核态,当切换结束时,再由内核态转为用户态。

用户线程:用户线程是指不依赖于操作系统内核,在用户程序中自己实现的线程。应用进程利用线程库提供创建,同步,调度和管理的函数来控制用户线程。不需要内核态用户态的切换,操作系统内核不知道多线程的存在,因此一个线程阻塞,整个进程内的所有线程都会阻塞。这里的处理器时间片分配是以进程为基本单位,所以每个线程执行的时间相对减少。


内核线程和用户线程的区别:

1.内核线程是操作系统内核可感知的,用户线程是操作系统内核不可感知的

2.用户线程的创建,同步,调度和管理不需要操作系统内核的支持,内核线程的创建,同步,调度和管理是需要依赖操作系统内核的。

3.用户线程执行系统调用指令时会导致其所在的进程被中断,内核线程执行系统调用指令时只会导致该线程被中断。

4.在只有用户线程的操作系统中,CPU调度是以进程为基本单位,在运行中的多个线程是由用户程序来管理多个线程的轮转调度的。在只有内核线程的操作系统中,CPU调度是以线程为基本单位的,有操作系统的线程调度程序来负责线程的调度。

5.用户级线程的程序是运行在用户态下的,而内核支持的线程是可以运行在任何状态下的程序。


内核级线程的优点:并发性好,当有多个处理机时,一个进程内的多个线程可以同时运行。一个线程阻塞不会影响其他线程。

内核级线程的缺点:线程切换时开销过大,缺乏灵活性。

用户级线程的优点:较高的灵活性:线程的创建,同步,调度和管理都有用户自己完成。较高的效率:在线程管理时不需要内核态用户态切换

用户级线程的缺点:并发能力差,一个线程阻塞将导致整个进程内的线程都阻塞。


六:如何将用户级线程的高效率和高灵活性与内核级线程的高并发性想结合?

使用组合方式的多线程实现。

线程创建在用户空间完成,线程的同步和调度也在应用程序中进行,一个应用程序中的多个用户级线程被映射到一些内核线程上(小于等于用户级线程的数目)

0 0
原创粉丝点击