当前位置: 首页 > news >正文

进程和线程详解

在计算机领域中,进程和线程是非常重要的概念。了解进程和线程是软件开发的基础,也是计算机科学教育中的一部分。本文将介绍进程和线程的概念、区别和应用。

一、什么是进程

在计算机科学中,进程是正在执行的程序实例。一个进程可以由一个或多个线程组成,也可以没有线程。每个进程都有它自己的地址空间和系统资源,如文件句柄、网络连接和设备驱动程序等。因此,多个进程可以同时执行,每个进程在运行时都不会影响其他进程的运行。

一个进程可以由以下方式创建:

  • 系统启动时自动创建的进程
  • 用户登录时创建的进程
  • 用户手动启动的程序
  • 系统调用创建的进程

当你打开一个软件程序时,计算机会为它分配一个资源区域,并为其分配一定数量的内存,这个程序就是一个进程。举个例子来说,比如你打开了一个文字编辑器,这个编辑器就是一个进程。计算机会给它分配一定数量的内存空间,用于它的运行和存储。

在计算机操作系统中,进程是资源分配的基本单位,每个进程都有自己的内存空间、CPU时间和其他系统资源。一个进程可以包含多个线程,每个线程都可以执行不同的任务,但是它们共享相同的内存空间和其他资源,因此可以共同协作完成复杂的任务。

可以想象为一家公司,这家公司有自己的办公场所、设备、员工和各种资源。这个公司就相当于一个进程,它拥有自己的独立内存空间、运行状态、资源和文件系统。公司的员工可以看作是线程,他们可以并行地处理不同的工作,共享公司的资源和信息,但也需要遵守公司的规章制度和资源管理策略。

当公司需要处理更多的工作时,它可以通过招聘新员工来增加线程数,从而提高工作效率。而当公司某个部门需要独立运作时,可以将这个部门独立出来成立一个新公司,这就相当于创建了一个新的进程。这些公司可以独立运作,但也可以通过合作共享资源和信息。

二、什么是线程

在计算机科学中,线程是进程的一部分,是操作系统能够进行运算调度的最小单位。简单来说,线程是程序中的执行流程,是在同一个进程中运行的多个执行单元。每个线程都有自己的指令指针、堆栈和局部变量等,但它们共享进程的代码、数据和全局变量等资源。多线程可以实现并发执行,提高程序的效率。

举个例子,比如在一个电商网站上,当用户在网站上进行某些操作,如浏览商品、添加购物车、下单等,这些操作可能需要在后台进行一些数据处理,比如从数据库中查询信息、计算订单金额等。这时候就可以使用多线程来提高网站的性能,比如创建一个线程来查询数据库,创建另一个线程来计算订单金额,这些线程可以并发执行,提高了网站的响应速度和吞吐量。

一个线程通常由以下组成:

线程ID(Thread ID):是线程的唯一标识符,可以用来区分不同的线程。

线程状态(Thread State):线程可能处于不同的状态,比如正在运行、阻塞等待、就绪等待等。线程的状态通常由操作系统内核维护,程序员可以使用相关的API来查询和修改线程状态。

程序计数器(Program Counter):是一个记录程序执行位置的寄存器,用来指示线程当前正在执行的指令位置。在多线程环境中,每个线程都有自己独立的程序计数器,用来跟踪自己的执行位置。

栈(Stack):线程有自己的栈,用来存储局部变量、函数调用的返回地址等信息。每个线程的栈大小是固定的,如果线程需要更大的栈空间,可以使用操作系统提供的API来分配更多的内存。

寄存器集(Register Set):线程有自己的寄存器集,用来存储临时变量、函数参数、返回值等信息。不同的操作系统和CPU架构可能有不同的寄存器集,程序员可以使用相关的API来访问和修改线程的寄存器。

线程是程序执行的基本单元,它拥有自己的状态、执行位置、内存空间和寄存器集。不同的线程可以并发执行,共享程序的代码和数据,提高程序的并发性和效率。

三、进程如何创建

当操作系统启动时,会创建一个用于管理进程的进程管理器进程,这个进程会监控系统中所有的进程,并为它们分配系统资源。当一个程序启动时,会通过操作系统创建一个新的进程来运行程序,这个过程就是进程的创建。

