进程和线程

进程

引用百度百科
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。

线程

引用百度百科
线程(thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。在Unix System V及SunOS中也被称为轻量进程(lightweight processes),但轻量进程更多指内核线程(kernel thread),而把用户线程(user thread)称为线程。

简言之,当我们启动了一个应用程序的时候,计算机会相应地创建一个进程,而这样的一个进程就对应于这个应用程序,比如说:当我们启动了WeChat时,我们可以在任务管理器上看到一个进程为WeChat:
在这里插入图片描述
另外,我们可以看到内存这一列上WeChat进程占用内存155.8MB,即在计算机创建一个进程后,操作系统会为进程分配一部分的内存,应用的所有状态都会保存在这块内存中;
而线程,可以说一个进程包含有一个或多个线程,应用创建线程来辅助工作,这些线程可以共享以上提及的这块内存中的数据;
在这里插入图片描述
当我们启动的应用关闭了,对应的应用所创建的进程也随之终结,操作系统也会释放相关内存。所以有这样的一个操作,当应用处于卡顿无响应状态时,我们可以开启任务管理器,手动终结应用相关进程,进而操作系统释放相关内存,应用随之也能关闭了,最后重启应用即可;
在这里插入图片描述
当然值得一提,进程的终结,伴随着着进程内的线程也会终结;反之线程的终结,不一定会让进程终结;

这时候可能有人会发现,当我们启动了一个应用时,在任务管理器可能看到的不仅仅是一个进程。那是因为一个进程还可以要求操作系统生成另一个进程来执行不同的任务,操作系统又会为新的进程分配独立的内存;
我们可以称应用的核心进程为主进程,主进程启动后要求操作系统生成的另外的进程为副进程,主进程和副进程之间可以使用 IPC (Inter Process Communication)进行通信(这里不展开讲解IPC);主进程的终结会让副进程随之终结,所以如上相同的情况,如果应用卡顿无响应状态,我们结束进程时,选择主进程进行手动终结即可(一般情况,主进程占用内存最大);

举一个例子再次说明进程与线程:
某大学计算机学院内有多个实验室,不同实验室分别在实验室A,B,C…同时,实验室分别在研发不同的实验项目1,2,3…
某一天,院长决定开启实验项目1,这时候实验室A开始工作,这里【院长决定开启实验项目1】即【我们开启应用】,【实验室A开始工作】即【进程开始工作】,【实验室】就是【进程】;
我们再想想,这个项目需要很多的人力投入,所以实验室A决定了让实验室所有的成员参与,这是实验室成员就开始工作了,并且成员之间相互协调,也会有各自的工作内容,这里【实验室成员开始工作】即【线程开始工作】,【实验室成员】即【线程】;

综上,进程与线程之间的区别:

  1. 一个程序至少有一个进程,一个进程至少有一个线程
  2. 线程的划分尺度小于进程,使得多线程程序的并发性高
  3. 进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率
  4. 每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制
  5. 多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配
    ————————————————
    版权声明:本文为CSDN博主「我的小屋」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/weixin_39430694/article/details/78518080
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实验目的 (1)掌握Windows系统提供的线程创建与撤销系统调用 (2)掌握Windows系统环境下线程的创建与撤销方法 2 实验准备知识 (1)线程创建 CreateThread()完成线程的创建。它在调用进程的地址空间上创建一个线程,执行指定的函数,并返回新建立线程的句柄。 原型: HANDLE CreateThread(   LPSECURITY_ATTRIBUTES lpThreadAttributes,   DWORD dwStackSize,   LPTHREAD_START_ROUTINE lpStartAddress,   LPVOID lpParameter,   DWORD dwCreationFlags,   LPDWORD lpThreadId);   参数说明:   lpThreadAttributes:指向SECURITY_ATTRIBUTES型态的结构的指针。在Windows 98中忽略该参数。在Windows NT中,它被设为NULL,表示使用缺省值。   dwStackSize,线程堆栈大小,一般=0,在任何情况下,Windows根据需要动态延长堆栈的大小。   lpStartAddress,指向线程函数的指针,形式:@函数名,函数名称没有限制,但是必须以下列形式声明:   DWORD WINAPI ThreadProc (LPVOID pParam) ,格式不正确将无法调用成功。   lpParameter:向线程函数传递的参数,是一个指向结构的指针,不需传递参数时,为NULL。   dwCreationFlags :线程标志,可取值如下   CREATE_SUSPENDED: 创建一个挂起的线程   0 :创建后立即激活。   lpThreadId:保存新线程的id。   返回值:   函数成功,返回线程句柄;函数失败返回false。 (2)撤销线程 ExitThread()用于撤销当前线程 原型: VOID ExitThread( DWORD dwExitCode ); 参数说明: DwExitCode:指定线程返回码 返回值: 该函数没有返回值 用法举例: ExitThread(0); (3)挂起线程 Sleep()用于挂起当前正在执行的线程 原型: VOID Sleep( DWORD dwMilliseconds ); 参数说明: dwMilliseconds:指定挂起时间,单位为ms(毫秒)。 返回值: 该函数没有返回值。 (4)关闭句柄 函数CloseHandle()用于关闭已打开对象的句柄,其作用与释放动态申请的内存空间类似,这样可以释放系统资源,使进程安全运行。 原型: BOOL CloseHandle( HANDLE hObject ); 参数说明: hObject:已打开对象的句柄。 返回值: 成功,返回值为非0值;失败,则返回值为0.

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值