计算机基础:程序、进程、线程

进程、线程、多线程相关总结

一、说说概念

1、进程(process

狭义定义:进程就是一段程序的执行过程。

广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。

简单的来讲进程的概念主要有两点第一,进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。文本区域存储处理器执行的代码数据区域存储变量和进程执行期间使用的动态分配的内存堆栈区域存储着活动过程调用的指令和本地变量第二进程是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时,它才能成为一个活动的实体,我们称其为进程。

进程状态:进程有三个状态,就绪、运行和阻塞。就绪状态其实就是获取了除cpu外的所有资源(等待cpu资源),只要处理器分配资源就可以马上执行。就绪状态有排队序列什么的,排队原则不再赘述。运行态就是获得了处理器分配的资源,程序开始执行。阻塞态,当程序条件不够时候,需要等待条件满足时候才能执行,如等待i/o操作时候,此刻的状态就叫阻塞态。

2、程序

说起进程,就不得不说下程序。先看定义:程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念。而进程则是在处理机上的一次执行过程,它是一个动态的概念。这个不难理解,其实进程是包含程序的,进程的执行离不开程序,进程中的文本区域就是代码区,也就是程序。

3、线程

通常在一个进程中可以包含若干个线程,当然一个进程中至少有一个线程,不然没有存在的意义。线程可以利用进程所拥有的资源,在引入线程的操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位,由于线程比进程更小,基本上不拥有系统资源,故对它的调度所付出的开销就会小得多,能更高效的提高系统多个程序间并发执行的程度。

4、多线程

在一个程序中,这些独立运行的程序片段叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理”。多线程是为了同步完成多项任务,不是为了提高运行效率,而是为了提高资源使用效率来提高系统的效率。线程是在同一时间需要完成多项任务的时候实现的。

最简单的比喻多线程就像火车的每一节车厢,而进程则是火车。车厢离开火车是无法跑动的,同理火车也不可能只有一节车厢。多线程的出现就是为了提高效率。

二、说说区别

1、进程与线程的区别:

进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉所以多进程的程序要比多线程的程序健壮但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。

1) 简而言之,一个程序至少有一个进程,一个进程至少有一个线程.

2) 线程的划分尺度小于进程,使得多线程程序的并发性高。

3) 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。

4) 线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

5) 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。

三、说说优缺点

线程和进程在使用上各有优缺点:线程执行开销小,但不利于资源的管理和保护;而进程正相反。同时,线程适合于在SMP(多核处理机)机器上运行,而进程则可以跨机器迁移。

四、总结

入职第一天闲的无聊,参考下别人的总结自己也简单总结了下。知道以上的基本面试够用了,至于进程、线程的细节,底层构成,调度等问题是操作系统的东西。我就不详述了。

五、实例

