一、进程
创建、退出、共享空间的子进程、退出进程、进程的所有者、调试、僵尸进程;
信号:中断操作,比如Kill相当于windows中的消息。
进程通信:管道(有名管道与无名管道)、System V IPC/POSIX IPC、共享内存、信号量、消息队列
二、线程:
创建、退出
线程同步:互斥量(也是锁)、读写锁(一个是读的锁一个是写的锁)、条件变量、线程属性操作、进行锁的操作时最好不要在阻塞中进行(当有DDOS攻击时.....)。
从进程演化出线程,最主要的目的就是更好的支持SMP以及减小(进程/线程)上下文切换开销。
http://bbs.chinaunix.net/thread-132343-1-1.html
对于网络服务器有多进程服务器与多线程服务器,有人说多线好,但是又有多进程中每个进程有自己独立的内存空间.一个进程死掉不会影响其他的进程.
线程执行开销小,同进程内的各线程共享同一虚拟地址空间,故其产生的速度快,线程间的通讯快、切换快,但是需要考虑数据访问的同步。
不同的进程有各自独立的虚拟地址空间,故其对系统资源的消耗更大,但是进程数据是独立的,能够得到更好的逻辑抽象和运行抽象。
没有绝对的好与坏,只有哪个更加合适的问题。我们来看实际应用中究竟如何判断更加合适。
在并发与多进程(多线程)中的资源收回问题(僵尸进程):
进程一旦调用了wait就立即阻塞自己,由wait自动分析是否当前进程的某个子进程已经退出,如果让它找到了这样一个已经变成僵尸的子进程,wait就会收集这个子进程的信息,并把它彻底销毁后返回;如果没有找到这样一个子进程,wait就会一直阻塞在这里,直到有一个出现为止。(2014/2/27)
int pthread_detach(pthread_t thread) http://biancheng.dnbcw.info/linux/369315.html
有些时候,我们并不太关心线程的退出状态。我们只是想让线程自己终止,然后清除掉他自己使用的资源。在这种情况下,我们就使用该函数来detach该线程。这样不会出现“僵尸”线程。分离一个正在运行的线程不会对线程代理任何影响,仅仅是通知系统当该线程结束时,其所有资源可以被回收。
建议使用设置线程属性的方法来实现资源回收. PTHREAD_CREATE_DETACHED属性,表示该线程是一个状态分离状态的线程,则该线程一退出,便可重用其线程 ID 和其他资源,
为父进程添加SIGCHLD信号,当子进程退出时父进程就会收到这个信号,使父进程调用wait或者是waitpid来处理退出的子进程信息使其不成为僵尸进程
void (*signal ( int signum,void(* handler)(int) ) ) (int); //设置信号:signal(SIGCHLD,handler); /*SIG_ERR出错返回*/ void handler(int signo);
pid_t wait(int *statloc); //可以获取本身创建的多个子进程的结束状态,会暂时停止目前进程的执行,直到有信号来到或子进程结束。如果服务器没有调用wait取子进程的结束状态,哪么僵尸进程将大量出现。
pid_t wait_pid(pid_t pid, int *statloc,int options); //多进程使用这个好些
例:
- void sig_chld(int signo)
- {
- pid_t pid;
- int stat;
- while( (pid= waitpid(-1, &stat, WNOHANG))>0)
- printf("child %d terminated \n",pid);
- return ;
- }
pthread_join(pthread_t tid,vodi **rval_ptr); //取线程退出信息