博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Windows进程线程相关概念
阅读量:3529 次
发布时间:2019-05-20

本文共 1539 字,大约阅读时间需要 5 分钟。

1. 进程的运行状态

需要进程的原因:多道程序在执行时,需要共享系统资源,从而导致各程序在执行过程中出现相互制约的关系,程序的执行表现出间断性、非封闭性、不可再现性等特征。传统的程序本身是一组指令的集合,是一个静态的概念,无法描述程序在内存中的执行情况,故引入进程的概念。多道程序并发执行,提高系统吞吐量和系统资源利用率

进程的组成:程序、数据、PCB(进程控制块)

C++中进程运行的三个状态:阻塞、运行、就绪

阻塞:在某些外部事件发生前,该进程不能运行

运行:进程正在使用CPU

就绪:进程可执行,但是它暂时停止让其他进程运行

运行和就绪状态有些类似。处于这两种状态的进程都可以运行,只是在就绪状态中,进程暂时没有CPU可用。阻塞装填就与前两种状态不同,在阻塞状态中,即使CPU空闲,进程也不能运行。

要是对进程的状态进行更加详细划分,那么进程的状态可以用下图来概括

2. 进程与线程的关系

(1)在传统的操作系统中,每个进程都有一个地址空间和一个控制线程。在多数情况下,一个进程的地址空间重要执行多个线程,在准并行上下文中,这些线程就像是不同的进程一样。有多个线程的主要原因是:许多应用程序都要求能立即执行多项操作,把运行在准并行上下文中的应用程序分解成多个单独的线程,程序设计模型就变得更简单了。通过添加线程,操作系统提供了一个新特性:并行实体能共享一个地址空间和他们的所有数据,这是执行并发的必要条件。

(2)进程和线程的不同在于,线程共享一个地址空间,而进程拥有单独的地址空间

(3)CPU时间。线程是CPU可执行调度的最小单位。也就是说,进程本身不能获得CPU时间,只有它的线程才可以。线程通过它的工作变量和栈来存储CPU寄存器的信息。栈包含与函数调用相关的数据,在每个函数被调用但尚未返回时,为其创建一个框架。线程可以再CPU上执行,而进程则不可以。但是,进程至少必须有一个线程,通常把这个线程成为主线程。因此,说在CPU上执行的进程时,指的是进程中的主线程。进程用于分组资源,线程是在CPU上调度执行的实体。在同一个进程环境中可以执行多个线程,多个线程并行执行在一个进程上下文中,与在一个计算机中并行运行的多个进程相同。

 

3. 进程使用过程中的相关API函数

CreateProcess()函数用于创建一个新进程和其主线程,新进程在主进程的安全上下文中运行。

操作系统为进程分配进程标识用于符。进程标识符用于标识进程,在进程终止之前有效。或者,对于一些API(OpenProcess()函数),进程标识符用于获取进程的句柄。最初线程的线程标识符由进程分配,该标识符可用于在OpenThread()函数中打开一个线程句柄。线程标识符在线程终止前有效,可以作为系统中线程的卫衣标识。这些标识符都返回PROCESS_INFORMATION结构。

终止进程较好的做法是调用ExitProcess()函数,因为它会给所属进程的所有DLL搜发送一条即将终止的消息。而关闭进程的其他方法就不会这样做(如,TerminateProcess() API)。注意,只要进程中只要有一个线程调用ExitProcess()函数,该进程的其他线程都会立即终止,根本没有机会执行其他代码(包括相关DLL的线程终止代码)。

4. 共享内存——临界区

程序中能被访问共享内存的部分叫做临界区(critical section)。为了必满竞态条件,必须确保一次只能有一个进程进入临界区。要使用共享数据,必须要处理好下面的4个条件。

(1)不允许同时有两个进程在临界区内

(2)不得对CPU的速度或数量进程假设

(3)在临界区外运行的进程阻碍其他进程

(4)不得由任何进程处于永远等待进入临界区

你可能感兴趣的文章
vector 的点点滴滴的总结
查看>>
测试用例
查看>>
自动化测试学习步骤
查看>>
自动化测试需要掌握的知识
查看>>
HTTP协议
查看>>
Python问题总结01
查看>>
Python小程序——冒泡排序
查看>>
cmd中输入net start mysql 提示:服务名无效或者MySQL正在启动 MySQL无法启动
查看>>
LeetCode 206反转链表 [javsScript]
查看>>
[LeetCode javaScript] 3. 无重复字符的最长子串
查看>>
[LeetCode javaScript] 6. Z字形变换
查看>>
[LeetCode javaScript]455. 分发饼干
查看>>
[LeetCode javaScript] 735. 行星碰撞
查看>>
[LeetCode javaScript] 125. 验证回文串
查看>>
[LeetCode javaScript] 226. 翻转二叉树
查看>>
[LeetCode javaScript] 520. 检测大写字母
查看>>
[LeetCode javaScript] 350. 两个数组的交集 II
查看>>
[LeetCode javaScript] 53.最大子序和
查看>>
[LeetCode javaScript] 101. 对称二叉树
查看>>
[LeetCode javaScript] 860. 柠檬水找零
查看>>