程序、进程、线程的区别

程序、进程、线程的区别

进程是程序的实体,而线程又是进程的实体。进程又是线程的容器。
请添加图片描述

程序、进程、线程三者区别如下:

1.程序:程序并不能单独执行,是静止的,只有将程序加载到内存中,系统为其分配资源后才能够执行。

2.进程:程序对一个数据集的动态执行过程,一个进程包含一个或者更多的线程,一个线程同时只能被一个进程所拥有,进程是分配资源的基本单位。进程拥有独立的内存单元,而多个线程共享内存是该线程可与同属进其他线程共享该进程所拥有的全部资源。每一个独立的线程,都有一个程序运行的入口、顺序执行序列和程序的出口。

3.线程:线程是进程内的基本调度单位,线程的划分尺度小于进程,并发性更高,线程本身不拥有系统资源,但是该线程可与同属进其他线程共享该进程所拥有的全部资源。每一个独立的线程,都有一个程序运行的入口、顺序执行序列和程序的出口。

4.进程、线程区别(可执行命令,用户id,)

1.一个进程可以包含至少一个线程,一般来说也就是主线程,而一个线程只能属于一个进程;
2.进程拥有独立的内存,而线程没有独立的资源空间, 只是暂时存储在计数器,寄存器,栈中,
同一个进程间的线程可以共享资源。
3.将代码放入到代码区之后,进程产生,但还没执行,我们所说的执行一般是是主线程main函数开始执行。
4.进程比线程更加消耗资源
5.进程对资源的保护要求高,而线程要求不高
6.进程是处理器这一层面的抽象,而线程是进程的基础上进一步并发的抽象
7.同一个进程下,一个线程的挂掉,会导致整个进程的挂掉,而进程之间不会相互影响
8.总的来说:我们都知道程序不能单独运行,只有将它放入内存中,分配资源才能运行,程序是指令的集合,
而进程是程序的一次执行活动,属于动态概念
9.我们可以打个比方:进程相当于某一个大型项目,世界上可能有人同时在做这个项目,有其独特的方式;
而线程就相当于这个项目下的一些程序员,多个程序员去完成这一个项目肯定要比一个人完成快的多,
也就是能在同一时间操作。

5.每个应用程序都使用一块内存区域,这个内存区域可以称为一个进程,内存区域中是需要执行代码的,具体执行代码就是线程去执行的。 注意:进程只是负责开辟内存空间的,线程才是负责执行代码逻辑的执行单元。

/*
fork()函数
函数的一般形式:
pid_t fork(void);
返回值:成功返回0,表示子进程;大于零表示父进程;失败返回 -1,并设置错误代码。
错误代码:
EAGAIN:当前的进程数已经达到了系统规定的上限
ENOMEM:内存不足
*/
#include
int main()
{
pid_t pid;
pid = fork();
if (pid < 0)//出错误
{
perror("fork error");
exit(1); // 0表示EXIT_SUCCESS;1表示EXIT_FAILURE
}
else if (pid > 0)//父进程
{
printf("This is the parent process, its ID is %d.\n", (int)getpid());
}
else//子进程
{
printf("This is the child process, its ID is %d.\n ", (int)getpid());
printf("This is the child process, its parent process's ID is %d.\n", (int)getppid());
}
return 0;
}

进程的五种状态

:(也可以简单理解为,创建,运行 等待 停止 死亡)

请添加图片描述

线程的创建

#include <pthread.h>
int pthread_create(pthread_t *thread,const pthread_attr_t *attr,void *(*start_routine)
(void *),void *arg);

thread:线程对象,每个线程对应一个线程对象。在使用之前得先定义出来,看它类型,
可以看出是pthread_t 类型的。
attr:这是线程属性,默认填缺省属性NULLvoid *(*start_routine)(void *);
//这个东西看起来复杂,其实就是填函数名,线程用一个函数去封装,所以填的这个函数名就是我们线程的入口。
//arg:填需要往线程里传递的参数。一次只能传递一个参数,想要传递多个参数的话,可以先定义一个结构体,
//传递结构体名,不想传递参数就填NULL。
从函数中可以看出返回值是int 类型的,创建线程成功返回0,失败则返回1,可用于判断线程是否创建成功。

    结束线程的函数:
    #include <pthread.h>  
	void pthread_exit(void *reatval);
//reatval 这个参数填的是线程结束时返回的信息,由等待线程函数接收,若不想返回信息,可填NULL。

等待线程:就是主线程需要进行的操作,因为线程是共用主线程的同一片地址空间,所以假如主线程先结束,
那么子线程也随即结束。所以要想主线程在子线程后面结束就必须有这个等待函数 函数如下:
  #include <pthread.h>    
  int pthread_join(pthread_t thread,void **retval);
//thread 需要等待的线程对象
//retval 可以看出它是一个二级指针,二级指针需要传递一级指针,而且是void 类型的。
//用于接收结束线程函数返回的内容,可为NULL。
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值