linxu混混之牢骚
生命的意义就是在于它的变幻,你永远不会知道明天会发生什么事。 珍惜生命。。。。。
进程
linux中,进程有自己的独立的用户空间,和自己独立的内核空间(堆栈),使用一个task_struct结构来表示一个进程。一般用fork,vfork等函数建立。
线程:用户线程,内核线程
linux中,用户进程没有自己独立的用户空间,需要和别的线程共享用户空间。有自己独立的内核空间(堆栈),使用一个task_struct结构来表示。 在用户空间的应用程序中使用pthread_creat建立。
linux中,内核线程没有用户空间,他只能运行在内核空间,使用一个task_struct结构来表示。由于没有用户空间故mm_struct *mm==NULL。在内核使用kernel_thread创建。
另外: linux中,将线程称作轻量级进程(lightweight process),内核可以直接进行调度。
在《深入linux内核》书中有个比喻:假设一个象棋程序使用两个线程,其中一个控制图形化棋盘,等待选手移动并显示在屏幕上,另一个考虑棋的下一步移动。 由此可见,当第一个进程在等待的时候,第二个进程应该继续运行。但是如果象棋程序仅是一个单独的进程,第一个线程就不能简单的发出等待用户行为的堵塞系统调用;否则第二个进程也会被堵塞。 所以linux需要内核为别对线程进行单独的调度。
计算机语言中说: 进程是系统分配的最少单元,线程是程序运行的最小单元。
进程描述符:
每个一个进程,线程都会用一个task_struct结构来描述的,变量很多,挑重要的介绍:
task_struct
{
........
volatile long state; //进程的状态,赋值范围:
/***************************************
*TASK_RUNNING--表示进程已经就绪,或已经运行。当一个进程被creat的时候就处于这个状态。
*TASK_INTERRRUPTIBLE---处于等待中的进程,当等待条件为真时被唤醒,可以被信号或中断wake。
*TASK_UNINTERRUPTIBLE---处于等待中的进程,当等待条件为真时被唤醒,但不可以被信号或中断唤醒。
*TASK_STOPPED当进程接受到SIGSTOP和SIGTSTP信号时,进程状态变成这个,但当接受到SIGCONT信号后,重新TASK_RUNNING.
*TASK_KILLABLE 相当于TASK_UNINTERRUPTBLE,但是可以被S