linux进程通信的方式、进程的8种状态、线程通信的方式、线程的4种状态

2/22/2017来源:ASP.NET技巧人气:1324

linux进程通信的方式

管道( pipe): 管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。

命名管道(namedpipe): 命名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。

信号量( semophore ): 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。

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

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

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

套接字(socket ): 套接口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同主机间的进程通信。

内存映射(mapped memory): 内存映射允许任何多个进程间通信,每一个使用该机制的进程通过把一个共享的文件映射到自己的进程地址空间来实现它。

流水线、进程、线程分别从指令、处理器、进程三个层次,由低到高,实现我们迫切需要的并发处理

linux进程的8种状态

TASK_RUNNING: 进程当前正在运行,或者正在运行队列中等待调度。

TASK_INTERRUPTIBLE: 进程处于睡眠状态,正在等待某些事件发生。进程可以被信号中断。接收到信号或被显式的唤醒呼叫唤醒之后,进程将转变为 TASK_RUNNING 状态。

TASK_UNINTERRUPTIBLE: 此进程状态类似于 TASK_INTERRUPTIBLE,只是它不会处理信号。中断处于这种状态的进程是不合适的,因为它可能正在完成某些重要的任务。 当它所等待的事件发生时,进程将被显式的唤醒呼叫唤醒。

TASK_STOPPED: 进程已中止执行,它没有运行,并且不能运行。接收到 SIGSTOP 和 SIGTSTP 等信号时,进程将进入这种状态。接收到 SIGCONT 信号之后,进程将再次变得可运行。

TASK_TRACED: 正被调试程序等其他进程监控时,进程将进入这种状态。

EXIT_ZOMBIE: 进程已终止,它正等待其父进程收集关于它的一些统计信息。

EXIT_DEAD: 最终状态(正如其名)。将进程从系统中删除时,它将进入此状态,因为其父进程已经通过 wait4() 或 waitpid() 调用收集了所有统计信息。

TASK_KILLABLE: Linux® kernel 2.6.25 引入了这种进程状态,用于将进程置为睡眠状态,它可以替代有效但可能无法终止的 TASK_UNINTERRUPTIBLE 进程状态,以及易于唤醒但更加安全的 TASK_INTERRUPTIBLE 进程状态。

线程通信的方式(直接共用全局变量,但需做好同步)

线程间无需特别的手段进行通信,因为线程间可以共享数据结构,也就是一个全局变量可以被两个线程同时使用。不过要注意的是线程间需要做好同步,一般用互斥锁(mutex)。linux的消息属于IPC,也就是进程间通信,线程用不上。 linux用pthread_kill对线程发信号,singal中断也很好用,用好信号量,共享资源就可以了。 在进程中共享的变量必须用关键字volatile来定义,为了保护变量,我们必须使用信号量、互斥等方法来保证我们对变量的正确使用。

互斥锁 是一种信号量,常用来防止两个进程或线程在同一时刻访问相同的共享资源。可以保证以下三点: 原子性:把一个互斥量锁定为一个原子操作,这意味着操作系统(或pthread函数库)保证了如果一个线程锁定了一个互斥量,没有其他线程在同一时间可以成功锁定这个互斥量。 唯一性:如果一个线程锁定了一个互斥量,在它解除锁定之前,没有其他线程可以锁定这个互斥量。 非繁忙等待:如果一个线程已经锁定了一个互斥量,第二个线程又试图去锁定这个互斥量,则第二个线程将被挂起(不占用任何cpu资源),直到第一个线程解除对这个互斥量的锁定为止,第二个线程则被唤醒并继续执行,同时锁定这个互斥量。 条件变量(与互斥锁一起用) 信号量 线程私有数据() 线程私有数据采用了一种一键多值的技术,即一个键对应多个数值。访问数据时都是通过键值来访问,好像是对一个变量进行访问,其实是在访问不同的数据。

线程的4种状态

就绪:线程分配了CPU以外的全部资源,等待获得CPU调度

执行:线程获得CPU,正在执行

阻塞:线程由于发生I/O或者其他的操作导致无法继续执行,就放弃处理机,转入线程就绪队列

挂起:由于终端请求,操作系统的要求等原因,导致挂起。