1、多线程写日志,涉及到单例模式,异步写

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;namespace ConsoleApplication1
{class Program{static void Main(string[] args){Thread t1 = new Thread(Working);t1.Name = "Thread1";Thread t2 = new Thread(Working);t2.Name = "Thread2";Thread t3 = new Thread(Working);t3.Name = "Thread3";// 依次启动3个线程。t1.Start();t2.Start();t3.Start();Console.ReadKey();}// 每个线程都同时在工作static void Working(){// 模拟1000次写日志操作for (int i = 0; i < 1000; i++){//  异步写文件logger.Write(Thread.CurrentThread.Name + " writes a log: " + i + ", on " + DateTime.Now.ToString() + ".\n");}// 做一些其它的事件for (int i = 0; i < 100; i++) { }}}public  class logger{private Queue<Action> _queue;//写日志线程private Thread _loggingThread;//信号器private ManualResetEvent _hasNew;// 使用单例模式,保持一个Logger对象private static readonly logger _logger = new logger();private static logger GetInstance(){/* 不安全代码lock (locker) {if (_logger == null) {_logger = new Logger();}}*/return _logger;}private logger(){_queue = new Queue<Action>();_hasNew = new ManualResetEvent(false);_loggingThread = new Thread(Process);_loggingThread.IsBackground = true;_loggingThread.Start();}private void Process(){while (true){//等待信号,阻塞线程_hasNew.WaitOne();//接收到信号,信号关闭,重置_hasNew.Reset();Thread.Sleep(100);Queue<Action> queueCopy;lock (_queue){queueCopy = new Queue<Action>(_queue);_queue.Clear();}foreach (var action in queueCopy){action();}}}private void WeiteLog(string content){lock (_queue){_queue.Enqueue(() => File.AppendAllText("log.txt", content));}_hasNew.Set();}public static void Write(string content){Task.Run(() => GetInstance().WeiteLog(content));}}}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/553930.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Win7系统局域网抢网速的方法

Win7旗舰版局域网怎么抢占网速?最近有很多使用Win7系统的用户问小编&#xff0c;反应自己在局域网下玩游戏的时候很卡&#xff0c;因为很多人在用网络&#xff0c;导致自己的游戏、看电影很不爽。那么遇到这样的问题怎么办呢?下面&#xff0c;就给大家介绍Win7系统局域网抢网…

win7打印机提示无法保存设置错误0x00006cc的处理方法

win7允许快速连接共享打印机&#xff0c;这让用户少了不少设置烦恼&#xff0c;那如果在打印机的快速设置中提示错误0x00006cc代码要怎么解决呢?快跟小编一起来看看win7打印机提示无法保存设置错误0x00006cc的处理方法吧。 win7打印机提示无法保存设置错误0x00006cc的处理方法…

磁卡、ID卡、IC卡、M1卡、CPU卡的理解区分

一、磁卡 磁卡是在一张塑料片上均匀地涂布上一层磁性微 粒材料制成的。 刚生产出来的磁卡上面的磁性微粒是不显磁性的&#xff0c; 这样的磁卡就象一张白纸&#xff0c; 人们需要在磁卡里输入一些信息才能使用。 那么信息是怎样被记录的呢&#xff1f;这就需要纪录磁头 的帮助…

U盘装win7系统出现question(1808)的原因与解决方法

U盘装系统是很多用户和电脑城装机员的首选&#xff0c;这种方法简单快捷&#xff0c;一学就会。但也有用户在安装系统过程中会碰到一些问题&#xff0c;question(1808)便是常见问题之一。这是什么原因呢?下面我们就一起来看看U盘装win7系统出现question(1808)的原因与解决方法…

软考计算机基础:存储系统

软考计算机存储系统笔记&#xff1a; 存储器分类&#xff1a; 1、按存储位置分为内存和外存&#xff1b; 2、按存储材料分为磁存储&#xff08;使用磁存储介质&#xff09;、半导体存储&#xff08;分为双极型和MOS型&#xff0c;根据数据是否需要刷新可以分为静态SRAM存储器…

Win7系统组策略怎么打开 打开组策略的几种方法

在很多情况下&#xff0c;我们都会用到组策略编辑器来对电脑进行一些高级的设置&#xff0c;组策略的作用就是将管理员为用户和计算机定义并控制程序、网络资源及操作系统行为的主要工具。那么&#xff0c;在Win7系统下&#xff0c;我们要怎么打开组策略呢?下面&#xff0c;小…

vscode统计代码行数,前端开发配置、快捷键使用

1、统计代码行数 使用场景是项目年终统计行数。 实现&#xff1a;在需要统计得文件夹右键“在文件夹中查找“ &#xff0c;后输入筛选得正则表达式 ^b*[^:b#/].*$ (注意右边小图标都点亮) 这里顺便将自己使用vscode进行前端开发环境配置归纳一下&#xff0c;便于自己以后快速…

360下载器怎么打开 360下载器使用方法

360下载器怎么打开?360下载器是360安全浏览器极速浏览器中的一个下载组件&#xff0c;组件中包含了迅雷下载支持&#xff0c;所以下载文件的速度比使用ie自带的下载器会快很多。不少刚接触360安全浏览器的用户反应在使用360安全浏览器下载文件程序之后无法找到下载器所在位置&…

vue-cli打包后怎么修改服务器地址实践有效

前言&#xff1a;公司vue项目使用 npm run build 打包生成dist文件部署后&#xff0c;当需要修改服务器端地址时候就又需要重新配置url并打包部署&#xff0c;为简化部署测试工作&#xff0c;想实现通过修改服务器地址的配置文件来实现修改打包后的项目服务器地址。 项目基于vu…

干净高效的搜索引擎

找一个干净好用的搜索引擎&#xff0c;好文转载备忘 为什么不用百度搜索引擎&#xff0c;估计一百个人会有一百个理由。 百度最让人诟病的还是它的竞价排名&#xff0c;其实要赚钱无可厚非&#xff0c;但这吃相……前几天看到知乎上有人发了张百度和谷歌搜索的对比图&#xf…

手机360浏览器怎么清空历史记录 手机360浏览器历史记录清空方法分享

任何一款浏览器产品在使用一段时间后都会出现历史记录&#xff0c;手机360浏览器自然也不能例外。而这些历史记录如果长期不清理的话&#xff0c;则导致手机越来越卡!那么&#xff0c;手机360浏览器怎么清空历史记录?不清楚具体操作的朋友&#xff0c;可以参考一下小编分享的方…

vue使用class添加动态类

<template><d2-container><h3>class使用测试页面</h3><p :class"1 < 2 ? red-font : blue-font">使用三元表达式;</p><p :class"[red-font,blue-bg]">使用数组包含多个类名;</p><p :class"{r…

守塔人奥列

“在这个世界里&#xff0c;事情不是上升&#xff0c;就是下降。不是不降&#xff0c;就是上升!我现在不能再进一步向上爬了。上升和下降&#xff0c;下降和上升&#xff0c;大多数的人都有这一套经验。归根结底&#xff0c;我们最后都要成为守塔人&#xff0c;从一个高处来观察…

vue图片加载失败使用默认图片,el-image支持懒加载,自定义占位、加载失败等

<template><d2-container><h3>image加载失败使用默认图片</h3><img src""alt"test1.png":onerror"errorImg" /><hr><h3>el-image懒加载、大图预览、加载占位、加载失败、</h3><div class&qu…

win7系统开机蓝屏提示hardware Monitor的解决方法

电脑蓝屏是使用过程中比较常见的问题&#xff0c;出现这种状况&#xff0c;系统一般会将错误信息显示在屏幕上&#xff0c;我们只需根据系统错误代码提示&#xff0c;找出问题根源&#xff0c;再对症下药就可以了。下面小编就来教大家win7系统开机蓝屏提示hardware Monitor的解…

el-table表格在表头和数据行添加图标、处理数据

通过header插槽自定义表头&#xff1a; <template slot"header" slot-scope"scope">... </template>可以通过scope.row.columnName 获取单元项数据进行数据处理&#xff1a; <template slot-scope"scope"><span :class&…

U盘装win7系统出现question(1808)的解决方法

U盘装系统是很多用户和电脑城装机员的首选&#xff0c;这种方法简单快捷&#xff0c;一学就会。但也有用户在安装系统过程中会碰到一些问题&#xff0c;question(1808)便是常见问题之一。这是什么原因呢?下面我们就一起来看看U盘装win7系统出现question(1808)的解决方法吧。 …

js数组遍历和对象遍历

针对js各种遍历作一个总结分析&#xff0c;从类型用处&#xff1a;分数组遍历和对象遍历&#xff1b;还有性能&#xff0c;优缺点等。 JS数组遍历&#xff1a; 1&#xff0c;普通for循环&#xff0c;经常用的数组遍历 var arr [1,2,0,3,9];for ( var i 0; i <arr.length…

Win7打印时文档被挂起的解决方法

在很多时候我们都会需要打印文档&#xff0c;但是打印过程中会有一些问题出现&#xff0c;如打印文档里无法打印&#xff0c;右下角显示文档被挂起&#xff0c;那么Win7打印时文档被挂起怎么解决呢&#xff0c;下面小编和大家分享下具体Win7打印时文档被挂起的解决方法。 原因…

windows下升级nodejs版本

使用electronvue创建项目时提示node.js版本不能低于10&#xff0c;记录windows下升级nodejs方式 1、Windows下是没有n模块并不支持 “npm install -g n” “n latest” 命令的方式更新版本&#xff1b; 2、解决方法&#xff1a;cmd命令窗口使用 where node 命令查看之前的n…