进程的创建包括以下几个步骤:

  1. 分配空间:操作系统需要为新进程分配内存空间,这个空间将用来存储进程的代码、数据、堆栈等。

  2. 设置上下文环境:操作系统需要将新进程的上下文环境初始化,包括进程ID、进程状态、寄存器等。

  3. 加载程序:操作系统需要将要执行的程序加载到新进程的内存空间中。

  4. 分配资源:操作系统需要为新进程分配资源,如文件描述符、网络连接、进程间通信机制等。

  5. 开始执行:操作系统将新进程的状态设置为“就绪”,并将它加入到可执行进程队列中,等待CPU调度执行。

进程的创建是一个比较复杂的过程,需要操作系统做出多项准备工作,并分配大量的系统资源。在开发中,需要注意进程创建的性能和安全等问题,避免出现资源竞争、死锁等问题。

创建进程时,需要注意以下几个问题:

  • 进程标识符:每个进程都需要有一个唯一的标识符来区分它与其他进程。在创建进程时需要为该进程分配一个唯一的进程标识符(PID)。

  • 进程空间:每个进程都有自己的内存空间,包括代码段、数据段和堆栈等。在创建进程时,需要为进程分配足够的内存空间,以便它可以运行其代码并存储其数据。

  • 进程状态:进程可以处于多个不同的状态,如运行、等待、睡眠等。在创建进程时,需要指定进程的初始状态,例如是否立即开始运行。

  • 进程优先级:每个进程都有一个优先级,用于确定它在竞争CPU时间时的优先级。在创建进程时,可以指定进程的优先级,或者使用默认优先级。

  • 进程间通信:多个进程之间需要进行通信,以便共享数据或协调它们的活动。在创建进程时,需要考虑如何实现进程间通信(IPC),例如使用管道、套接字或共享内存等。

  • 进程安全:在创建进程时,需要确保它能够安全地运行,不会破坏其他进程或系统的稳定性。这可以通过对进程的权限、资源访问等方面进行限制来实现。

总之,在创建进程时,需要仔细考虑并解决这些问题,以确保进程能够正确地运行,并与其他进程或系统无缝地协同工作。

3.1 用C#中如何创建一个进程

C# 中,创建进程的类是 Process,定义在 System.Diagnostics 命名空间中。下面是一个简单的创建子进程的示例:

using System;
using System.Diagnostics;class Program
{static void Main(string[] args){Process child = new Process();child.StartInfo.FileName = "notepad.exe";  // 子进程要执行的程序child.Start();  // 启动子进程Console.WriteLine("Hello from parent! Child PID={0}, parent PID={1}", child.Id, Process.GetCurrentProcess().Id);}
}

代码创建了一个新的进程,子进程会执行notepad.exe程序并打开记事本。在这段代码中,通过引入System.Diagnostics命名空间,创建了一个Process对象,用于管理一个外部进程,即子进程。下面我们一起分析一下这段代码:

Process child = new Process();

这句代码使用Process类创建了一个进程对象childchild对象将用于管理一个外部进程,即子进程。

child.StartInfo.FileName = "notepad.exe";

这句话配置了子进程要启动的程序,这里是notepad.exe。

child.Start();
Console.WriteLine("Hello from parent! Child PID={0}, parent PID={1}", child.Id, Process.GetCurrentProcess().Id);

这两句话用于启动和输出父进程的信息,包括子进程ID和父进程ID。

3.2 用C语言如何创建一个进程

在C语言中,可以使用系统调用函数fork()来创建一个进程。fork()函数调用成功后,将会返回两次,一次在父进程中返回,一次在子进程中返回,可以通过返回值的不同来区分父进程和子进程。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>int main() {pid_t pid = fork(); // 创建子进程if (pid < 0) { // 创建进程失败printf("Error: fork failed\n");exit(1);} else if (pid == 0) { // 子进程printf("Hello from child! Child PID=%d, parent PID=%d\n", getpid(), getppid());exit(0);} else { // 父进程printf("Hello from parent! Child PID=%d, parent PID=%d\n", pid, getpid());exit(0);}
}

上面代码首先通过fork()函数创建一个子进程,然后判断fork()的返回值,如果小于0表示创建进程失败,否则根据返回值判断是父进程还是子进程。在子进程中,输出子进程的进程ID以及父进程的进程ID,并通过exit()函数退出进程;在父进程中,输出子进程的进程ID以及父进程的进程ID,并通过exit()函数退出进程。

在该示例代码中,子进程和父进程的区别是通过fork()函数的返回值进行判断的。在子进程中,fork()函数的返回值为0,而在父进程中,fork()函数的返回值是子进程的进程ID

3.3 用python如何创建一个进程

在 Python 中,创建进程的主要方式是使用 multiprocessing 模块。下面是一个简单的示例代码:

import os
from multiprocessing import Processdef worker():print("I am a child process with pid: {}".format(os.getpid()))if __name__ == '__main__':p = Process(target=worker)p.start()print("I am the parent process with pid: {}".format(os.getpid()))

在这个代码中,首先我们导入了 osmultiprocessing 模块。os.getpid() 函数可以返回当前进程的 PID。然后定义了一个函数 worker(),该函数会在子进程中运行,简单地打印一条消息。接着,在 if __name__ == '__main__': 下创建了一个 Process 对象 p,该对象的 target 参数指定要在子进程中运行的函数。然后通过 p.start() 启动子进程。最后,在父进程中打印一条消息,指明当前进程的 PID

四、进程和线程难点

进程和线程的理解难点主要在于它们都属于操作系统的概念,并且涉及到很多底层的实现细节,比较抽象和复杂。同时,它们的概念也比较相似,容易混淆。

具体来说,进程和线程的概念涉及到很多操作系统的实现细节,比如进程间的通信、线程的同步和互斥等,需要深入了解操作系统的原理和实现细节才能更好地理解它们的概念和使用方法。此外,对于初学者来说,进程和线程的概念也比较相似,容易混淆,需要进行逐一分析和对比,以便更好地理解它们之间的区别和联系。

另外,对于一些高级的应用场景,比如多线程编程、多进程编程、并发编程等,需要具备一定的编程经验和技能,才能更好地使用进程和线程进行应用开发。因此,进程和线程的理解难点也在于需要掌握一定的编程技能和经验。

当你打开一个浏览器并开始浏览网页时,你可以将浏览器看作是一个进程,而浏览器中的每个标签页或窗口都是一个线程。这些线程共享浏览器的进程资源,如内存和处理器,但每个线程都有自己的代码和执行路径。

以一个标签页为例,当你打开一个网页时,浏览器会创建一个新的线程,该线程负责获取页面内容、解析HTML、执行JavaScript等任务。这个线程可能会创建更多的线程来处理页面上的其他资源,如图像和CSS文件。

当你打开多个标签页时,每个标签页都会有自己的线程,它们可以并行执行。这样可以提高浏览器的性能,因为不同的标签页可以在不影响彼此的情况下同时加载内容。

如果还是不好理解,我再举个生活中的例子:

想象一下你在家里做饭,你需要同时进行烧菜和洗碗这两个任务。你可以把这两个任务分配给不同的人来完成,这就类似于进程中创建了两个线程分别处理这两个任务。而如果你自己来完成这两个任务,你可以先烧一会儿菜,然后放下锅,去洗碗,洗完后再回来继续烧菜,这就类似于一个线程在处理多个任务时的情况。

五、总结

学习进程和线程可以从以下几点入手:

  1. 先了解进程和线程的基本概念和特点,包括进程和线程的定义、区别、组成等等。

  2. 掌握进程和线程的创建、调度和同步等操作,学会如何利用编程语言的 API 进行实现。

  3. 了解进程和线程的应用场景,包括并发编程、多任务处理、网络编程等等。

  4. 实践中多写一些并发程序,可以更好地理解和掌握进程和线程的概念,熟悉各种并发编程模型和算法。

  5. 深入了解操作系统的底层原理,对于进程和线程的实现、调度和管理等有更深刻的认识。

  6. 推荐阅读相关经典书籍和文章,如《操作系统概念》、《深入理解计算机系统》、《程序员的自我修养》等等。

👇点击下方公众号卡片获取资料👇

相关文章:

进程和线程详解

在计算机领域中&#xff0c;进程和线程是非常重要的概念。了解进程和线程是软件开发的基础&#xff0c;也是计算机科学教育中的一部分。本文将介绍进程和线程的概念、区别和应用。 一、什么是进程 在计算机科学中&#xff0c;进程是正在执行的程序实例。一个进程可以由一个或…...

《刀锋》读书笔记

刀锋&#xff08;毛姆长篇作品精选&#xff09;毛姆50个笔记点评认为好看的确是完美的结局。《刀锋》里面的人每个人都以自己的方式生活着。艾略特的势利&#xff0c;拉里的自由&#xff0c;伊莎贝尔的现实&#xff0c;苏珊的清醒&#xff0c;索菲的堕落&#xff0c;至于“我”…...

nginx中的ngx_modules

ngx_modules和ngx_module_names是configure脚本生成的&#xff0c;是在objs/ngx_modules.c文件中与其生成的相关的脚本文件相关的变量在options脚本中定义了objs目录的变量NGX_OBJSobjs在init脚本中定义的最终存放ngx_modules的文件 NGX_MODULES_C$NGX_OBJS/ngx_modules.c2. 处…...

设计模式之访问者模式

什么是访问者模式 访问者模式提供了一个作用于某对象结构中的各元素的操作表示&#xff0c;他使我们可以在不改变各元素的类的前提下定义作用于这些元素的新操作。     访问者模式主要包含以下几个角色&#xff1a;         Vistor(抽象访问者)&#xff1a;为对象结…...

Go项目(三)

文章目录用户微服务表结构查表web 服务跨域问题图形验证码短信用户注册服务中心注册 grpc 服务动态获取端口负载均衡配置中心启动项目小结用户微服务 作为系统的第一个微服务&#xff0c;开发的技术点前面已经了解了一遍&#xff0c;虽有待补充&#xff0c;但急需实战这里主要…...

CTK学习:(一)编译CTK

CTK插件框架简介 CTK Plugin Framework是用于C++的动态组件系统,以OSGi规范为模型。在此框架下,应用程序由不同的组件组成,遵循面向服务的方法。 ctk是一个开源项目,Github 地址:https://github.com/commontk。 源码地址commontk/CTK: A set of common support code for…...

15种NLP数据增强方法总结与对比

数据增强的方法 数据增强&#xff08;Data Augmentation&#xff0c;简称DA&#xff09;&#xff0c;是指根据现有数据&#xff0c;合成新数据的一类方法。毕竟数据才是真正的效果天花板&#xff0c;有了更多数据后可以提升效果、增强模型泛化能力、提高鲁棒性等。然而由于NLP…...

Python每日一练(20230219)

目录 1. 循环随机取数组直到得出指定数字&#xff1f; 2. 旋转链表 3. 区间和的个数 1. 循环随机取数组直到得出指定数字&#xff1f; 举个例子&#xff1a; 随机数字范围&#xff1a;0~100 每组数字量&#xff1a;6&#xff08;s1,s2,s3,s4,s5,s6&#xff09; 第二轮开始随…...

vTESTstudio - VT System CAPL Functions - VT7001

vtsSerialClose - 关闭VT系统通道的串行端口功能&#xff1a;关闭由系统变量命名空间指定的VT系统通道的串行端口。Target&#xff1a;目标通道变量空间名称&#xff0c;例如&#xff1a;VTS::ECUPowerSupply返回值&#xff1a;0&#xff1a;成功重置目标通道最大和最小值-1&am…...

「可信计算」论文初步解读

可信计算组织&#xff08;Ttrusted Computing Group,TCG&#xff09;是一个非盈利的工业标准组织&#xff0c;它的宗旨是加强在相异计算机平台上的计算环境的安全性。TCG于2003年春成立&#xff0c;并采纳了由可信计算平台联盟&#xff08;the Trusted Computing Platform Alli…...

CSDN 算法技能树 蓝桥杯-基础 刷题+思考总结

切面条-蓝桥杯-基础-CSDN算法技能树https://edu.csdn.net/skill/algorithm/algorithm-530255df51be437b967cbc4524fe66ea?category188 目录 切面条 大衍数列 门牌制作 方阵转置 微生物增殖 成绩统计 星系炸弹 判断闰年的依据: 特别数的和 *日志统计*&#xff08;双指…...

信小程序点击按钮绘制定制转发分享图

1. 说明 先上代码片断分享链接&#xff1a; https://developers.weixin.qq.com/s/vl3ws9mA72GG 使用 painter 画图 按钮传递定制化信息 效果如下&#xff1a; 2. 关键代码说明 文件列表如下&#xff1a; {"usingComponents": {"painter": "/com…...

Python自动化测试-使用Pandas来高效处理测试数据

Python自动化测试-使用Pandas来高效处理测试数据 目录&#xff1a;导读 一、思考 二、使用pandas来操作Excel文件 三、使用pandas来操作csv文件 四、总结 一、思考 1.Pandas是什么&#xff1f; 功能极其强大的数据分析库可以高效地操作各种数据集 csv格式的文件Excel文件H…...

语音增强学习路线图Roadmap

语音增强算是比较难的研究领域&#xff0c;从入门到精通有很多台阶&#xff0c;本文介绍一些有价值的书籍&#xff0c;值得反复阅读。主要分为基础类和进阶类书籍&#xff0c;大多都是理论和实践相结合的书籍&#xff0c;编程实践是抓手,让知识和基础理论变扎实。基础书籍《信号…...

nginx配置ssl实现https访问

文章目录一、介绍二、创建证书1、OpenSSL创建自签名密钥和证书三、nginx配置四、开放端口一、介绍 nginx配置ssl证书&#xff0c;实现https访问&#xff0c;可以使用自签名SSL证书或者购买机构颁发的证书两种方式参考链接 https://blog.csdn.net/weixin_39198406/article/deta…...

JavaScript 语句

JavaScript 语句向浏览器发出的命令。语句的作用是告诉浏览器该做什么。JavaScript 语句JavaScript 语句是发给浏览器的命令。这些命令的作用是告诉浏览器要做的事情。下面的 JavaScript 语句向 id"demo" 的 HTML 元素输出文本 "Hello Dolly" &#xff1a;…...

将古老的ASP项目转换为PHP初探

ASP 是一种服务器端脚本语言&#xff0c;主要用于开发动态 Web 应用程序。ASP 可以在服务器上执行代码&#xff0c;并将结果返回给客户端浏览器&#xff0c;实现动态生成 Web 页面的功能。ASP 代码通常包含在 <% %> 标记中&#xff0c;以下是一个简单的 ASP 程序示例&…...

数据结构复习(七)模板类封装实现不带头结点的单链表

一、代码 二、总结 一、代码 #include<iostream> using namespace std;template<class T> struct ListNode {T _data;ListNode* next;ListNode(const T& data T()){_data data;next nullptr;}~ListNode(){next nullptr;} };template<class T> class…...

IDEA插件 RestfulTool插件——Restful服务开发辅助工具集

IDEA插件 RestfulTool插件——Restful服务开发辅助工具集 目录IDEA插件 RestfulTool插件——Restful服务开发辅助工具集1.插件介绍2.安装方式3.使用方法1.插件介绍 RestfulTool插件。一套 Restful 服务开发辅助工具集&#xff1a; 提供了一个 Services tree 的显示窗口 双击 …...

2023年全国最新会计专业技术资格精选真题及答案1

百分百题库提供会计专业技术资格考试试题、会计考试预测题、会计专业技术资格考试真题、会计证考试题库等&#xff0c;提供在线做题刷题&#xff0c;在线模拟考试&#xff0c;助你考试轻松过关。 11.下列各项中&#xff0c;影响企业利润表“利润总额”项目的是&#xff08;&…...

Linux 配置RAID组

目录 配置RAID&#xff08;软件RAID&#xff09; 创建RAID组 RAID中出现坏盘如何操作 RAID 添加热备盘 删除RAID组 RAID所解决的问题 提升硬盘的I/O吞吐率 提高硬盘的读写能力 提高硬盘的安全性 进行备份 减少硬盘成本 RAID级别 存储RAID——RAID级别_静下心来敲木鱼的博…...

【2021/推荐/社交网络】Socially-Aware Self-Supervised Tri-Training for Recommendation

部分公式、图表和排版等显示可能异常,可在个人公众号(码农的科研笔记)进行全文免费阅读。 【2021/推荐/社交网络】Socially-Aware Self-Supervised Tri-Training for Recommendation 原文:https://dl.acm.org/doi/10.1145/3447548.3467340 源码:[伯乐 SEPT]、https://git…...

Django搭建个人博客Blog-Day06

展示所有文章Django提供的分页功能说明import os os.environ.setdefault(DJANGO_SETTINGS_MODULE, blog.settings.dev) import django django.setup() # 这个时候才有django的环境 所以导入django中的模块必须写在这句话的后面才有效 from articles.models import Articles #…...

DQL 多表查询

1、多表关系 一对多&#xff08;多对一&#xff09; 案例: 部门 与 员工的关系 关系: 一个部门对应多个员工&#xff0c;一个员工对应一个部门 实现: 在从表的一方建立外键&#xff0c;指向主表一方的主键 多对多 案例: 学生 与 课程的关系 关系: 一个学生可以选修多门课程&am…...

BUUCTF Reverse xor

题目&#xff1a;BUUCTF Reverse xor 一些犯傻后学到了新东西的记录 查壳&#xff0c;没壳&#xff0c;IDA打开 main函数很好理解&#xff0c;输入一个长度为33的字符串&#xff0c;1-32位与前一位异或后与global相等&#xff0c;则判定flag正确 找global 在strings window直…...

vite和esbuild/roolup的优缺点

esbuild 优点 基于go语言&#xff0c;go是纯机器码不使用 AST&#xff0c;优化了构建流程多线程并行 缺点 esbuild 没有提供 AST 的操作能力。所以一些通过 AST 处理代码的 babel-plugin 没有很好的方法过渡到 esbuild 中&#xff08;比如babel-plugin-import&#xff09;。…...

32-Golang中的map

Golang中的map基本介绍基本语法map声明的举例map使用的方式map的增删改查操作map的增加和更新map的删除map的查找map的遍历map切片基本介绍map排序map的使用细节基本介绍 map是key-value数据结构&#xff0c;又称为字段或者关联数组。类似其它编程语言的集合&#xff0c;在编程…...

LeetCode-384-打乱数组

1、列表随机 为了能够初始化数组&#xff0c;我们使用nums保存当前的数组&#xff0c;利用orignal保存初始化数组。为了实现等可能随机打乱&#xff0c;考虑到随机数本质上是基于随机数种子的伪随机&#xff0c;我们采用如下的方式实现等可能随机&#xff1a;我们将所有元素压…...

九龙证券|重大利好!期货公司打新再“解绑”:可直接参与首发网下配售!

时隔近7年&#xff0c;期货公司及其财物办理子公司参加首发证券网下询价和配售事务再次“解绑”。 2月17日&#xff0c;为适应全面实行股票发行注册制变革需求&#xff0c;中国证券业协会&#xff08;以下简称中证协&#xff09;发布《初次公开发行证券网下出资者办理规矩》&am…...

信号完整性设计规则之串扰最小化

本文内容从《信号完整性与电源完整性分析》整理而来&#xff0c;加入了自己的理解&#xff0c;如有错误&#xff0c;欢迎批评指正。 1. 对于微带线和带状线&#xff0c;保持相邻信号路径的间距至少为线宽的2倍。 减小串扰的一种方式就是增大线间距&#xff0c;使线间距等于线…...

网站相似度检测 站长/网站优化包括

9月24-25日&#xff0c;由Boolan主办的2021全球产品经理大会在北京金茂万丽饭店盛大召开&#xff01;本次大会不仅有硅谷产品教父、产品圣经《启示录》作者Marty Cagan发表主题演讲&#xff0c;同时还有来自腾讯、阿里、网易、快手、字节、百度、京东等多个领域的近40位产品专家…...

视频做网站背景/厦门百度关键词推广

JOL全称为Java Object Layout&#xff0c;是用来分析JVM中对象布局的工具&#xff0c;它可以帮我们在运行时计算某个对象的大小。 引入JOL依赖&#xff0c;如下&#xff1a; <!-- https://mvnrepository.com/artifact/org.openjdk.jol/jol-core --> <dependency>…...

扬州品牌网站设计/友链购买有效果吗

这本书是2016年8月出版的&#xff0c;一年半之后再看&#xff0c;虽然AI风口已过&#xff0c;但是由此延伸而来的概念正在引导出更深的内涵。 何谓大数据&#xff1f;作者的观点是体量大、维度高、及时性强。 为了说明数据的威力&#xff0c;书中举了许多例子。印象最深的一个是…...

法院网站管理系统源码/百度导航下载2022最新版官网

视频微课知识点一、四大发明四大发明是我们国家最伟大的文化成果。包括&#xff1a;造纸术、指南针、火药、活字印刷术。二、人物介绍蔡伦&#xff0c;字敬仲&#xff0c;桂阳郡宋阳(今湖南宋阳)人&#xff0c;生于东汉永平四年(公元61年)&#xff0c;卒于建光元年(公元121年)。…...

wordpress $show_date/友情链接交易购买

最近在做一个项目&#xff0c;其中用到了TabActivity&#xff0c;想截取OnKeyDown事件来提示用户退出程序在api lever 5以上有OnBackPressed重载函数&#xff0c;可以达到同样的效果。 但是我一直没有成功&#xff0c;调试程序发现&#xff0c;因为TabActivity压根没有获取我按…...

专业做外贸网站公司/什么是电商平台推广

插件主页: http://www.yhuan.com/ 求助帖&#xff0c;每帖必应 QQ交流群:74106519 加入QQ群&#xff0c; 4.0.1修复了4.0目前已知的所有BUG&#xff0c;以及以前版本一直未解决的问题。 2011/5/22 jQuery formValidator 4.0.1 ver 规范插件的命名&#xff1a;1、对插件所有函数…...