注册网站地址,互联网网站制作公司,制作演示网站,网站商城维护怎么做进程、线程、多线程相关总结
一、说说概念
1、进程#xff08;process#xff09;
狭义定义#xff1a;进程就是一段程序的执行过程。
广义定义#xff1a;进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元#xff0…进程、线程、多线程相关总结
一、说说概念
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 QueueAction _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 QueueAction();_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);QueueAction queueCopy;lock (_queue){queueCopy new QueueAction(_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));}}}