django

多进程&多线程

2018-08-14  本文已影响19人  執著我們的執著

多进程

进程是资源(CPU、内存等)分配的基本单位,它是程序执行时的一个实例。程序运行时系统就会创建一个进程,并为它分配资源,然后把该进程放入进程就绪队列,进程调度器选中它的时候就会为它分配CPU时间,程序开始真正运行。

Linux系统函数fork()可以在父进程中创建一个子进程,这样的话,在一个进程接到来自客户端新的请求时就可以复制出一个子进程让其来处理,父进程只需负责监控请求的到来,然后创建子进程让其去处理,这样就能做到并发处理。
[注]
fork和exec函数是两个重要的系统调用函数

#include <sys/types.h>
#include <unistd.h>

pid_t fork(void);

fork调用失败返回-1;
调用成功:fork函数会返回两次结果,因为操作系统会把当前进程的数据复制一遍,然后程序就分两个进程继续运行后面的代码,fork分别在父进程和子进程中返回,在子进程返回的值pid永远是0,在父进程返回的是子进程的进程id。
fork的特点简单概括起来就是:"调用一次,返回两次",在父进程中调用一次,在父进程和子进程中各返回一次
gdb调试子进程:set follow-fork-mode child 设置跟踪子进程

#include <unistd.h>

int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg, ... , char *const envp[ ]);
int execv(const char *path,  char *const argv[ ]);
int execvp(const char *file,  char *const argv[ ]);
int execve(const char *path,  char *const argv[ ], char *const envp[ ]);

这些函数如果调用成功则加载新的程序从启动代码开始执行,不再返回,如果调用出错则返回-1,所以exec函数只有出错的返回值而没有成功的返回值。

这些函数原型看起来很容易混淆,掌握规律则很好记

不知道的话记得万能的 Man

wait/waitpid:会彻底清除掉这个进程,

如果一个进程已经终止,但是他的父进程尚未调用wait或waitpid对他进行清理,这是的进程状态称为僵尸(Zombie)进程,任何进程在刚终止时都是僵尸进程,正常情况下,僵尸进程都立即被父进程清理了。

wait和waitpid都可以获取子进程的终止信息
两者的区别:

补充


多线程

线程是程序执行时的最小单位,它是进程的一个执行流,是CPU调度和分派的基本单位,一个进程可以由很多个线程组成,线程间共享进程的所有资源,每个线程有自己的堆栈和局部变量。线程由CPU独立调度执行,在多CPU环境下就允许多个线程同时运行。同样多线程也可以实现并发操作,每个请求分配一个线程来处理。

创建:pthread_create()
挂起:pthread_join()
终止(3种):
return
pthread_cancel()
pthread_exit()

线程和进程各自有什么区别和优劣呢?

From《Unix网络编程》
  • fork is expensive. Memory is copied from the parent to the child, all descriptors are duplicated in the child, and so on. Current implementations use a technique called copy-on-write, which avoids a copy of the parent’s data space to the child until the child needs its own copy. But, regardless of this optimization, fork is expensive.
  • IPC is required to pass information between the parent and child after the fork. Passing information from the parent to the child before the fork is easy, since the child starts with a copy of the parent’s data space and with a copy of all the parent’s descriptors. But, returning information from the child to the parent takes more work.
  • Threads help with both problems. Threads are sometimes called lightweight processes since a thread is “lighter weight” than a process. That is, thread creation can be 10–100 times faster than process creation.
  • All threads within a process share the same global memory. This makes the sharing of information easy between the threads, but along with this simplicity comes the problem
参考引用:

米罗西的博文
多进程与多线程 From yuan先生 [写的是真滴好!代码实例Python]
多线程还是多进程的选择及区别 [代码实例C/C++]
实例

上一篇 下一篇

猜你喜欢

热点阅读