多线程vs多进程

1.进程

定义: Unix标准的定义为“一个其中运行着一个或者多个线程的地址空间和这些线程所需要的系统资源”。也可以看作是正在运行的程序。
PID:每一个进程都有一个唯一的数字编号,称为进程标识PID。
进程表:存储进程信息的数据结构,包括PID、进程的状态、命令字符串和一些其他信息。可以用“ps -ef”查看进程相关的信息。
父、子进程:每一个进程都是由父进程启动的,被父进程启动的进程称为子进程。Linux系统启动时会运行系统的第一个进程——init进程,PID为1.

进程状态

进程的启动方式

  • 在一个程序的内部启动另一个程序,从而启动新进程
```
 int system(const char *string)//运行以字符串参数的形式传递的命令,并等待该命令的完成
```
  • 替换进程映像
int execl(const char *path,const char *arg0,...,(char *)0)//将当前进程替换为一个新进程,新进程启动后,原进程不再运行
...exec系列函数
  • 复制进程映像
pid_t fork(void);//调用后,新进程将继续执行(原进程也继续原型);关键在于判断fork的返回值,若为0则为子进程,-1则失败,其它则为父进程

僵尸进程:子进程终止时,它与父进程之间的关联还继续保持,直到父进程正常终止或者调用wait;因此,当子进程终止时,代表子进程的表项不会立刻释放,仍然存在于系统中,此时它将称为僵尸进程。

2.线程

线程: 在一个程序中的多个执行线路叫做线程。准确的说就是:进程内部的一个控制序列。
线程的优点

  • 让程序看起来同时执行多个事情
  • 改善程序的性能
  • 对资源的需求小于进程

线程的缺点

  • 编写多线程程序需要非常细心的设计
  • 多线程程序的调试要比单线程困难的多
  • 在单处理器上,多线程不一定比单线程运行的快

线程相关函数

pthread_create(pthread_t *thread, pthread_attr_t * attr, void *(*start_routine)(void *),void *arg);
int pthread_join(pthread_t thread, void **retval);
void pthread_exit(void *retval);
int pthread_attr_init (pthread_attr_t *attr);
int pthread_attr_destroy (pthread_attr_t *attr);
...

线程同步

  • 信号量
    sem_init、sem_wait、sem_post、sem_destroy
  • 互斥量
    pthread_mutex_init、pthread_mutex_lock、pthread_mutex_unlock、pthread_mutex_destroy

3.对比分析

  • 数据共享、同步。进程间的内存是独立的,数据共享复杂,需要用IPC,但是同步简单;线程间共享进程的内存空间,数据共享简单,但是同步复杂。
  • 内存、CPU占用。进程占用内存多,进程间切换复杂;创建、切换等的开销比较小
  • 编程、调试。多进程间编程、调试简单;线程比较复杂
  • 可靠性。进程间影响较小,但是一个线程可能导致整个进程挂掉
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容