易语言关于程序进程和线程的基础知识

程序是计算机指令的集合,它以文件的形式存储在磁盘上。

进程:通常被定义为一个正在运行的程序的实例,是一个程序在其自身的地址空间中的一次执行活动。

进程是资源申请、调度和独立运行的单位,因此,它使用系统中的运行资源;而程序不能申请系统资源,不能被系统调度,也不能作为独立运行的单位,因此,它不占用系统的运行资源。

进程由两个部分组成:

  • 1、操作系统用来管理进程的内核对象。内核对象也是系统用来存放关于进程的统计信息的地方。
  • 2、地址空间。它包含所有可执行模块或DLL模块的代码和数据。它还包含动态内存分配的空间。如线程堆栈和堆分配空间。

进程是不活动的。进程从来不执行任何东西,它只是线程的容器。若要使进程完成某项操作,它必须拥有一个在它的环境中运行的线程,此线程负责执行包含在进程的地址空间中的代码。

单个进程可能包含若干个线程,这些线程都“同时” 执行进程地址空间中的代码。

每个进程至少拥有一个线程,来执行进程的地址空间中的代码。当创建一个进程时,操作系统会自动创建这个进程的第一个线程,称为主线程。此后,该线程可以创建其他的线程。

进程地址空间

系统赋予每个进程独立的虚拟地址空间。对于32位进程来说,这个地址空间是4GB。

每个进程有它自己的私有地址空间。进程A可能有一个存放在它的地址空间中的数据结构,地址是0x12345678,而进程B则有一个完全不同的数据结构存放在它的地址空间中,地址是0x12345678。当进程A中运行的线程访问地址为0x12345678的内存时,这些线程访问的是进程A的数据结构。当进程B中运行的线程访问地址为0x12345678的内存时,这些线程访问的是进程B的数据结构。进程A中运行的线程不能访问进程B的地址空间中的数据结构,反之亦然。

4GB是虚拟的地址空间,只是内存地址的一个范围。在你能成功地访问数据而不会出现非法访问之前,必须赋予物理存储器,或者将物理存储器映射到各个部分的地址空间。

4GB虚拟地址空间中,2GB是内核方式分区,供内核代码、设备驱动程序、设备I/O高速缓冲、非页面内存池的分配和进程页面表等使用,而用户方式分区使用的地址空间约为2GB,这个分区是进程的私有地址空间所在的地方。一个进程不能读取、写入、或者以任何方式访问驻留在该分区中的另一个进程的数据。对于所有应用程序来说,该分区是维护进程的大部分数据的地方。

线程由两个部分组成:

  • 1、线程的内核对象,操作系统用它来对线程实施管理。内核对象也是系统用来存放线程统计信息的地方。
  • 2、线程堆栈,它用于维护线程在执行代码时需要的所有参数和局部变量。

当创建线程时,系统创建一个线程内核对象。该线程内核对象不是线程本身,而是操作系统用来管理线程的较小的数据结构。可以将线程内核对象视为由关于线程的统计信息组成的一个小型数据结构。

线程总是在某个进程环境中创建。系统从进程的地址空间中分配内存,供线程的堆栈使用。新线程运行的进程环境与创建线程的环境相同。因此,新线程可以访问进程的内核对象的所有句柄、进程中的所有内存和在这个相同的进程中的所有其他线程的堆栈。这使得单个进程中的多个线程确实能够非常容易地互相通信。

线程只有一个内核对象和一个堆栈,保留的记录很少,因此所需要的内存也很少。

因为线程需要的开销比进程少,因此在编程中经常采用多线程来解决编程问题,而尽量避免创建新的进程。

操作系统为每一个运行线程安排一定的CPU时间 —— 时间片。系统通过一种循环的方式为线程提供时间片,线程在自己的时间内运行,因时间片相当短,因此,给用户的感觉,就好像线程是同时运行的一样。

如果计算机拥有多个CPU,线程就能真正意义上同时运行了。

