1.定义
进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位;进程是资源分配的最小单位;
线程是进程的一个实体,行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.是CPU调度和分派的基本单位,它是比进程更小的能独立运,线程是程序执行的最小单位。
2.创建
2.1 线程的使用实例
编程如下代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <pthread.h>
void * func(void *arg)
{
int num=*(int *)arg;
int i=0;
for(i=0;i<num;i++){
printf("num=%d current is %d\n",num,i);
usleep(100);//延时100us,便于看线程间调度效果
}
return NULL;
}
int main(int arg,char *args[])
{
pthread_t thread1,thread2;//声明两个线程变量
int a=5,b=10;
//创建线程1
if(pthread_create(&thread1,NULL,func,&a)!=0)
{
printf("create thread1 failed!\n");
return;
}
//创建线程2
if(pthread_create(&thread2,NULL,func,&b)!=0)
{
printf("create thread2 failed!\n");
return;
}
sleep(2);
return 0;
}
然后编译c文件
$ gcc linux_thread_test.c -o linux_thread -lpthread
查看生成可执行文件linux_thread
然后 运行程序
$ ./linux_thread
查看打印结果
从结果打印来看,线程1和线程2在同时工作打印数字。
2.2 进程的使用实例
编程如下代码
#include <stdio.h>
#include <unistd.h>
void func(int num)
{
int i=0;
for(i=0;i<num;i++){
printf("num=%d current is %d\n",num,i);
usleep(100);//延时100us,便于看线程间调度效果
}
}
int main ()
{
printf("app start...\n");
pid_t id = fork();
if (id<0) {
printf("error\n");
}else if (id==0) {
printf("hi, i'm in new process, my id is %d \n", getpid());
func(5);
}else {
printf("hi, i'm in old process, the return value is %d\n", id);
func(10);
}
sleep(2);
return 0;
}
然后编译c文件
$ gcc linux_process.c -o linux_process
查看生成可执行文件linux_process
然后 运行程序
$ ./linux_process
查看打印结果
从结果打印来看,子进程和父进程分别不同的在打印数字。
从进程和线程的工作过程,似乎两者没有区别,都能同时进行不同的调度执行工作。。。。
但是,线程和进程有哪些不同呢?
3.线程和进程的差异
如图线程的数据结构模型,主要由堆栈段、代码段和数据段。
进程的创建相当于重新开辟了新的内存地址空间,创建新的进程模型。进程间的内存空间是相互独立的互不干扰,所以进程间的数据传递需要进程通信。
而线程的创建,仅仅是开辟新的Stack段,如下图所示,其他数据都是共享的。