互斥对象

互斥对象(mutex)属于内核对象,它能够确保线程拥有对单个资源的互斥访问权。

互斥对象包含一个使用数量,一个线程ID和一个计数器。

ID用于标识系统中的哪个线程当前拥有互斥对象,计数器用于指明该线程拥有互斥对象的次数。事件对象

事件对象也属于内核对象,包含一个使用计数,一个用于指明该事件是一个自动重置的事件还是一个人工重置的事件的布尔值,另一个用于指明该事件处于已通知状态还是未通知状态的布尔值。

有两种不同类型的事件对象。一种是人工重置的事件,另一种是自动重置的事件。当人工重置的事件得到通知时,等待该事件的所有线程均变为可调度线程。当一个自动重置的事件得到通知时,等待该事件的线程中只有一个线程变为可调度线程。

关键代码段

关键代码段(临界区)工作在用户方式下。

关键代码段(临界区)是指一个小代码段,在代码能够执行前,它必须独占对某些资源的访问权。

线程死锁

哲学家进餐的问题

线程1拥有了临界区对象A,等待临界区对象B的拥有权,线程2拥有了临界区对象B,等待临界区对象A的拥有权,就造成了死锁。互斥对象、事件对象与关键代码段的比较

互斥对象和事件对象属于内核对象,利用内核对象进行线程同步,速度较慢,但利用互斥对象和事件对象这样的内核对象,可以在多个进程中的各个线程间进行同步。

关键代码段是工作在用户方式下,同步速度较快,但在使用关键代码段时,很容易进入死锁状态,因为在等待进入关键代码段时无法设定超时值。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。如果你想了解更多相关内容请查看下面相关链接

(0)

相关推荐

  • 易语言枚举进程通过窗口句柄获取已经登录的QQ号码

    DLL命令表 .版本 2 .DLL命令 GetDesktopWindow, 整数型, "user32.dll", "GetDesktopWindow" .DLL命令 CreateToolhelp32Snapshot, 整数型, "kernel32", "CreateToolhelp32Snapshot" .参数 dwFlags, 整数型, , 0 .参数 th32ProcessIE, 整数型, , 0 .DLL命令 Proce

  • 易语言的进程检测程序制作

    许多易语言新手朋友在制作软件的过程中也许可能会碰到需要为自己的程序增加一个检测进程的功能,可能是为了防止自己的程序被其他工具修改或者其他目的,但是却又不知道怎么编写代码,所以为了帮助大家解决这个问题,今天小编就来叫大家如何用易语言编写一个检测指定进程的工具. 1.首先,我们先将界面画好,如图所示. 2.接着双击启动窗口跳转到代码编辑区域开始写代码.接着双击启动窗口跳转到代码编辑区域开始写代码. 3.首先我们新建一个子程序,用来检测指定进程是否存在的,相当于程序的核心部分了.将子程序命名为"进程是

  • 易语言检测文件被哪个进程占用的代码

    检测文件占用的代码 此功能需要加载贝贝吧模块6.6 .版本 2 .支持库 eAPI .程序集 窗口程序集_启动窗口 .子程序 _查询按钮_被单击 .局部变量 进程名, 进程信息, , "0" .局部变量 进程id, 整数型, , "0" .局部变量 a, 整数型, , "0" .局部变量 i, 整数型 进程名 = 取系统进程列表 () 显示占用列表框.清空 () .计次循环首 (取数组成员数 (进程名), i) .如果真 (寻找文本 (到小写 (

  • 易语言枚举进程所有句柄信息的代码

    DLL命令表 .版本 2 .DLL命令 GetCurrentProcessId, 整数型, "kernel32.dll", "GetCurrentProcessId" .DLL命令 GetCurrentProcess, 整数型, "kernel32.dll", "GetCurrentProcess" .DLL命令 RtlMoveMemory_SYSTEM_HANDLE_INFORMATION, , "kernel32

  • 易语言获取进程id的方法

    本文介绍如何通过易语言,来获取进程ID.(本次教程不需要用到dll和模块,十分简单) 1.启动易语言,新建"Windows窗口程序". 2.建立一个"按钮" 3.双击"按钮" 4.放入以下代码: .版本 2 .支持库 eAPI .支持库 spec .程序集 窗口程序集1 .子程序 _按钮1_被单击 .局部变量 进程信息, 进程信息, , "0" .局部变量 n, 整数型 .局部变量 取进程ID, 整数型 进程信息 = 取系统进

  • 易语言优化进程内存方法

    本篇文章主要向您介绍如何使用编程软件"易语言"做到指定进程进行"内存优化" 1.启动"易语言". 2.选择"菜单栏"中的"f.程序",再在弹出的列表中选择"N.新建". 3.在弹出的标题为"新建:"的窗口中选择"Windows窗口程序",再点击标题为"确定(o)"的按钮. 4.在背景为灰色的,且标题为""(空

  • 易语言关于程序进程和线程的基础知识

    程序是计算机指令的集合,它以文件的形式存储在磁盘上. 进程:通常被定义为一个正在运行的程序的实例,是一个程序在其自身的地址空间中的一次执行活动. 进程是资源申请.调度和独立运行的单位,因此,它使用系统中的运行资源:而程序不能申请系统资源,不能被系统调度,也不能作为独立运行的单位,因此,它不占用系统的运行资源. 进程由两个部分组成: 1.操作系统用来管理进程的内核对象.内核对象也是系统用来存放关于进程的统计信息的地方. 2.地址空间.它包含所有可执行模块或DLL模块的代码和数据.它还包含动态内存分

  • 易语言倒计时程序制作

    这里教大家怎么制作易语言倒计时程序,接下来大家看步骤就会明白了. 1.第一步添加按钮组件两个,编辑框一个,标签一个.透明标签两个.时钟一个. 再新建一个窗口程序集. 2.这里是新建的窗口程序集.有一个标签和透明标签.属性那里可以设置窗口无边框,然后标签把窗口覆盖,接着放入透明标签,什么字自己可以设置. 3.接下来就是敲代码了,下图是上图步奏的代码.这也是很简单的,也就看下图,这边我有标记的红色长方形的线的这里点击然后可以插入鼠标左键被按下的这个子程序,然后写入代码看下图就可以了. 4.这里是主程

  • 详解易语言的程序的输入方法概念

    为了便于输入程序,易语言内置四种名称输入法:首拼.全拼.双拼.英文.三种拼音输入法均支持南方音及多音字.首拼输入法及全拼输入法在系统中被合并为"首拼及全拼输入法",系统自动判别所输入的拼音是首拼方式还是全拼方式.双拼输入法的编码规则与 Windows 系统所提供的双拼输入法一致.例如:欲输入"取整 (1.23)"语句,各种输入法的输入文本为: ・ 首拼及全拼输入法: qz(1.23) 或者 quzheng(1.23) ・ 双拼输入法: quvg(1.23) ・ 英文

  • 易语言控制台程序调用窗口的组件详解

    最近有小伙伴问我,易语言的模块或者控制台程序怎么调用窗口的组件,现在我发经验,喜欢的关注哦,给大家解决了,大神不要喷 其实易语言里面的那些按钮啊编辑框啊都是类,什么是类自己百度,不啰嗦.其实易语言里面的那些按钮啊编辑框啊都是类,什么是类自己百度,不啰嗦. 而在窗口显示的其实是类实体化,有可视类(可以看见.点击等)的属性类型而在窗口显示的其实是类实体化,有可视类(可以看见.点击等)的属性类型 向文本型啊,整数型啊都是一个类型,不过是原生的支持库的,科普完成向文本型啊,整数型啊都是一个类型,不过是原

  • 易语言结束程序的代码详解

    易语言怎么结束程序呢?这个是我们要考虑的,请看下面. 非无私奉献,拒绝看经验不回复,学懂了记得按照下面做: 具体操作请看图. 1.易语言新建一个windows窗口 2.我们需要添加一个按钮 按住右边框内图标 3.然后再窗口上 就可以拉出来一个按钮 4.点击按钮 进入按钮代码编辑区 5.这里我们输入函数 结束()就可以了很简单 6.我们运行看看窗口 然后点击按钮 就可以关闭当前程序了

  • Thread线程的基础知识及常见疑惑点总结

    引言 相信各位道友在平时工作中已经很少直接用到Thread线程类了,现在大多是通过线程池或者一些多线程框架来操作线程任务,但我觉得还是有必要了解清楚Thread线程类中各种方法的含义,了解了底层才能更好的理解框架.应用框架.下面我就将Thread线程的相关基础点总结一二,以供观瞻. 正文 1.Thread线程的状态 根据<深入理解Java虚拟机>一书的讲述,Java语言定义了五种线程状态,分别为:创建(new).运行(Runnable).等待(waiting).阻塞(blocked).结束(t

  • 易语言检测程序是不是在虚拟机中运行的代码

    汇编检测虚拟机的代码 .版本 2 .程序集 窗口程序集1 .子程序 __启动窗口_创建完毕, , , .子程序 检测虚拟机, 逻辑型 .局部变量 a, 整数型 .如果 (try_ ()) a = VMWare检测 () try_out () .否则 .如果结束 .如果真 (a ≠ 0) 返回 (真) .如果真结束 .如果 (try_ ()) a = VPC检测 () try_out () .否则 .如果结束 返回 (a ≠ 0) .子程序 VMWare检测, 整数型, , 此函数不能独立在实体机

  • 易语言编写程序即时查询对应帮助信息的方法

    如欲对系统中各运行支持库内的命令.库定义数据类型.库定义常量等等信息进行查找,请在易系统启动后使用以下方法之一: 直接在工作夹内的支持库夹中单击对应的所欲查找其信息的项目,此时所有的相关信息将会显示在系统的提示夹或者状态行中,如下图,光标处: 如果欲将这些信息提取出来打印或者以后阅读,请在相应项目上单击鼠标右键,在所弹出的菜单中选择"拷贝帮助文本到剪贴板"或者"写帮助文本到文件"功能输出与该项目及该项目所有子项目相关的帮助信息.譬如:在支持库名项目上进行此操作将输出

  • 解决易语言空壳程序360误报

    空壳程序定义为,程序没有任何组件,没有任何代码,没有自动的加花. 1.直接生成,被主动防御杀. 2.加入启动窗口创建完毕和启动窗口将被销毁,被主动防御杀 3.去掉勾选 配置中写入版本信息,直接生成,免杀 4.加入启动窗口创建完毕和启动窗口将被销毁,去掉勾选 配置中写入版本信息,直接生成,免杀 5.直接生成,勾选写入版本信息,但稍微添加版本信息,例如:填写了程序名称.免杀 6.加入启动窗口创建完毕和启动窗口将被销毁,勾选写入版本信息,但稍微添加版本信息,例如:填写了程序名称.免杀 结论,默认的版本

  • 易语言编程基础知识

    创建一个易应用程序只需要短短几分钟的时间 - 通过在设计窗口上"绘制"诸如编辑框和按钮等组件来创建用户界面.然后,为窗口和组件设置属性以规定诸如标题.位置.尺寸等的值.最后,编写处理程序将生命真正赋于程序. 组件及事件驱动 组件及其事件驱动是使用易语言在 Windows 环境下编程的基础知识.所谓"组件",即用作组成用户图形界面的基本成员,譬如:窗口.编辑框.图片框等等.组件按可否容纳其它组件划分为容器类和非容器类.按运行时是否可能具有可视外形划分为界面类和功能类.

随机推荐